所以我有一个应用程序需要用 GDBStub 进行调试。我沿着 gdb 存根编译了我的应用程序,然后出现了致命的异常 3。我反编译了精灵以找到异常的位置,它似乎在gdbstub_init本身
致命异常 (3):
epc1=0x4026ffc4
EPC2=0x00000000
epc3=0x402213bb
epcvaddr=0x401010b8
depc=0x00000000
retn_add=0x4027084c
地址 4026ffc4 是这个
静态 void ATTR_GDBINIT install_excep
tions() {
将user_fatal_exception_handler替换为跳转到我们自己的代码
int *ufe=(int*)user_fatal_exception_handler;
这种混乱编码为相对跳转指令user_fatal_exception_handler
*ufe=((((int)gdbstub_user_exception_entry-(int)user_fatal_exception_handler)-4)<<6)|6;
4026ffb0: ffff41 l32r a4, 4026ffac
4026ffb3: fffd21 l32r a2, 4026ffa8
4026FFB6:FCC222 ADDI A2、A2、-4
4026FFB9:C02240 子 A2、A2、A4
4026FFBC:1122A0 SLLI A2、A2、6
4026FFBF:630C MOVI.N A3、6
4026FFC1:202230 或 A2、A2、A3
4026FFC4:005422 S16i A2、A4、0
4026FFC7:F52020 分机 A2、A2、16、16
4026FFCA:015422 S16i A2、A4、2
4026FFCD:F00D ret.n
我意识到 gdb 正在尝试修改 SDK 中user_fatal_exception_handler的 IRAM 地址。
但我不明白为什么它会在这一点上抛出