乐鑫技术交流
直播中

蒲泛粟

7年用户 954经验值
私信 关注
[问答]

用GDBStub进行调试遇到异常的原因?

所以我有一个应用程序需要用 GDBStub 进行调试。我沿着 gdb 存根编译了我的应用程序,然后出现了致命的异常 3。我反编译了精灵以找到异常的位置,它似乎在gdbstub_init本身

致命异常 (3):
epc1=0x4026ffc4
EPC2=0x00000000
epc3=0x402213bb
epcvaddr=0x401010b8
depc=0x00000000
retn_add=0x4027084c

地址 4026ffc4 是这个

静态 void ATTR_GDBINIT install_exceptions() {
将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 地址。
但我不明白为什么它会在这一点上抛出
                                                                                                                                                

回帖(1)

王艳

2024-7-10 17:50:18
根据您提供的信息,您在使用GDBStub进行调试时遇到了致命的异常3。首先,让我们了解一下可能的原因和解决方案。

1. **代码问题**:可能是您的应用程序代码中存在问题,导致异常。检查您的代码,特别是与异常处理相关的部分,确保没有逻辑错误或未处理的异常。

2. **GDBStub集成问题**:确保您正确地集成了GDBStub。检查您的编译选项,确保使用了正确的宏定义和编译器选项。例如,您可能需要定义`__GDB_STUB__`宏,并使用适当的编译器选项来启用GDBStub。

3. **异常处理函数问题**:您提到的`install_exceptions`函数似乎有问题。请确保您正确地实现了用户致命异常处理函数,并正确地替换了`user_fatal_exception_handler`。此外,检查您的跳转指令是否正确,以及目标地址是否有效。

4. **内存问题**:异常3通常与内存访问错误有关。检查您的应用程序是否存在内存泄漏、越界访问或其他内存问题。使用内存检查工具(如Valgrind)来帮助诊断这些问题。

5. **硬件问题**:虽然不太可能,但硬件问题也可能导致异常。确保您的开发环境稳定,没有硬件故障。

为了解决这个问题,您可以尝试以下步骤:

1. **检查代码**:仔细检查您的代码,特别是与异常处理和GDBStub集成相关的部分。

2. **使用调试器**:使用GDB或其他调试器逐步执行您的代码,观察异常发生的位置和原因。

3. **简化问题**:尝试创建一个简单的示例程序,只包含GDBStub集成和异常处理。如果示例程序可以正常工作,那么问题可能在于您的应用程序代码。

4. **更新工具链**:确保您的编译器、链接器和其他工具链组件是最新的,以避免潜在的兼容性问题。

5. **寻求帮助**:如果您仍然无法解决问题,可以在相关论坛或社区寻求帮助,提供详细的错误信息和代码片段。

希望这些建议能帮助您解决问题。祝您调试顺利!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分