Warum sollte der gdb hängen?
Ich habe eine Anwendung, die ich bin debugging und ich versuche zu verstehen, wie gdb arbeiten und ich bin deshalb nicht in der Lage, Schritt durch die Anwendung manchmal. Das problem, das ich erlebe, ist, dass gdb hängen und der Prozess, mit dem es verbunden ist wird Sie in einen untergegangenen Staat, wenn ich einen Schritt durch das Programm. Nach der gdb hängt sich auf und ich muss es töten, um frei das terminal (Strg-C funktioniert nicht, ich habe das aus einem anderen terminal-Fenster, indem man die Prozess-id für die gdb-Sitzung und mit kill -9).
Ich vermute, dass der gdb hängt, weil es warten auf die Anwendung zu stoppen, bei der nächsten Anweisung und irgendwie ist die Anwendung fertigen Ausführung ohne gdb Identifizierung dieser. Aber das ist nur Spekulation von meiner Seite aus das Verhalten, das ich beobachtet habe bisher. Also meine Frage ist, ob jemand gesehen hat, diese Art von Verhalten vor und/oder empfehlen konnte, was die Ursache sein könnte. Ich denke, dass könnte mir helfen, mich zu verbessern, meine debugging-Strategie.
Falls es wichtig ist ich bin mit g++ 4.4.3, gdb 7.1, läuft auf Ubuntu 10.04 x86_64.
- Gibt es eine minimale Testfall, den Sie geben können? Ich meine, wie geschrieben, die sehr schwer zu beantworten, warum es geschehen könnte—anders als "sein könnte, weil gdb hat einen bug".
- danke für die Anregung. Jetzt hat die Anwendung eine Menge code für die Bibliothek, aber ich werde sehen, wenn ich kann machen Sie einen kleinen test case, die ich posten könnte als ein Beispiel.
- Ich würde empfehlen, mit einer neueren
gdb
. Aktuelle version ist 7.3 und Sie haben eine Menge Fortschritte. (und BTW, mit einem neuereng++
ie 4.6.2 wäre auch hilfreich, da GCC auch Fortgeschritten auf debugging-Informationen). - Ich bin mit dem, was installiert werden mit dem Ubuntu 10.04 LTS release, und ich bin wahrscheinlich nicht aktualisieren, bis 12.04 ist raus und getestet, mit der Systeme, die wir verwenden. Aber das testen mit einer neueren version von gdb ist eine gute Idee für die überprüfung der spezifischen problem sehe ich nur für den Fall, es ist ein Fehler mit der gdb. Also danke für den Vorschlag ich werde versuchen, dass mit einem der Systeme, die ich verwenden kann.
- danke für die Anregung. Ich habe endlich um zu versuchen gdb 7.4, und es scheint, dass das problem behoben, ich hatte also denke ich, gab es einige Fehler, die bereits gelöst wurden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde sagen, der Prozess gedebuggt würde nicht untätig ist, wenn es war die Ursache für das hängen. Jedes mal, wenn der GDB abgeschlossen hat, einen Schritt, es zu aktualisieren alle Ausdrücke, die Sie zum drucken erforderlich sind. Es kann auch nachfolgende Hinweise und so, und in einigen Fällen, es kann scheitern, es (obwohl ich nicht daran erinnern, von einem echten "hängen"). Es auch versuchen in der Regel aktualisieren Sie Ihre stack-trace. Wenn der stack-trace wurde beschädigt und ist nicht mehr zusammenhängend, es könnte sein, gefangen in einer endlosen Schleife. Anbringen gdb zu
strace
zu sehen, welche Art von Aktivität während der hang könnte ein guter Weg, um einen Schritt weiter gehen, herauszufinden, das problem.(z.B. Zugriff auf Quellen, die durch ein nicht-mehr-arbeiten-NFS/SSHFS-mount ist eine der häufigste Grund für den gdb zu hängen, hier :P)
strace -p `pidof gdb`
in ein terminal und die Untersuchung der Ausgabe. Es sollten alle system-Aufrufe ausgeführt durch das Programm.wait4(26066,
(für diese Ausführung der PID-variiert natürlich). In der Zwischenzeit eine Liste mit ps-a zeigt, dass der Prozess 26066 istdefunct
.26066
, war der Prozess gedebuggt. Ich denke, dass ich nicht ganz verstehen, was der Staatdefunct
bedeutet. Ich war darüber zu Lesen, und es klingt wie diese sollten die richtige Abfolge der Ereignisse, weil gdb ernten sollte der Prozess, wenn er beendet die Ausführung. Also ich vermute, dass das problem nicht mit diesem letzten system nennen, aber etwas, was früher passiert auf. Ich bin immer noch versuchen, es herauszufinden aber.SIGCHILD
früher. Ich bin verwirrt hier:wait4()
soll genau das ermöglichen die EPU-Prozess zum verlassen des aufgelösten Zustand hier ...Ich hatte ein ähnliches problem und löste es durch das senden einer
CONT
signal an den Prozess gedebuggt wird.kill -CONT <pid of the process>