gdb Schritt nicht wie erwartet funktionieren
Ich bin debugging statische multi-threaded-x86-64-C++ - Anwendung auf Linux.
Ich kann breakpoints setzen auf Funktionen und Anschlag auf Sie, und ich kann Schritt für Schritt über die Funktion Körper. Aber wenn ich versuche, ein Schritt in eine andere Funktion, gdb nicht Stoppt am Anfang und es scheint, dass es nur die Ausführung fortgesetzt. Wenn ich unterbreche Ausführung des Programms, gdb geht um defekte Stand und unbrauchbar:
(gdb) bt
Target is executing.
(gdb) c
Continuing.
Cannot execute this command while the selected thread is running.
(gdb)
Als workaround kann ich verwenden stepi
mehrmals statt step
, stepi
funktioniert wie erwartet.
Was könnte der Grund sein für dieses Verhalten? Gibt es irgendwelche workarounds neben der Verwendung stepi
?
Ich bin mit gdb 7.6 und gcc 4.7.1.
- Haben Sie zusammengestellt, das Ziel mit
-ggdb
und-O0
? Haben Sie versucht, die Beobachtung den Unterschied zwischen Schritt (s
) und next (n
)? - mein Ziel ist kompiliert mit
-g
und-O0
. Wie kann ich beachten Sie den Unterschied zwischens
undn
? - Versuchen Sie es von
-g
zu-ggdb
. Um den Unterschied zu sehen, Schritt für Schritt durch die Eingabes
(effektiv "step in") versusn
(effektiv "step over") in gdb. n
funktioniert wie erwartet, habe ich geschrieben, dass "ich kann gehen Schritt für Schritt über die Funktion "Körper", abers
("step in") nicht, das ist der Unterschied, falls es das ist was du meinst.- Sie müssen veröffentlichen Sie Ihren code. Gibt es irgendwelche thread-Aufrufe?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein Fehler in der GDB. Es setzt einen temporären Haltepunkt dass er erwartet, geschlagen zu werden. Aber der Haltepunkt nicht getroffen zu werden (möglicherweise, weil es sich an der falschen Stelle), und der GDB-internen state machine bekommt alle verwirrt.
Können Sie versuchen, ein Upgrade auf top-of-trunk GDB version von CVS, und wenn der GDB ist immer noch gebrochen, melden Sie den Fehler in der GDB bugzilla.
Es ist ein bisschen alte post. Ich immer noch glaube, es kann jemand sein, der profitiert mit diesem.
Traf ich das gleiche Problem. In meinem Fall wurde der Prozess multi-threaded. Und ich zufällig zu bemerken, dass die Gewinde, die auf einen Haltepunkt angehalten wurde, und die anderen threads ausgeführt wurden:
während der Ausstellung der " bt " - Befehl, es kam die Anzeige 'Ziel ausgeführt wird.'
Einmal zog ich in thread 2 (durch die Ausstellung "thread 2") und die Ausstellung eines bt, ich konnte sehen, meine call-trace.
Weitere inforomation oder wenn Ihr gerne zu tun etwas Experimentieren, schlage ich vor, "festlegen von scheduler-sperren" kann sich als hilfreich erweisen. Details für diese Betriebsart sind erhältlich bei: https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html
info threads
Schritt-Befehl Achtung:
Wenn Sie mit den step-Befehl und die Kontrolle ist innerhalb einer Funktion kompiliert wurde ohne debugging-Informationen, die Ausführung dauert, bis Kontrolle erreicht eine Funktion, die debugging-Informationen. Ebenso wird es nicht einen Schritt in eine Funktion, die kompiliert wird, ohne die debugging-Informationen.
Auch die Schritt-Befehl tritt nur eine Funktion, wenn es ist die Zeilennummer-Informationen für den Funktion. Sonst wirkt es wie der nächste Befehl.
Wenn Sie Debuggen möchten, ein Verfahren mittels while-Schleife zu beenden, es zu einer angegebenen Zeile, zum Beispiel,
Funktioniert es einwandfrei im single-core-CPU-computer, aber es kann produzieren der Meldung "Ziel ausführt." bei der Verwendung von GDB mit mehreren Kernen der CPU-computer.
Also die Lösung ist die Verwendung von shell-Befehl taskset das vermeiden kann das Problem, zum Beispiel,