2010-11-21 93 views
6

我正在調試一個應用程序寫入ansi C,一個多線程程序。
有時候,在主線程中會導致SIGSEGV錯誤。回溯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

請列出你所有的編譯選項和版本的GCC – osgx 2010-11-21 19:18:03

+1

好的,我已經編輯了這個問題。 – secmask 2010-11-21 19:21:34

回答

2

使用「-g」選項重新編譯應用程序;

用GDB不具有核心文件,但運行整個應用程序:GDB的

gdb --args ./application application_options 

然後在 「運行」 命令。

從gdb運行將檢測到SIGSEGV,gdb將專注於失敗的線程。

+1

投票,在gdb中運行應用程序是個好主意。 – secmask 2010-11-22 04:41:04

1

嗯,首先你需要調試編譯啓用,使您的回溯有可用的東西。該標誌是gcc -g

+0

我已經用-g3編譯了它,但這就是它可以顯示的所有內容。 – secmask 2010-11-21 19:17:38

3

您的RIP指向0.它可能是由堆棧溢出引起的。你的RBP也是0,所以backtrace gdb命令會告訴你什麼。

+0

要添加,如果它是堆棧溢出,那麼您最有可能正在寫入數組(或字符串)的末尾。我會先在那裏檢查。 – OmnipotentEntity 2010-11-21 19:23:45

+0

@OmnipotentEntity我認爲當你寫過一個數組的末尾時,你的意思是緩衝區溢出? – 2010-11-21 21:40:39

+0

好吧,如果你的緩衝區在堆棧上,那也是一樣的。緩衝區溢出是任何緩衝區,堆棧,堆等。堆棧溢出特別覆蓋堆棧的緩衝區。由於指令指針被擰緊,你可以說這是特別的堆棧溢出。 :) – OmnipotentEntity 2010-11-22 02:54:58