4
我在玩glibc的backtrace()
,我似乎無法讓它在我的Raspberry Pi上正常工作。沒有任何警告編譯的所有東西,但backtrace()
返回0作爲存儲的幀數。完全相同的代碼不會產生在x86_64(Debian的穩定)回溯,與backtrace()
返回6幀:On Raspberry Pi,backtrace()返回0幀
/*test.c*/
#include <stdio.h>
#include <execinfo.h>
#include <unistd.h>
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]
輸出上樹莓PI(gcc (Debian 4.6.3-14+rpi1) 4.6.3
與GNU libc6:armhf (2.13-38+rpi2+deb7u1)
):
Hello, Backtrace
Last 0 frames:
我已驗證上樹莓裨已編譯的可執行被存儲幀指針和鏈接寄存器到堆棧中。 objdump -d test
摘錄:
0000882c <bar>:
882c: e92d4800 push {fp, lr}
8830: e28db004 add fp, sp, #4
8834: ebffffe3 bl 87c8 <foo>
8838: e8bd8800 pop {fp, pc}
0000883c <baz>:
883c: e92d4800 push {fp, lr}
8840: e28db004 add fp, sp, #4
8844: ebfffff8 bl 882c <bar>
8848: e8bd8800 pop {fp, pc}
我還沒有發現在論壇上或堆棧溢出這樣的事。難道我做錯了什麼?我沒有檢查什麼?
太棒了!非常感謝你:) – laindir
啓用這個選項,也沒有在回溯函數中產生棧幀,我使用的是freescale imx6 ARM。 – buddingspacer