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

Debugging GDB和OpenOCD:输出所有执行的函数,debugging,gdb,stm32f4,openocd,Debugging,Gdb,Stm32f4,Openocd,目前,我正在调试STM32F4 MCU(核子板),现在我的任务是了解在执行流程中以某种方式调用的所有函数。当然,使用OpenOCD和GDB,我已经可以看到目标暂停时的回溯,但实际上,它不能反映固件运行的完整历史。此外,我认为有些硬件ISR在C调用堆栈方面没有“父级” 简化的例子。假设我们有这样一个来源: #include "math.h" ISR tick_10ms() { asm("nope"); } void foo(double x) { double y = sin(

目前,我正在调试STM32F4 MCU(核子板),现在我的任务是了解在执行流程中以某种方式调用的所有函数。当然,使用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时,我希望看到这样的东西(实时或暂停-无所谓):

那么,是否有可能以任何方式(或至少类似的方式)启动程序?

尝试在“gdb”下启动程序

然后说:

rbreak .
commands
frame
cont
end

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

我认为这是桌面应用程序的一个很好的解决方案,不幸的是,由于硬件断点数量有限,因此不适用于STM32F4。对于我的MCU(通过OpenOCD):
Info:stm32f4x.cpu:硬件有6个断点,4个观察点。
。我的程序太大,无法完全存储在RAM中(我使用第三方库),所以是的,它在闪存中。
rbreak .
commands
frame
cont
end