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:

30voto

gulgi Punkte 411

Les Traceback Modul hat einige nette Funktionen, unter anderem: print_stack:

import traceback

traceback.print_stack()

27voto

haypo Punkte 1104

Sie können die Modul für die Fehlerbehebung . Installieren Sie es mit pip install faulthandler und hinzufügen:

import faulthandler, signal
faulthandler.register(signal.SIGUSR1)

zu Beginn Ihres Programms. Senden Sie dann SIGUSR1 an Ihren Prozess (z. B: kill -USR1 42 ), um den Python-Traceback aller Threads auf der Standardausgabe anzuzeigen. Lesen Sie die Dokumentation für weitere Optionen (z.B.: in eine Datei protokollieren) und andere Möglichkeiten zur Anzeige des Tracebacks.

Das Modul ist jetzt Teil von Python 3.3. Für Python 2, siehe http://faulthandler.readthedocs.org/

21voto

saaj Punkte 19920

Es kann mit ausgezeichneten py-spy . Es ist ein Sampling-Profiler für Python-Programme Seine Aufgabe ist es also, sich an einen Python-Prozess anzuhängen und dessen Aufrufstapel abzufragen. Daraus folgt, py-spy dump --pid $SOME_PID ist alles, was Sie tun müssen, um die Aufrufstapel aller Threads im $SOME_PID Prozess. Normalerweise benötigt er erweiterte Rechte (um den Speicher des Zielprozesses zu lesen).

Hier ist ein Beispiel, wie es bei einer Python-Anwendung mit Threads aussieht.

$ sudo py-spy dump --pid 31080
Process 31080: python3.7 -m chronologer -e production serve -u www-data -m
Python v3.7.1 (/usr/local/bin/python3.7)

Thread 0x7FEF5E410400 (active): "MainThread"
    _wait (cherrypy/process/wspbus.py:370)
    wait (cherrypy/process/wspbus.py:384)
    block (cherrypy/process/wspbus.py:321)
    start (cherrypy/daemon.py:72)
    serve (chronologer/cli.py:27)
    main (chronologer/cli.py:84)
    <module> (chronologer/__main__.py:5)
    _run_code (runpy.py:85)
    _run_module_as_main (runpy.py:193)
Thread 0x7FEF55636700 (active): "_TimeoutMonitor"
    run (cherrypy/process/plugins.py:518)
    _bootstrap_inner (threading.py:917)
    _bootstrap (threading.py:885)
Thread 0x7FEF54B35700 (active): "HTTPServer Thread-2"
    accept (socket.py:212)
    tick (cherrypy/wsgiserver/__init__.py:2075)
    start (cherrypy/wsgiserver/__init__.py:2021)
    _start_http_thread (cherrypy/process/servers.py:217)
    run (threading.py:865)
    _bootstrap_inner (threading.py:917)
    _bootstrap (threading.py:885)
...
Thread 0x7FEF2BFFF700 (idle): "CP Server Thread-10"
    wait (threading.py:296)
    get (queue.py:170)
    run (cherrypy/wsgiserver/__init__.py:1586)
    _bootstrap_inner (threading.py:917)
    _bootstrap (threading.py:885)

20voto

Gunnlaugur Briem Punkte 2604

Was mir hier wirklich geholfen hat, ist Spickzettel (das ich bewerten und kommentieren würde, wenn ich die Reputationspunkte hätte), um einen Stack-Trace aus einem unvorbereitet Python-Prozess. Es funktionierte nur nicht, bis ich das gdbinit-Skript geändert . Also:

  • herunterladen http://svn.python.org/projects/python/trunk/Misc/gdbinit und legen Sie sie in ~/.gdbinit

  • bearbeiten, ändern PyEval_EvalFrame à PyEval_EvalFrameEx [Bearbeiten: nicht mehr erforderlich; die verlinkte Datei enthält diese Änderung bereits seit dem 14.01.2010]

  • gdb anhängen: gdb -p PID

  • Holen Sie sich den Python-Stacktrace: pystack

14voto

Gustavo Rubio Punkte 9321

python -dv yourcript.py

Dadurch wird der Interpreter im Debug-Modus ausgeführt und Sie können nachvollziehen, was der Interpreter tut.

Wenn Sie den Code interaktiv debuggen wollen, sollten Sie ihn wie folgt ausführen:

python -m pdb yourscript.py

Das weist den Python-Interpreter an, Ihr Skript mit dem Modul "pdb" auszuführen, das der Python-Debugger ist. Wenn Sie es so ausführen, wird der Interpreter im interaktiven Modus ausgeführt, ähnlich wie GDB

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