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

时间:2018-03-20 22:09:46

标签: debugging gdb stm32f4 openocd

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

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

#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 个答案:

答案 0 :(得分:1)

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

然后说出类似的话:

rbreak .
commands
frame
cont
end

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