2017-08-25 445 views
-1

這是我的代碼:addr2line打印 「??:0」 即使我用`GCC -g`

/* backtrace_foo1.c */ 
#include <execinfo.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define BACKTRACE() \ 
do {\ 
    void *array[20];\ 
    size_t size;\ 
    char **strings;\ 
    size_t i;\ 
    size = backtrace(array, 20);\ 
    strings = backtrace_symbols(array, size);\ 
    for (i = 0; i < size; i++) {\ 
     printf ("%s\n", strings[i]);\ 
    }\ 
    free (strings);\ 
} while(0) 

void func1() 
{ 
    BACKTRACE(); 
} 

void func() 
{ 
    func1(); 
} 

int main(int argc, char **argv) 
{ 
    func(); 
    return 0; 
} 

我通過gcc -g -rdynamic編制,並得到

./a.out( func1的+ 0x1F的)[0x400905]

./a.out(func+0xe)[0x40097a]

./a.out(main+0x19)[0x400996]

/lib64/libc.so.6(__libc_start_main+0xfd)[0x318ae1ecdd]

./a.out()[0x4007f9]

然後我使用addr2line -e ./a.out -f 0x4007f9,我得到

_start

??:0

這是我的平臺

gcc版本5.3.0(GCC)

的Linux 3.10.0_1-0-0-8

+0

對於將來的問題,請[閱讀關於如何提出好問題](http://stackoverflow.com/help/how-to-ask)。並且不要忘記實際*要求*一個。 –

回答

3

我真的不應該回答這個問題,因爲你真的不有問題或陳述的問題。但有時我感覺不錯...

雖然您編寫的代碼將使用main函數開始執行,但實際起始點在此之前的某個位置。有啓動代碼,將初始化stdio系統(stdin,stdout等)並初始化其他東西。此啓動代碼然後像任何其他功能一樣調用您的main函數。

「問題」是啓動代碼實際上不是代碼的一部分,它通常是前端程序鏈接您的程序的預編譯對象文件。並且該目標文件可能沒有任何類型的調試信息,因此您無法獲取有關它的任何位置信息。

+1

我準備錘這個作爲一個騙局https://stackoverflow.com/questions/7648642/how-to-use-addr2line-command-in-linux但它看起來對我來說你的答案不同。既然你對這個問題有了更多的瞭解,你可以用你的判斷來判斷它是否是愚蠢的。 – bolov

+1

@bolov在這個問題中的問題真的是一樣的,但問題是不同的。該問題詢問如何使用'addr2line'而不詢問爲什麼不能獲得信息,並且答案遵循這條線。這個問題(我認爲)是爲什​​麼'addr2line'沒有提供任何信息。 –