我正在玩glibc's backtrace()
,我似乎无法让它在我的Raspberry Pi上正常工作.一切都没有警告编译,但backtrace()
返回0作为存储的帧数.完全相同的代码确实在x86_64(Debian stable)上产生了回溯,backtrace()
返回6帧:
/*test.c*/ #include#include #include void foo(void) { void *stack[10]; int n = backtrace(stack, 10); fprintf(stderr, "Last %d frames:\n", n); backtrace_symbols_fd(stack, n, STDERR_FILENO); } void bar(void) { foo(); } void baz(void) { bar(); } int main(void) { printf("Hello, Backtrace\n"); baz(); return 0; }
#Makefile CFLAGS=-Wall -Wextra -g LDFLAGS=-rdynamic
x86_64上的输出(gcc (Debian 4.7.2-5) 4.7.2
使用GNU libc6:amd64 2.13-38+deb7u1
):
Hello, Backtrace Last 6 frames: ./test(foo+0x19)[0x4009a5] ./test(bar+0x9)[0x4009e5] ./test(baz+0x9)[0x4009f0] ./test(main+0x13)[0x400a05] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xfd)[0x7f9286ddbead] ./test[0x4008a9]
Raspberry Pi上的输出(gcc (Debian 4.6.3-14+rpi1) 4.6.3
使用GNU libc6:armhf (2.13-38+rpi2+deb7u1)
):
Hello, Backtrace Last 0 frames:
我已经验证Raspberry Pi上编译的可执行文件正在将帧指针和链接寄存器存储到堆栈中.objdump -d test
摘抄:
0000882c: 882c: e92d4800 push {fp, lr} 8830: e28db004 add fp, sp, #4 8834: ebffffe3 bl 87c8 8838: e8bd8800 pop {fp, pc} 0000883c : 883c: e92d4800 push {fp, lr} 8840: e28db004 add fp, sp, #4 8844: ebfffff8 bl 882c 8848: e8bd8800 pop {fp, pc}
我在论坛或Stack Overflow上找不到这样的东西.难道我做错了什么?我没有检查过什么?