2013-06-03 6 views
9

Ich debugge statische multi-threaded x86-64 C++ - Anwendung unter Linux.gdb Schritt funktioniert nicht wie erwartet

Ich kann Haltepunkte auf Funktionen setzen und auf ihnen stoppen, und ich kann Schritt für Schritt über Funktion Körper gehen. Aber wenn ich versuche, in eine andere Funktion zu treten, hört gdb nicht auf, es zu beginnen, und es scheint, dass es gerade Ausführung fortsetzt. Wenn ich die Programmausführung unterbrechen, geht gdb Zustand gebrochen und wird unbrauchbar:

(gdb) bt 
Target is executing. 
(gdb) c 
Continuing. 
Cannot execute this command while the selected thread is running. 
(gdb) 

Als Abhilfe, die ich als erwartet stepi mehrmals statt step, stepi Werke nutzen können. Was könnte der Grund für dieses Verhalten sein? Gibt es Workarounds neben der Verwendung von stepi? Ich verwende gdb 7.6 und gcc 4.7.1.

+0

Haben Sie das Ziel mit '-ggdb' und' -O0' kompiliert? Haben Sie versucht, den Unterschied zwischen Schritt ('s') und nächstem (' n') zu beobachten? – Reinderien

+0

@Reindienien, mein Ziel ist mit '-g' und' -O0' kompiliert. Wie kann ich den Unterschied zwischen 's' und' n' beobachten? – ks1322

+0

Versuchen Sie es von '-g' nach' -ggdb' zu ändern. Um den Unterschied zu sehen, tippen Sie in gdb "s" (effektiv "einsteigen") gegen "n" (effektiv "übergehen"). – Reinderien

Antwort

12

Was könnte der Grund für dieses Verhalten sein?

Es ist ein Fehler in GDB. Er setzt einen temporären Haltepunkt und erwartet, dass er getroffen wird. Aber der Haltepunkt wird nicht getroffen (möglicherweise weil er an der falschen Stelle gesetzt wurde), und der interne Zustandsautomat von GDB wird durcheinander gebracht.

Gibt es Workarounds neben der Verwendung von Stepi?

können Sie ein Upgrade versuchen, top-of-Stamm GDB Version von CVS, und wenn GDB noch gebrochen ist, melden Sie den Fehler in GDB bugzilla.

+0

Hat jemand das gemeldet? Was ist die Fehlernummer? –

+0

@LightnessRacesinOrbit, ich habe es vor kurzem gemeldet, siehe minimale Reproducer in Bug-Bericht https://sourceware.org/bugzilla/show_bug.cgi?id=17134 – ks1322

1

Schritt Befehl Warnung:

Wenn Sie den Schritt-Befehl verwenden, während die Steuerung innerhalb einer Funktion, die ohne Debug-Informationen geht die Ausführung kompiliert wurde, bis die Steuerung eine Funktion erreicht, die Debug-Informationen haben. Ebenso tritt es nicht in eine Funktion ein, die ohne Debugging-Informationen kompiliert wird.

Der Schrittbefehl gibt auch nur eine Funktion ein, wenn Zeilennummerinformationen für die Funktion vorhanden sind. Ansonsten verhält es sich wie der nächste Befehl.

2

Es ist ein bisschen alt post. Ich glaube immer noch, dass jemand davon profitieren kann.

Ich traf das gleiche Problem. In meinem Fall war der Prozess multi-threaded. Und ich zufällig, dass der Faden zu bemerken, die ein Haltepunkt getroffen wurde gestoppt und die anderen Threads wurden Ausführung: ‚Ziel ist die Ausführung‘

6 Thread 1000368545 (running) 
    5 Thread 1000368389 (running) 
    4 Thread 1000368388 (running) 
    3 Thread 1000368387 (running) 
    2 Thread 1000368386 myBreakPointFunction() at location/in/my/sourcefile.c:linenumber 
* 1 Thread 1000367766 (running) 

, während die ‚bt‘ Ausgabe Befehl es hat Anzeige Sobald ich zu Thread 2 (durch die Ausgabe von "Thread 2") ging und ein bt ausgab, konnte ich meine Anrufverfolgung sehen. Für weitere Informationen oder wenn Sie etwas experimentieren möchten, schlage ich vor, dass "set scheduler-locking" hilfreich sein kann. Details zu diesem Modus finden Sie unter: https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html

+0

Warum würden Sie zeigen die Thread-Liste, aber nicht den Befehl, um es anzuzeigen? – clearlight

Verwandte Themen