обратная трасса от SIGSEGV - PullRequest
       21

обратная трасса от SIGSEGV

6 голосов
/ 21 ноября 2010

Я отлаживаю запись приложения в ANSI C, многопоточную программу.
Иногда в основном потоке возникает ошибка 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"

Ответы [ 3 ]

3 голосов
/ 21 ноября 2010

Ваш RIP указывает на 0. Это, вероятно, вызвано переполнением стека.Ваш RBP также равен 0, поэтому команда backtrace gdb ничего вам не скажет.

2 голосов
/ 21 ноября 2010

Перекомпилируйте приложение с параметром "-g";

Используйте Gdb не с основными файлами, а для запуска всего приложения:

gdb --args ./application application_options

, а затем "запустите" команду gdb.

Запуск из GDB обнаружит SIGSEGV, и GDB будет сосредоточен на сбойном потоке.

1 голос
/ 21 ноября 2010

Ну, во-первых, вам нужно скомпилировать с включенной отладкой, чтобы ваша обратная трассировка имела что-то полезное.Флаг gcc -g

...