400 Stimmen

Anzeige des Stacktrace einer laufenden Python-Anwendung

Ich habe diese Python-Anwendung, die von Zeit zu Zeit stecken bleibt und ich kann nicht herausfinden, wo.

Gibt es eine Möglichkeit, dem Python-Interpreter zu signalisieren, dass er Ihnen den genauen Code anzeigt, der gerade läuft?

Eine Art On-the-Fly-Stacktrace?

Verwandte Fragen:

12voto

Ich würde dies als Kommentar hinzufügen zu haridsvs Antwort aber ich habe nicht den Ruf, dies zu tun:

Einige von uns arbeiten noch mit einer Python-Version, die älter als 2.6 ist (erforderlich für Thread.ident), daher habe ich den Code in Python 2.5 zum Laufen gebracht (allerdings ohne Anzeige des Threadnamens):

import traceback
import sys
def dumpstacks(signal, frame):
    code = []
    for threadId, stack in sys._current_frames().items():
            code.append("\n# Thread: %d" % (threadId))
        for filename, lineno, name, line in traceback.extract_stack(stack):
            code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
            if line:
                code.append("  %s" % (line.strip()))
    print "\n".join(code)

import signal
signal.signal(signal.SIGQUIT, dumpstacks)

12voto

Matt Joiner Punkte 105454

Werfen Sie einen Blick auf die faulthandler Modul, neu in Python 3.3. A faulthandler Rückport zur Verwendung in Python 2 ist auf PyPI verfügbar.

8voto

kmaork Punkte 5334

Sie können die hypno Paket, etwa so:

hypno <pid> "import traceback; traceback.print_stack()"

Dies würde einen Stack-Trace in den stdout des Programms ausgeben.

Wenn Sie nichts auf stdout ausgeben wollen oder keinen Zugriff darauf haben (z. B. ein Daemon), können Sie alternativ die Option madbg Paket, ein Python-Debugger, der es Ihnen ermöglicht, sich an ein laufendes Python-Programm anzuhängen und es in Ihrem aktuellen Terminal zu debuggen. Es ist vergleichbar mit pyrasite y pyringe , aber neuer, benötigt kein gdb und verwendet IPython für den Debugger (d.h. Farben und Autovervollständigung).

Um den Stack-Trace eines laufenden Programms zu sehen, können Sie es ausführen:

madbg attach <pid>

Und in der Debugger-Shell geben Sie ein: bt

Haftungsausschluss - Ich habe beide Pakete geschrieben

7voto

anatoly techtonik Punkte 18578

Wenn Sie mit einem Linux-System arbeiten, nutzen Sie die großartigen Möglichkeiten von gdb mit Python-Debug-Erweiterungen (kann in python-dbg o python-debuginfo Paket). Es hilft auch bei Multithreading-Anwendungen, GUI-Anwendungen und C-Modulen.

Führen Sie Ihr Programm mit aus:

$ gdb -ex r --args python <programname>.py [arguments]

Diese weist an gdb zur Vorbereitung python <programname>.py <arguments> y r un it.

Wenn sich das Programm aufhängt, wechseln Sie zu gdb Konsole, drücken Sie Ctr+C und ausführen:

(gdb) thread apply all py-list

Siehe Beispielsitzung und weitere Informationen aquí y aquí .

7voto

Tim Foster Punkte 71

Unter Solaris können Sie pstack(1) verwenden. Es sind keine Änderungen am Python-Code erforderlich. z. B.

# pstack 16000 | grep : | head
16000: /usr/bin/python2.6 /usr/lib/pkg.depotd --cfg svc:/application/pkg/serv
[ /usr/lib/python2.6/vendor-packages/cherrypy/process/wspbus.py:282 (_wait) ]
[ /usr/lib/python2.6/vendor-packages/cherrypy/process/wspbus.py:295 (wait) ]
[ /usr/lib/python2.6/vendor-packages/cherrypy/process/wspbus.py:242 (block) ]
[ /usr/lib/python2.6/vendor-packages/cherrypy/_init_.py:249 (quickstart) ]
[ /usr/lib/pkg.depotd:890 (<module>) ]
[ /usr/lib/python2.6/threading.py:256 (wait) ]
[ /usr/lib/python2.6/Queue.py:177 (get) ]
[ /usr/lib/python2.6/vendor-packages/pkg/server/depot.py:2142 (run) ]
[ /usr/lib/python2.6/threading.py:477 (run)
etc.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X