6

マルチスレッドプログラムであるansiCでアプリケーションの書き込みをデバッグしています。
時々、メインスレッドでSIGSEGV障害が発生します。

(gdb) backtrace full
#0  0x0000000000000000 in ?? ()
No symbol table info available.
#1  0x0000000000000000 in ?? ()
No symbol table info available.
(gdb) info registers
rax            0x1      1
rbx            0x0      0
rcx            0x0      0
rdx            0x2      2
rsi            0x458e7aa0       1166965408
rdi            0x0      0
rbp            0x0      0x0
rsp            0x458e7b60       0x458e7b60
r8             0x458e7b20       1166965536
r9             0x0      0
r10            0x0      0
r11            0x206    518
r12            0x2aaaac400e70   46912522686064
r13            0x2aaaac514090   46912523813008
r14            0x1      1
r15            0x18505f10       407920400
rip            0x0      0
eflags         0x10206  [ PF IF RF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x63     99
gs             0x0      0
fctrl          0x37f    895
fstat          0x0      0
ftag           0xffff   65535
fiseg          0x0      0
fioff          0x0      0
foseg          0x0      0
fooff          0x0      0
fop            0x0      0
mxcsr          0x1f80   [ IM DM ZM OM UM PM ]
(gdb)

この情報はコアファイルからのものです。私はLinux環境でのデバッグにあまり詳しくありません。問題がどこにあるかを見つけるためにできることはありますか?

編集:すべてのソースファイルは次のようにフラグを付けてコンパイルされます

gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/redisconnector.d" -MT"src/redisconnector.d" -o"src/redisconnector.o" "../src/redisconnector.c"
4

3 に答える 3

4

RIPが0を指しています。スタックオーバーフローが原因である可能性があります。RBPも0であるため、backtracegdbコマンドは何も通知しません。

于 2010-11-21T19:19:07.990 に答える
2

「-g」オプションを使用してアプリケーションを再コンパイルします。

コアファイルではなく、アプリケーション全体を実行するためにGdbを使用します。

gdb --args ./application application_options

次に、gdbの「実行」コマンド。

gdbから実行すると、SIGSEGVが検出され、gdbは失敗したスレッドに焦点を合わせます。

于 2010-11-21T19:17:39.987 に答える
1

まず、バックトレースで何か使用できるように、デバッグを有効にしてコンパイルする必要があります。フラグはgcc-gです

于 2010-11-21T19:16:35.200 に答える