2011-06-18 25 views
4

我在Linux上使用ADDR2LINE並有產生分割故障特意測試ADDR2LINE報告1號碼的行號?

79 free(var1); 
80 
81 printf("Thread end...\n"); 
82 free(var1); 
83 } 

82線以下代碼上面是一個沒有「雙自由」和引起轉儲一個.. ...但是,當我在命令行上使用ADDR2LINE時,它會報告導致錯誤的行號爲83而不是82?

我在這裏錯過了什麼嗎? ADDR2Line是否提到了下一行?

感謝直升機

林頓

+0

可能您的文本編輯器在0處開始行? –

+3

或者該地址可能不是調用指令的地址,而是捕獲錯誤時棧中的返回地址。 – Dipstick

+0

嘗試在第二個空閒()後添加另一個語句(行)。當從函數中返回*而不是在運行free()(這將解釋行號)時,程序可能會崩潰。另一個猜測可能是編譯後編輯了文件。 – nimrodm

回答

1

ADDR2LINE確實給了它墜毀的行號,而不是下一個。 嘗試在main()附近添加此代碼以獲取最後地址的回溯並將它們傳遞給addr2line ..請參閱獲得的內容。

void sig_segv(int signo) 
{ 
// Generate backtrace 
void *addresses[40]; 
char **strings; 
int c = backtrace(addresses, 40); 
strings = backtrace_symbols(addresses,c); 
printf("backtrace returned: %d\n", c); 
for (int i = 0; i < c; i++) { 
    std::cout << strings[i] << std::endl; 
} 
exit(1); 
} 

裏面的main()

signal(SIGSEGV, sig_segv); 

的唯一正確的理由/解釋即是它的免費功能崩潰。但是在返回值處,因此意味着第82行的結尾和第83行的開始。