我正在使用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"
答案 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