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:

7voto

Stefan Punkte 226

Ich habe eine Weile nach einer Lösung gesucht, um meine Threads zu debuggen, und ich habe sie hier gefunden, dank haridsv. Ich verwende eine leicht vereinfachte Version, die traceback.print_stack() verwendet:

import sys, traceback, signal
import threading
import os

def dumpstacks(signal, frame):
  id2name = dict((th.ident, th.name) for th in threading.enumerate())
  for threadId, stack in sys._current_frames().items():
    print(id2name[threadId])
    traceback.print_stack(f=stack)

signal.signal(signal.SIGQUIT, dumpstacks)

os.killpg(os.getpgid(0), signal.SIGQUIT)

Für meine Bedürfnisse filtere ich die Themen auch nach Namen.

4voto

Albert Punkte 61113

Ich habe mir ein Tool zusammengebastelt, das sich in einen laufenden Python-Prozess einklinkt und etwas Code einschleust, um eine Python-Shell zu erhalten.

Siehe hier: https://github.com/albertz/pydbattach

3voto

rcoup Punkte 4857

Es lohnt sich, einen Blick darauf zu werfen Pydb "eine erweiterte Version des Python-Debuggers, die lose auf dem gdb-Befehlssatz basiert". Er enthält Signalmanager, die sich um den Start des Debuggers kümmern können, wenn ein bestimmtes Signal gesendet wird.

Ein Summer of Code-Projekt aus dem Jahr 2006 befasste sich mit dem Hinzufügen von Remote-Debugging-Funktionen zu pydb in einem Modul namens mpdb .

2voto

Dan Lecocq Punkte 3213

pyringe ist ein Debugger, der mit laufenden Python-Prozessen interagieren, Stack Traces, Variablen usw. ausgeben kann, ohne dass eine vorherige Einrichtung erforderlich ist.

Obwohl ich in der Vergangenheit oft die Signalhandler-Lösung verwendet habe, kann es in bestimmten Umgebungen immer noch schwierig sein, das Problem zu reproduzieren.

2voto

Phoenix87 Punkte 649

Seit Austin 3.3 können Sie die -w/--where um den aktuellen Stack-Trace auszugeben. Siehe https://stackoverflow.com/a/70905181/1838793

enter image description here

Wenn Sie einen Blick auf eine laufende Python-Anwendung werfen wollen, um den "Live"-Aufrufstapel in einer Top-ähnlichen Form zu sehen, können Sie austin-tui ( https://github.com/p403n1x87/austin-tui ). Sie können es von PyPI installieren, z.B. mit

pipx install austin-tui

Beachten Sie, dass die Austin-Binärdatei benötigt wird, um zu funktionieren ( https://github.com/p403n1x87/austin ), aber dann können Sie sich an einen laufenden Python-Prozess mit

austin-tui -p <pid>

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