2010-11-21 8 views
6

Jestem debugowania aplikacji napisać w Ansi C, program wielu wątków.
Kiedyś w wątku głównym powstaje błąd SIGSEGV.śledzenie przez 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) 

Ta informacja jest z pliku podstawowej, nie jestem bardzo rodzinny z debugowania w środowisku Linux, Czy jest coś, co mogę zrobić, aby dowiedzieć się, gdzie jest problem?

Edit: wszystkie pliki źródłowe są kompilowane z flagą jak postępować

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

Proszę podać wszystkie opcje kompilacji i wersję GCC – osgx

+1

ok, edytowałem pytanie. – secmask

Odpowiedz

2

Przekompiluj aplikację za pomocą opcji "-g";

Zastosowanie Gdb nie z plikami core, ale uruchomić całą aplikację:

gdb --args ./application application_options 

następnie polecenie "Uruchom" z gdb.

Uruchamianie z gdb wykrywa SIGSEGV, a gdb będzie koncentrować się na wątku zakończonym niepowodzeniem.

+1

głosowanie, uruchomienie aplikacji w gdb to dobry pomysł. – secmask

1

Cóż, najpierw musisz skompilować z debugowania włączony żeby backtrace ma coś użytecznego. Flaga to gcc -g

+0

Już skompilowałem go z -g3, ale to wszystko, co może pokazać. – secmask

3

Twoje RIP wskazuje na 0. Prawdopodobnie jest to spowodowane przepełnieniem stosu. Twój RBP również wynosi 0, więc polecenie gdb backtrace nic ci nie powie.

+0

Aby dodać, jeśli jest to przepełnienie stosu, najprawdopodobniej piszesz poza końcem tablicy (lub łańcucha). Najpierw sprawdzę to. – OmnipotentEntity

+0

@OmnipotentEntity Myślę, że masz na myśli przepełnienie bufora, gdy piszesz za końcem tablicy? –

+0

Cóż, to jest to samo, jeśli twój bufor jest na stosie. Przepełnienie bufora to dowolny bufor, stos, stertę itp. Przepełnienie stosu powoduje nadpisanie bufora stosu. Można powiedzieć, że jest to przepełnienie stosu, ponieważ wskaźnik instrukcji jest wkręcony. :) – OmnipotentEntity