2016-03-30 4 views
0

Я пытаюсь добраться до нижней части ошибки в KDE 5.6. Экран шкафчика ломается, как бы я его не запирал. Вот соответствующий код: https://github.com/KDE/kscreenlocker/blob/master/abstractlocker.cpp#L51Как я могу отладить SIGFPE в большом, незнакомом программном проекте?

Когда я бегу /usr/lib/kscreenlocker_greet --testing, я получаю выход:

KCrash: Application 'kscreenlocker_greet' crashing... 
Floating point exception (core dumped) 

Я пытаюсь запустить его с gdb, чтобы попытаться закрепить точное местоположение ошибки, но я «Не знаю, где установить точки останова, чтобы изолировать ошибку. Должен ли я искать звонки на KCrash? Или, может быть, звонок raise()? Могу ли я получить gdb, чтобы распечатать соответствующую строку кода, которая вызывает SIGFPE?

Спасибо за любые советы, которые вы можете предложить.

+0

Запустить программу под управлением GDB, и когда он выходит из строя, введите «Ы». – dbrank0

ответ

1

, но я не уверен, где установить контрольные точки для того, чтобы изолировать ошибку

Вам не нужно устанавливать какие-либо контрольные точки на всех: когда процесс, работающий под управлением GDB сталкивается с фатальной сигнала (например, SIGFPE), ОС отмечает, что процесс отслеживается отладчиком и уведомляет об отладчике (вместо завершения процесса). Это, в свою очередь, заставляет GDB останавливаться и запрашивать дополнительные команды. Это в то время, что вы можете осмотреться и понять, что вызвало крах.

Пример:

cat -n t.c 
    1 #include <fenv.h> 
    2 
    3 int foo(double d) { 
    4 return 1/d; 
    5 } 
    6 
    7 int main() 
    8 { 
    9 feenableexcept(FE_DIVBYZERO); 
    10 return foo(0); 
    11 } 

gcc -g t.c -lm 
./a.out 
Floating point exception 

gdb -q ./a.out 
(gdb) run 
Starting program: /tmp/a.out 

Program received signal SIGFPE, Arithmetic exception. 
0x000000000040060e in foo (d=0) at t.c:4 
4  return 1/d; 
(gdb) bt 
#0 0x000000000040060e in foo (d=0) at t.c:4 
#1 0x0000000000400635 in main() at t.c:10 
(gdb) q 

Здесь, как вы можете видеть, GDB останавливается, когда SIGFPE поставляется, и позволяет оглянуться вокруг и понять аварии.

В вашем случае, вы хотели бы установить первый DebugInfo символы для KDE, а затем запустить

gdb --args /usr/lib/kscreenlocker_greet --testing 
(gdb) run