2016-03-30 21 views
0

Ich versuche, in KDE 5.6 auf den Grund eines Fehlers zu kommen. Der Schrankschirm bricht, egal wie ich ihn sperre. Hier ist der relevante Code: https://github.com/KDE/kscreenlocker/blob/master/abstractlocker.cpp#L51Wie soll ich ein SIGFPE in einem großen, unbekannten Softwareprojekt debuggen?

Als ich /usr/lib/kscreenlocker_greet --testing laufen, erhalte ich eine Leistung von:

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

Ich versuche es mit gdb ausführen, um die genaue Position des Fehlers zu versuchen und Stift, aber ich Ich bin mir nicht sicher, wo ich die Haltepunkte setzen soll, um den Fehler zu isolieren. Sollte ich nach Anrufen nach KCrash suchen? Oder vielleicht ein raise() Anruf? Kann ich gdb erhalten, um die relevante Codezeile auszudrucken, die SIGFPE verursacht?

Vielen Dank für jede Beratung, die Sie anbieten können.

+0

Run Programm unter gdb laufen und wenn er abstürzt, geben Sie „bt“. – dbrank0

Antwort

1

aber ich bin nicht sicher, wo die Haltepunkte setzen, um den Fehler zu isolieren

Sie sollten keine Haltepunkte überhaupt festlegen müssen: wenn ein Prozess unter GDB Ausführen eines fatalen Begegnungen Signal (z. B. SIGFPE), bemerkt das Betriebssystem, dass der Prozess vom Debugger verfolgt wird, und benachrichtigt den Debugger (anstatt den Prozess zu beenden). Dadurch wird GDB angehalten und Sie werden aufgefordert, weitere Befehle einzugeben. Es ist zu dieser Zeit, dass Sie sich umsehen und verstehen können, was den Absturz verursacht hat.

Beispiel:

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 

hier, wie Sie sehen können, GDB stoppt, wenn SIGFPE geliefert wird, und ermöglicht es Ihnen, um zu schauen und den Absturz zu verstehen.

In Ihrem Fall würden Sie zum ersten debuginfo Symbole für KDE installieren und dann

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