GDB 和 OpenOCD:输出所有执行的函数
GDB and OpenOCD: output all executed functions
目前,我正在调试 STM32F4 MCU(Nucleo 板),现在我的任务是了解在执行流程中以某种方式调用的所有函数。当然,对于 OpenOCD 和 GDB,我已经可以在目标暂停时看到回溯,但实际上,它不能反映固件的完整历史记录 运行。此外,就 C 调用堆栈而言,我认为有一些硬件 ISR 没有 "parents"。
简化示例。假设我们有这样的来源:
#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()
...
那么有可能以任何方式(或至少类似)吗?
尝试启动程序 "under" gdb。
然后这样说:
rbreak .
commands
frame
cont
end
这应该为所有函数设置一个断点(请参阅 rbreak 以了解如何在某些模块中有选择地在函数上设置断点),并且 运行 每次命中时 frame+continue。
目前,我正在调试 STM32F4 MCU(Nucleo 板),现在我的任务是了解在执行流程中以某种方式调用的所有函数。当然,对于 OpenOCD 和 GDB,我已经可以在目标暂停时看到回溯,但实际上,它不能反映固件的完整历史记录 运行。此外,就 C 调用堆栈而言,我认为有一些硬件 ISR 没有 "parents"。
简化示例。假设我们有这样的来源:
#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()
...
那么有可能以任何方式(或至少类似)吗?
尝试启动程序 "under" gdb。
然后这样说:
rbreak .
commands
frame
cont
end
这应该为所有函数设置一个断点(请参阅 rbreak 以了解如何在某些模块中有选择地在函数上设置断点),并且 运行 每次命中时 frame+continue。