Eclipse/GDB:如何在硬件重置后设置自动断点?

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

我正在使用一个带有Eclipse和GDB的自建嵌入式IDE,这与本网站所描述的非常相似:

当我使用OpenOCD或任何其他调试配置(如SEGGER JLink)闪存我的STM32F407硬件时,它在main.c的第一行中断。没什么不寻常的

// ----- 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,它可以在出现错误时停止程序

  • 硬断层还是硬断层
  • 硬件重置
由于我的软件通常基于带有void函数指针的自动任务,我想知道何时由于要调用的函数出现问题而出现硬故障

但到目前为止,我唯一注意到硬故障的时候是在我暂停程序一段时间后,检查它是否出现在我的(自定义)默认\u FaultHandler(它实现了硬故障\u处理程序和其他处理程序)中

硬件重置也是如此。没有指示,甚至没有在main.c自动(重新)中断

我从基于eclipse的IDE(如NXP的MCUXpresso或Atolic Studio)中了解到,在调用任何故障处理程序或硬件重置时,都有可能自动中断程序

关于如何使用我自己构建的OpenOCD/Eclipse解决方案自动化调试行为,有什么想法吗

我们热烈欢迎你的帮助

干杯


-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();
}