GDB 和 OpenOCD:输出所有执行的函数

Posted

技术标签:

【中文标题】GDB 和 OpenOCD:输出所有执行的函数【英文标题】:GDB and OpenOCD: output all executed functions 【发布时间】:2018-08-29 21:37:23 【问题描述】:

目前,我正在调试 STM32F4 MCU(Nucleo 板),现在我的任务是了解在执行流程中以一种或另一种方式调用的所有函数。当然,使用 OpenOCD 和 GDB,我已经可以在目标暂停时看到回溯,但实际上,它不能反映固件运行的完整历史记录。此外,就 C 调用堆栈而言,我认为有些硬件 ISR 没有“父级”。

简化示例。假设我们有这样的来源:

#include "math.h"

ISR tick_10ms() 
    asm("nope");


void foo(double x) 
    double y = sin(x);


int bar(int a, int b, int c) 
    foo((double)(a-b+c));
    return 0;


void main() 
    foo(3.14);
    int z = bar(1, 2, 3);

    while (1) 

当我们用它对 MCU 进行编程时,我希望看到类似的东西(实时或暂停 - 没关系):

main()
  foo(3.14)
    sin(3.14)
  bar(1, 2, 3)
    foo(2.0)
      sin(2.0)
tick_10ms()
tick_10ms()
tick_10ms()
...

那么有没有可能以任何方式(或至少类似)?

【问题讨论】:

【参考方案1】:

尝试“在”gdb 下启动您的程序。

然后说:

rbreak .
commands
frame
cont
end

这应该给所有函数设置一个断点(参见 rbreak 了解如何选择性地在某些模块中的函数上设置一个断点),并在每次命中时运行 frame+continue。

【讨论】:

我认为这对于桌面应用程序来说是一个很好的解决方案,但不幸的是,由于硬件断点数量有限,它不适用于 STM32F4。对于我的 MCU,它是(通过 OpenOCD):Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints 我的程序太大而无法完全存储在 RAM 中(我使用 3rd-party 库)所以是的,它在 FLASH 中。

以上是关于GDB 和 OpenOCD:输出所有执行的函数的主要内容,如果未能解决你的问题,请参考以下文章

用于 Flash 和 Ram 调试的 STM32 GDB/OpenOCD 命令和初始化

arm-none-eabi-gdb 和 openocd:对偏移量查询、qOffsets 的错误响应?

json VSCodeでGDB + OpenOCD的デバッグ

STM32 OpenOCD调试

OpenOCD的概念,安装和使用

w601 开发板+ rt-thread+gcc+gdb使用eclipse 进行在线调试的说明