2011-06-18 11 views
4

私はLinux上でaddr2lineにを使用し、上記ライン82ADDR2LINEは、1つの番号の行番号を報告しますか?

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

をテストするために意図的にセグメンテーションフォールトが発生し、次のコードを持っていますが、「自由なダブル」を行い1、ダンプを引き起こすものです。..しかし、私がコマンドラインでADDR2LINEを使用すると、エラーの原因となった行番号が83ではなく82として報告されますか?

ここに何か不足していますか? ADDR2LineはNEXT行について言及していますか? HELO用

おかげで

リントン

+0

おそらくテキストエディタが0から始まるでしょうか? –

+3

または、アドレスがコール命令のアドレスではなく、エラーがキャッチされたときにスタック上のリターンアドレスである可能性があります。 – Dipstick

+0

2番目のfree()の後に別の文(行)を追加してみてください。おそらく、プログラムが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); 
} 

()

signal(SIGSEGV, sig_segv); 

のみ正しい理由/説明は、はい、それはフリー機能でクラッシュをしています。しかし戻り値では、それは82行目と83行目の開始を意味します。