2014-07-11 56 views
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} 

我還沒有發現在論壇上或堆棧溢出這樣的事。難道我做錯了什麼?我沒有檢查什麼?

回答

9

該應用程序必須編譯爲-funwind-tables才能使backtrace()在ARM上工作。

+0

太棒了!非常感謝你:) – laindir

+0

啓用這個選項,也沒有在回溯函數中產生棧幀,我使用的是freescale imx6 ARM。 – buddingspacer