Gibt es eine Möglichkeit, einen Debugger an einen Python-Prozess mit mehreren Threads anzuhängen?

StackOverflow https://stackoverflow.com/questions/47701

  •  09-06-2019
  •  | 
  •  

Frage

Ich versuche, einen Deadlock in einer Multithread-Python-Anwendung zu debuggen, nachdem sie blockiert ist.Gibt es eine Möglichkeit, einen Debugger anzuschließen, um den Status des Prozesses zu überprüfen?

Bearbeiten:Ich versuche das unter Linux, aber es wäre toll, wenn es eine plattformübergreifende Lösung gäbe.Es ist schließlich Python :)

War es hilfreich?

Lösung

Ja, gdb eignet sich gut für das Debuggen auf niedrigerer Ebene.

Sie können Threads mit wechseln Faden Befehl.

z.B

(gdb) thr 2
[Switching to thread 2 (process 6159 thread 0x3f1b)]
(gdb) backtrace
....

Sie können sich auch Python-spezifische Debugger ansehen, z Winpdb, oder pydb.Beide plattformunabhängig.

Andere Tipps

Verwenden Winpdb.es ist ein Plattformunabhängig grafischer GPL-Python-Debugger mit Unterstützung für Remote-Debugging über ein Netzwerk, mehrere Threads, Namespace-Änderung, eingebettetes Debugging, verschlüsselte Kommunikation und ist bis zu 20-mal schneller als pdb.

Merkmale:

  • GPL-Lizenz.Winpdb ist freie Software.
  • Kompatibel mit CPython 2.3 bis 2.6 und Python 3000
  • Kompatibel mit wxPython 2.6 bis 2.8
  • Plattformunabhängig und getestet auf Ubuntu Gutsy und Windows XP.
  • Benutzeroberflächen:rpdb2 ist konsolenbasiert, während winpdb wxPython 2.6 oder höher erfordert.

Screenshot
(Quelle: winpdb.org)

Sie können einen Debugger an einen Multithread-Python-Prozess anhängen, müssen dies jedoch auf C-Ebene tun.Um zu verstehen, was vor sich geht, muss der Python-Interpreter mit Symbolen kompiliert werden.Wenn Sie noch keine haben, müssen Sie die Quelle von python.org herunterladen und sie selbst erstellen:

./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy

Stellen Sie sicher, dass Ihre Arbeitslast auf dieser Version des Interpreters ausgeführt wird.Sie können es dann jederzeit mit GDB anhängen.Die Python-Leute haben in ihrem Misc-Verzeichnis ein Beispiel „.gdbinit“ eingefügt, das einige nützliche Makros enthält.Es ist jedoch beim Multithread-Debugging (!) defekt.Sie müssen Zeilen wie diese ersetzen

while $pc < Py_Main || $pc > Py_GetArgcArgv

mit den folgenden:

while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)

Ansonsten Befehle wie pystack wird nicht auf anderen Threads als dem Hauptthread beendet.Wenn diese Dinge vorhanden sind, können Sie Dinge wie tun

gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach

und sehen, was los ist.So'ne Art.

Sie können die Objekte mit dem Makro „pyo“ analysieren. Chris hat einige Beispiele auf seinem Blog.

Viel Glück.

(Ein großes Lob für Dans Blog für einige wichtige Informationen für mich, insbesondere die Threading-Korrektur!)

Wenn Sie die Pydb meinen, gibt es keine Möglichkeit, dies zu tun.Es gab einige Anstrengungen in diese Richtung:siehe SVN-Commit, aber es wurde aufgegeben.Angeblich winpdb unterstützt es.

Meine Erfahrung beim Debuggen von Multithread-Programmen in PyDev (Eclipse unter Windows XP) ist, dass Threads, die mit thread.start_new_thread erstellt wurden, nicht eingebunden werden konnten, Threads, die mit threading.Thread erstellt wurden, jedoch eingebunden werden konnten.Ich hoffe, die Informationen sind hilfreich.

Auf welcher Plattform versuchen Sie das?Bei den meisten Debuggern können Sie mithilfe der Prozess-ID eine Verbindung zu einem laufenden Prozess herstellen.Sie können die Prozess-ID entweder über die Protokollierung ausgeben oder etwas wie den Task-Manager verwenden.Sobald dies erreicht ist, ist es möglich, einzelne Threads und ihre Aufrufstapel zu überprüfen.

BEARBEITEN:Ich habe keine Erfahrung mit dem plattformübergreifenden GNU Debugger (GDB), aber ich habe das hier gefunden Verknüpfung und es kann Sie auf den richtigen Weg bringen.Es erklärt, wie man Debug-Symbole hinzufügt (praktisch zum Lesen von Stack-Traces) und wie man gdb anweist, eine Verbindung zu einem laufenden Python-Prozess herzustellen.

pdbinject ermöglicht es Ihnen, PDB in einen bereits laufenden Python-Prozess einzufügen.

Die ausführbare Datei pdbinject funktioniert nur unter Python2, kann aber auch problemlos in Python3 eingefügt werden.

PyCharm-IDE ermöglicht seit Version 4.0 das Anhängen an einen laufenden Python-Prozess.

Hier wird beschrieben, wie das geht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top