Befehl zum Suspendieren eines Threads mit GDB

Lesezeit: 4 Minuten

Ich bin ein bisschen neu bei GDB. Ich hoffe, jemand kann mir bei etwas helfen, das recht einfach sein sollte. Ich habe Google/docs verwendet, aber mir fehlt nur etwas.

Was ist die “normale” Art und Weise, wie Leute Thread-Apps mit GDB debuggen? Ich verwende pthreads. Ich möchte nur einen Thread ansehen – die beiden Optionen, die ich sehe, sind

a) Weisen Sie den Debugger irgendwie an, sich an einen bestimmten Thread anzuhängen, so dass das Steppen nicht dazu führt, dass Threads bei jedem Kontextwechsel springen

b) Sagen Sie dem Debugger, dass er alle „uninteressanten“ Threads aussetzen/freigeben soll

Ich würde lieber Route b) gehen – Lesen Sie die Hilfe für GDB. Ich sehe keinen Befehl dafür, Tipps?

Siehe Dokumentation für set scheduler-locking on.

Achtung: Wenn Sie andere Threads suspendieren und einer von ihnen eine Sperre hat, und if dein Interessanter Thread braucht diese Sperre irgendwann beim Steppen, Sie werden festgefahren.

Was ist die “normale” Art und Weise, wie Leute Thread-Apps debuggen?

Sie können die Thread-Korrektheit nie debuggen, Sie können sie nur entwerfen. Meiner Erfahrung nach besteht der größte Teil des Debuggens von Thread-Apps darin, Behauptungen einzugeben und den Zustand der Welt zu untersuchen, wenn eine der Behauptungen verletzt wird.

  • Mit „normal“ meine ich eher eine Frage zur Häufigkeit von Techniken als ein „How-to“ zur Thread-Programmierung. Unter Windows sehe ich normalerweise Leute, die ein oder zwei Threads einfrieren, die sie ignorieren möchten, während sie sich auf einen bestimmten Thread konzentrieren. Die Technik des “Scheduler-Sperrens einstellen” ist eine Art Gegenteil

    – gesteckt

    18. April 2011 um 0:06 Uhr


  • Gibt es eine Möglichkeit, nur einen Thread einzufrieren? Ich sehe nur Optionen für Aus/Ein

    – gesteckt

    18. April 2011 um 0:07 Uhr

  • Um die Antwort von Employed Russian zu ergänzen. Der Schlüssel zur Multi-Thread-Programmierung besteht darin, dies so weit wie möglich zu vermeiden. Legen Sie nur die kleinstmögliche Codemenge offen, und Sie haben die Chance, es richtig zu machen und in der Lage zu sein, es richtig zu analysieren und es als begrenztes Codebit zu überprüfen.

    – David Bradley

    31. Juli um 20:44 Uhr

Benutzeravatar von Hi-Angel
Hallo Engel

Zunächst müssen Sie mit den folgenden Befehlen ein für Multithreading komfortables Debugger-Verhalten aktivieren. Keine Ahnung, warum es standardmäßig deaktiviert ist.

set target-async 1
set non-stop on

Ich persönlich habe diese Befehle in .gdbinit Datei. Sie sorgen dafür, dass jeder Ihrer Befehle nur auf den aktuell fokussierten Thread angewendet wird. Hinweis: Der Thread wird möglicherweise ausgeführt, sodass Sie ihn anhalten müssen.

Um den fokussierten Thread zu sehen, führen Sie die aus thread.

Um zu einem anderen Thread zu wechseln, hängen Sie die Nummer des Threads an, z thread 2.

So sehen Sie alle Threads mit ihren Nummern ausgeben info thread.

Um einen Befehl auf ein bestimmtes Thread-Problem anzuwenden, gibt es so etwas wie thread apply Threadnum-Befehl. Z.B thread apply 4 bt wendet den Backtrace-Befehl auf einen Thread mit der Nummer 4 an. thread apply all continue setzt alle angehaltenen Threads fort.

Es gibt jedoch ein kleines Problem – für viele Befehle muss der Thread angehalten werden. Ich kenne ein paar Möglichkeiten, das zu tun:

  • interrupt Befehl: unterbricht die Thread-Ausführung, akzeptiert eine Nummer eines Threads zum Pausieren, ohne ein Argument unterbricht den fokussierten.
  • Irgendwo einen Haltepunkt setzen. Beachten Sie, dass Sie einen Haltepunkt auf einen bestimmten Thread setzen können, damit andere Threads ihn ignorieren, wie z Leinenfaden brechen Fadennum. Z.B break 25 thread 4.

Sie können das auch sehr nützlich finden Sie können eine Liste von Befehlen festlegen, die ausgeführt werden, wenn ein Haltepunkt erreicht wird durch den Befehl commands — so können Sie z. B. schnell interessante Werte drucken und dann mit der Ausführung fortfahren.

  • Danke für die Tipps. Ich habe auch in Multi-Thread-Programmen gefunden, die bedingte Haltepunkte mit komplexen Ausdrücken wie verwenden b func if arg1->foo().bar().c_str() == "xxx" ist sehr seltsam. Haben Sie diese Technik schon einmal angewendet?

    – Lewis Chan

    19. Februar 2020 um 2:21 Uhr

  • Oh, tbh, ich wusste nicht einmal, dass Sie setzen können if condition Innerhalb break Befehl. Früher habe ich zuerst ausgeführt break somewhereund dann ausführen commands, wo ich die if-Bedingung aufschreibe. Danke für den Tipp! 😉

    – Hallo Engel

    19. Februar 2020 um 8:47 Uhr

1432560cookie-checkBefehl zum Suspendieren eines Threads mit GDB

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy