+1 Tibors の回答。
大規模なプログラムや追加のライブラリを使用する場合は、gdb でバックトレースを確認することも役立つ場合があります:ftp://ftp.gnu.org/pub/old-gnu/Manuals/gdb/html_node/gdb_42.html
gdb
などのデバッガーを使用する または、これが当てはまらない場合は strace
gcc
を使用する場合 、必ず -g
でコンパイルしてください デバッグ情報を含めるように切り替えます。次に、gdb
segfault が発生したソース コード内の正確な場所が表示されます。
たとえば、この明らかな segfaulty プログラムがある場合:
new.c
#include <stdio.h>
int main()
{
int *i = 0x478734;
printf("%d", *i);
}
gcc -g new.c -o new
でコンパイルします gdb
を実行します gdb new
とのセッション :
run
を発行します 対話型セッションのコマンドであり、それ以外は明確です:
(gdb) run
Starting program: /home/Tibor/so/new
[New Thread 9596.0x16a0]
[New Thread 9596.0x1de4]
Program received signal SIGSEGV, Segmentation fault.
0x0040118a in main () at new.c:6
6 printf("%d", *i);
(gdb)
DasMoeh さんと netcoder さんが指摘しているように、segfault が発生した場合、backtrace
を使用できます。 コマンドを対話型セッションで使用して、コール スタックを出力します。これは、セグメンテーション違反の場所をさらに特定するのに役立ちます。
最も簡単な方法は valgrind
を使用することです .無効なアクセスが発生した場所 (および、クラッシュを引き起こさなかったが無効だったその他の問題) を特定します。もちろん、実際の問題はコードの別の場所にある可能性があります (例:無効なポインター)。そのため、次のステップはソースを確認し、それでも混乱する場合はデバッガーを使用することです。