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:

1voto

asmeurer Punkte 79555

Sie können verwenden PuDB , ein Python-Debugger mit einer Curses-Schnittstelle, um dies zu tun. Einfach hinzufügen

from pudb import set_interrupt_handler; set_interrupt_handler()

in Ihren Code ein und verwenden Sie Strg-C, wenn Sie einen Abbruch vornehmen wollen. Sie können fortfahren mit c und brechen Sie mehrmals ab, wenn Sie es verpassen und es noch einmal versuchen wollen.

1voto

user7610 Punkte 20682

Ich bin im GDB-Lager mit den Python-Erweiterungen. Folgen Sie https://wiki.python.org/moin/DebuggingWithGdb was bedeutet

  1. dnf install gdb python-debuginfo o sudo apt-get install gdb python2.7-dbg
  2. gdb python <pid of running process>
  3. py-bt

Berücksichtigen Sie auch info threads y thread apply all py-bt .

1voto

jakvb Punkte 11

Wie man jede Funktion debuggt in der Konsole :

Funktion erstellen wo Sie pdb.set_trace() verwenden und dann die Funktion, die Sie debuggen möchten.

>>> import pdb
>>> import my_function

>>> def f():
...     pdb.set_trace()
...     my_function()
... 

Rufen Sie dann die erstellte Funktion auf:

>>> f()
> <stdin>(3)f()
(Pdb) s
--Call--
> <stdin>(1)my_function()
(Pdb) 

Viel Spaß bei der Fehlersuche :)

0voto

Verwenden Sie das Modul inspect.

i Hilfe(inspect.stack) Hilfe zur Funktion stack im Modul inspect:

Stapel(Kontext=1) Gibt eine Liste von Datensätzen für den Stack über dem Frame des Aufrufers zurück.

Ich finde es in der Tat sehr hilfreich.

0voto

jtatum Punkte 216

In Python 3 installiert pdb automatisch einen Signalhandler, wenn Sie das erste Mal c(ont(inue)) im Debugger verwenden. Wenn Sie danach Strg-C drücken, werden Sie direkt wieder dort hineingesetzt. Für Python 2 gibt es einen Einzeiler, der auch in relativ alten Versionen funktionieren sollte (getestet in 2.7, aber ich habe den Python-Quelltext bis 2.4 zurück geprüft und es sah gut aus):

import pdb, signal
signal.signal(signal.SIGINT, lambda sig, frame: pdb.Pdb().set_trace(frame))

pdb ist es wert, gelernt zu werden, wenn Sie viel Zeit mit dem Debuggen von Python verbringen. Die Benutzeroberfläche ist etwas unübersichtlich, sollte aber jedem vertraut sein, der ähnliche Werkzeuge wie gdb verwendet hat.

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