Eclipse/GDB:如何在硬件重置后设置自动断点?
我正在使用一个带有Eclipse和GDB的自建嵌入式IDE,这与本网站所描述的非常相似: 当我使用OpenOCD或任何其他调试配置(如SEGGER JLink)闪存我的STM32F407硬件时,它在main.c的第一行中断。没什么不寻常的Eclipse/GDB:如何在硬件重置后设置自动断点?,c,embedded,eclipse-cdt,stm32,openocd,C,Embedded,Eclipse Cdt,Stm32,Openocd,我正在使用一个带有Eclipse和GDB的自建嵌入式IDE,这与本网站所描述的非常相似: 当我使用OpenOCD或任何其他调试配置(如SEGGER JLink)闪存我的STM32F407硬件时,它在main.c的第一行中断。没什么不寻常的 // ----- main() --------------------------------------------------------------- int main(void) { //Initialization, if unsucc
// ----- main() ---------------------------------------------------------------
int main(void)
{
//Initialization, if unsuccessful -> quit
if (!INIT_bInit())
return 0;
//infinite Loop
while (0x1337)
{
//Nothing
}
//Must not end here
return 0;
}
//main()
这可能是由于Eclipse OpenOCD调试控制台中的行为设置造成的
但是,我也希望有一个自动断点mecahnism,它可以在出现错误时停止程序
- 硬断层还是硬断层
- 硬件重置
-Henni要分析您的硬故障,您可以编写更复杂的处理程序,cf:
prvGetRegistersFromStack()
的实现如下所示prvGetRegistersFromStack()
将寄存器值从堆栈复制到C变量中,然后放入循环中。命名变量是为了指示它们所持有的寄存器值。其他寄存器在故障发生后不会更改,可以直接在调试器的CPU寄存器窗口中查看
还包括cf
无法检测硬件重置,因为它们会擦除整个内存。再次启动时,您可以找到导致硬件重置的原因,这在中。可能将结果存储在下一次硬件重置期间未擦除的某个永久内存上我发现由于NYE假期,我还没有正式解决我的问题:) 多亏了,我才能够解决由GDB控制台选项导致的预加载断点的初始问题 总而言之: 发布的最后一个链接解决了OpenOCD版本 对于SEGGER j-link来说,它是
break main
break Default_FaultHandler
可以在Eclipse调试配置(在启动选项卡中)中为GDB添加这两个选项,如下所示
工作起来很有魅力
谢谢 如果要在suspeiciuus函数或处理程序中放置断点,只需使用
__BKPT();
或者如果您不使用ARM CMSIS
#define __BKPT(value) __ASM volatile ("bkpt "#value)
例如:
void Default_FaultHandler(void)
{
__BKPT();
while();
}
当这个内在函数被命中时,调试器将接受控制:)Ralf,Dankeschoon,但是它更多的是在这些事件发生时自动中断,而不是分析在故障/事件的确切时刻发生了什么错误。因此,问题应该更多地指向以下问题:如何通过以太代码或调试选项/配置告诉GDB/Eclipse他们将破坏Eclipse并停止程序!?你是说硬件断点,这听起来很有希望。我稍后再查。Dankeregarding:
如果(!INIT_bInit())返回0
通常,返回0表示成功。通常,返回1(或-1)表示失败。在发布的代码中,成功退出和失败退出都返回0建议将第一个return
语句替换为:exit(exit\u failure)代码>注意exit()
和exit_FAILURE
通过以下语句公开:#include
这是一种非常好的方法,因为您浪费了硬件断点,而且断点的数量非常有限。只需放置\uuubkpt()
内部\uuubkpt()
不适用于J-Link GDB,并且限制为255个。在某些情况下,它可能适用于硬件断点较少的OpenOCD。\uu BKPT()不适用于J-Link GDB。
这不是事实。我使用J-Link已经很多年了。你只是做错了什么。在这种情况下,gdbserver的类型并不重要。代码中bkpt指令的数量不受限制(不要被可选参数愚弄-它不是必需的,并且断点参数不必区分)。JLink“unlimited”bereakpoints只是放在代码中的bkpt指令。硬件断点受Cortex core限制,而不是调试软件。一般来说,你写的东西都不对。老实说,我不太清楚。我记得以前试过。它不起作用,我发现这个论坛帖子,这导致我没有进一步尝试:。不管SEGGER是否实现了BKPT()兼容性,我都不知道
void Default_FaultHandler(void)
{
__BKPT();
while();
}