【发布时间】:2019-04-19 05:04:03
【问题描述】:
我在 ARM 处理器上运行了 FreeRTOS,但我没有可用的 dump_stack()...我正在尝试检查调用链并且严重丢失了 dump_stack()...我在谷歌上搜索了一下,然后使用 GCC(/GDB) _Unwind_Backtrace() 实用程序找到了接近我想要的东西,但它只打印 stack_frame 的地址。它不提供对有意义符号的映射(如函数名称)。非常感谢任何帮助。
#include <stdio.h>
#include <unwind.h>
#include <stdint.h>
static _Unwind_Reason_Code unwind_backtrace_callback(struct _Unwind_Context* context, void* arg)
{
uintptr_t pc = _Unwind_GetIP(context);
if (pc) {
printf("unwind got pc ...0x%x\n", pc);
}
return _URC_NO_REASON;
}
ssize_t unwind_backtrace()
{
_Unwind_Reason_Code rc = _Unwind_Backtrace(unwind_backtrace_callback, 0);
return rc == _URC_END_OF_STACK ? 0 : -1;
}
void func_1()
{
int ret = unwind_backtrace();
printf("unwind_backtrace return ...%d\n", ret);
}
void func_2()
{
func_1();
}
int main()
{
func_2();
return 0;
}
Result:
unwind got pc ...0x40076b
unwind got pc ...0x400796
unwind got pc ...0x4007bd
unwind got pc ...0x400819
unwind got pc ...0x67314b15
unwind got pc ...0x400649
unwind_backtrace return ...0
【问题讨论】: