2010-11-21 18 views
6

Bir uygulamada birden çok iş parçacığı programı olan ansi C'de hata ayıklama yapıyorum. Bazen ana iplikte bir SIGSEGV hatasına sebep olur.backtrace

(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) 

Bu bilgiler çekirdek dosyasından, ben Linux ortamında hata ayıklama ile çok aile değilim, sorun nerede bulmak için yapabileceğim bir şey var mı?

Düzenleme:

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

Lütfen tüm derleme seçeneklerini ve GCC – osgx

+1

versiyonunu listeleyin, ben sorunu düzenledim. – secmask

cevap

2

Uygulamayı "-g" seçeneği ile yeniden derleyin;

çekirdek dosyaları ile

Kullanım Gdb değil, ancak tüm uygulamayı çalıştırmak için: gdb sonra

gdb --args ./application application_options 

"run" komutunu.

gdb'den çalışıldığında SIGSEGV algılanacak ve gdb başarısız iş parçacığına odaklanacaktır.

+1

oy, gdb uygulamasının çalıştırılması iyi bir fikirdir. – secmask

1

Peki izleyin gibi kaynak dosyaların tümü ilk siz backtrace kullanışlı bir şey vardır, böylece etkin ayıklamaya derlemek gerekir, bayrağıyla derlenmektedir. Bayrak gcc -g

+0

Zaten onu -g3 ile derledim, ancak gösterebileceği tek şey bu. – secmask

3

RIP'niz 0 olarak görünüyor. Muhtemelen bir yığın taşması nedeniyle oluşuyor. RBP'niz de 0'dır, bu yüzden backtrace gdb komutu size hiçbir şey söylemeyecektir.

+0

Eklemek gerekirse, yığın taşmasıysa, büyük olasılıkla bir dizinin (veya dizenin) sonunu yazıyor demektir. Önce orayı kontrol ederim. – OmnipotentEntity

+0

@OmnipotentEntity Dizinin sonunu yazdığınızda arabellek taşması mı demek istediniz? –

+0

Peki, tamponunuz yığındaysa, aynı şeydir. Bir arabellek taşması, herhangi bir arabellek, yığın, yığın vs.'dir. Yığın taşması, yığının arabelleğinin üzerine yazılır. Bunun, yönerge göstericisinin vidalandığı için özel olarak bir yığın taşması olduğunu söyleyebilirsiniz. :) – OmnipotentEntity

İlgili konular