2010-11-21 5 views
6

Sto eseguendo il debug di un'applicazione in ansi C, un programma con più thread.
A volte, nel thread principale si verifica un errore SIGSEGV.backtrace di 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) 

Queste informazioni da file core, io non sono molto familiare con il debug in ambiente Linux, C'è qualcosa che posso fare per trovare dove è il problema?

Edit: tutti i file di origine sono compilati con segnala come seguire

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

Si prega di elencare tutte le opzioni di compilazione e la versione di GCC – osgx

+1

ok, ho modificato la domanda. – secmask

risposta

2

Ricompila l'applicazione con l'opzione "-g";

utilizzano gdb non con i file core, ma per eseguire tutta l'applicazione:

gdb --args ./application application_options 

poi il comando "run" di gdb.

L'esecuzione da gdb rileva SIGSEGV e gdb si concentra sul thread non riuscito.

+1

voto, eseguire l'applicazione in gdb è una buona idea. – secmask

1

Beh, in primo luogo è necessario compilare con il debug abilitato in modo che il backtrace ha qualcosa di utilizzabile. Il flag è gcc -g

+0

L'ho già compilato con -g3, ma è tutto ciò che può mostrare. – secmask

3

Il tuo RIP punta a 0. Probabilmente è causato da un overflow dello stack. Anche il tuo RBP è 0, quindi il comando gdb backtrace non ti dirà nulla.

+0

Per aggiungere, se si tratta di un overflow dello stack, si sta scrivendo molto probabilmente la fine di un array (o una stringa). Prima controllerei lì. – OmnipotentEntity

+0

@OnnipotentEntity Penso che intenda l'overflow del buffer quando scrivi oltre la fine di un array? –

+0

Beh, è ​​la stessa cosa, se il tuo buffer è in pila. Un buffer overflow è qualsiasi buffer, stack, heap, ecc. Un overflow dello stack sovrascrive specificamente il buffer dello stack. Si può dire che questo è specificamente un overflow dello stack perché il puntatore dell'istruzione è avvitato. :) – OmnipotentEntity