Pergunta

Estou depurando um aplicativo gravar no ANSI C, um programa de vários threads.
Em algum momento, no encadeamento principal, causa uma falha 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)

Esta informação é do arquivo principal, não sou muito familiar com depuração no ambiente Linux, há algo que eu possa fazer para encontrar onde está o problema?

Editar: Todos os arquivos de origem são compilados com a bandeira da seguinte forma

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"
Foi útil?

Solução

Recompilar o aplicativo com a opção "-g";

Use o GDB não com arquivos principais, mas para executar o aplicativo inteiro:

gdb --args ./application application_options

Em seguida, "Run" Comando do GDB.

O GDB detectará o Sigsegv e o GDB estará focado no encadeamento com falha.

Outras dicas

Seu RIP aponta para 0. provavelmente é causado por um transbordamento de pilha. Seu RBP também é 0, então o backtrace O comando gdb não lhe dirá nada.

Bem, primeiro você precisará compilar com a depuração ativada para que seu backtrace tenha algo utilizável. A bandeira é gcc -g

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top