私が書いているコードでGDBを使ってsegfaultのトラブルシューティングを試みていました。 backtrace
コマンドを使用すると、GDBは行番号や関数名を表示しません。ここに私の問題を示して短いサンプルプログラムです:GDBで行番号や関数名が表示されないのはなぜですか?
void segfault(int *b) {
// This causes a segfault on CentOS7 Intel 64-bit
b[-1] = 5;
}
void main() {
int a[10];
segfault(a);
}
しかし、私は
gcc -ggdb -O0 test.c -o segfaulttest
そして、私は、GDBのバックトレースコマンドを使用するときに、それを実行するためにgdb segfaulttest
を使用してコンパイルするとき、私は任意の行番号を得ることはありませんまたは関数名。トレースにmain()
とsegfault()
と表示されると思います。
私が使用している
Reading symbols from /home/user/test/segfaulttest...done.
(gdb) run
Starting program: /home/user/test/segfaulttest
Program received signal SIGSEGV, Segmentation fault.
0x000000050040051c in ??()
(gdb) bt
#0 0x000000050040051c in ??()
#1 0x0000000000000000 in ??()
(gdb)
サンプル出力:
- CentOSの7(64ビット)
- GCC:
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
- GDBが
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
(別にあります:私は実際の私のコードにバグがありますが、なぜgdbバックトレースが私に詳細な情報を表示しないのか分かりません)。
すばやく理解できる回答ありがとうございます。私はsegfault()をこれに変更しようとしました: 'void segfault(){raise(SIGSEGV); } 'そしてgdbをもう一度実行しました。スタックトレースを正常に見ることができました。 –