6

我正在调试一个用 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"
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 回答