SIGSEGV的回溯

时间:2010-11-21 19:05:36

标签: c linux debugging segmentation-fault backtrace

我正在使用ansi C调试应用程序,这是一个多线程程序 有时,在主线程中会导致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"

3 个答案:

答案 0 :(得分:3)

您的RIP指向0.这可能是由堆栈溢出引起的。你的RBP也是0,所以backtrace gdb命令不会告诉你什么。

答案 1 :(得分:2)

使用“-g”选项重新编译应用程序;

不使用Gdb核心文件,而是运行整个应用程序:

gdb --args ./application application_options

然后“运行”gdb的命令。

从gdb运行将检测SIGSEGV,gdb将专注于失败的线程。

答案 2 :(得分:1)

嗯,首先你需要在启用调试的情况下进行编译,以便你的回溯有一些可用的东西。标志是gcc -g