web-dev-qa-db-ja.com

GDBに、segfaultの原因となったアドレスを教えてもらうにはどうすればよいですか?

プログラムがNULLポインタまたは古いメモリにアクセスしているかどうかを知りたい。

バックトレースは次のようになります。

プログラムがシグナルSIGSEGVを受信しました。セグメンテーション違反。
 [スレッド0x2b0fa4c8(LWP 1333)への切り替え] 。](gdb)bt 
#0 0x299a6ad4 in pthread_mutex_lock()from /lib/libpthread.so.0
#1 0x0058e900 in ?? ()
41
nornagon

GDB 7以降では、信号が発生したときに入力される$_siginfo構造を調べて、障害のあるアドレスを特定できます。

(gdb) p $_siginfo._sifields._sigfault.si_addr

(void *) 0x0(または小さな数値)が表示されている場合は、NULLポインター逆参照があります。

63
caf