Ich bin ein wenig neu in GDB. Ich hoffe, dass jemand mir mit etwas helfen kann, das ganz einfach sein sollte, ich habe Google / docs benutzt, aber ich vermisse gerade etwas.
Was ist der 'normale' Weg, wie Leute Threaded-Apps mit GDB debuggen? Ich benutze Pthreads. Ich möchte nur einen Thread sehen - die zwei Optionen, die ich sehe, sind
a) dem Debugger mitteilen, dass er irgendwie an einen bestimmten Thread angehängt werden soll, so dass das Stapfen bei jedem Kontextwechsel nicht zu springenden Threads führt
b) den Debugger anweisen, alle uninteressanten Threads zu suspendieren / freizugeben
Ich würde es vorziehen, Route b) zu gehen - Lesen der Hilfe für GDB Ich sehe keinen Befehl dafür, Tipps?
Siehe Dokumentation für set scheduler-locking on
.
Vorsicht: Wenn Sie andere Threads aussetzen, und wenn einer davon eine Sperre hält, und wenn Ihr interessanter Thread diese Sperre zu einem bestimmten Zeitpunkt während des Schritts benötigt, werden Sie Deadlocks.
Was ist der 'normale' Weg, wie Leute gethreaded Apps debuggen?
Sie können die Korrektheit von Threads nie debuggen, Sie können sie nur entwerfen. Nach meiner Erfahrung besteht das meiste Debugging von apps mit Threads darin, Assertions zu setzen und den Zustand der Welt zu untersuchen, wenn eine der Assertions verletzt wird.
Zuerst müssen Sie das Debugger-Verhalten für mehrere Threads mit den folgenden Befehlen aktivieren. Keine Ahnung, warum es standardmäßig deaktiviert ist.
%Vor%Ich habe diese Befehle persönlich in die .gdbinit Datei geschrieben. Sie machen jeden Befehl, nur auf den aktuell fokussierten Thread angewendet zu werden. Hinweis: Der Thread läuft möglicherweise, Sie müssen ihn also anhalten.
Um den fokussierten Thread zu sehen, führen Sie thread
.
Um zu einem anderen Thread zu wechseln, fügen Sie die Nummer des Threads hinzu, z. thread 2
.
Um alle Threads mit ihren Nummern anzuzeigen, geben Sie info thread
ein.
Um einen Befehl auf ein bestimmtes Thread-Problem anzuwenden, geben Sie etwas wie thread apply threadnum command ein. Z.B. thread apply 4 bt
wendet den Befehl backtrace auf eine Thread-Nummer 4 an. thread apply all continue
setzt alle pausierten Threads fort.
Es gibt jedoch ein kleines Problem - bei vielen Befehlen muss der Thread angehalten werden. Ich kenne einige Möglichkeiten, dies zu tun:
interrupt
command: unterbricht die Thread-Ausführung, akzeptiert eine Thread-Nummer, die angehalten werden soll, ohne dass ein Argument den Fokus unterbricht. break 25 thread 4
. Sie können auch sehr nützlich finden, dass Sie eine Liste von Befehlen festlegen können, die ausgeführt werden sollen, wenn ein Haltepunkt erreicht wird durch den Befehl commands
- also zB Sie können schnell interessante Werte drucken und dann die Ausführung fortsetzen.