Starten Sie den Python-Debugger im ältesten Stack-Frame, nachdem eine Ausnahme aufgetreten ist

9

Ich verwende den Befehl --pdb mit ipython. Wenn ich also Code debugge und ein Fehler auftritt, wird ein Stack-Trace angezeigt. Viele dieser Fehler kommen vom Aufruf von numpy oder pandas Funktionen mit schlechten Eingaben. Der Stack-Trace beginnt mit dem neuesten Frame im Code dieser Bibliotheken. 5-10 Wiederholungen des up -Befehls später kann ich tatsächlich sehen, was ich falsch gemacht habe, was in 90% der Fälle sofort offensichtlich sein wird (zB Aufruf mit einer Liste anstelle eines Arrays).

Gibt es eine Möglichkeit, anzugeben, in welchem ​​Stapelrahmen der Debugger anfänglich startet? Entweder der älteste Stapelrahmen oder der neueste Stapelrahmen in der Python-Datei wird zuerst ausgeführt oder ähnlich. Dies wäre für das Debuggen viel produktiver.

Hier ist ein einfaches Beispiel

%Vor%

Resultierende Rückverfolgung, (A), (B), (C) zur Verdeutlichung hinzugefügt

%Vor%

Nun möchte ich idealerweise, dass der Debugger im zweitältesten Frame bei (B) oder sogar bei (A) startet. Aber definitiv nicht bei (C) wo es standardmäßig geht.

    
user2699 04.11.2016, 18:55
quelle

1 Antwort

2

Lange Antwort, um den Prozess für mich selbst zu dokumentieren. Halbarbeitslösung unten:

Versuch fehlgeschlagen hier:

%Vor%

Pdb überspringt die Dokumentation:

  

Wenn das Argument skip angegeben ist, muss es sich um ein iterabiles Muster für glob-style-Modulnamen handeln. Der Debugger tritt nicht in Rahmen ein, die aus einem Modul stammen, das einem dieser Muster entspricht.

Pdb-Quellcode:

%Vor%

Bdb-Quellcode:

%Vor%

Es ist klar, dass die Skip-Liste nicht für Autopsien verwendet wird. Um dies zu beheben, habe ich eine benutzerdefinierte Klasse erstellt, die die Setup-Methode außer Kraft setzt.

%Vor%

Wenn Sie dies als:

verwenden %Vor%

Sie sind in den richtigen Rahmen fallen gelassen. Jetzt müssen Sie nur herausfinden, wie ipython ihre pdb pm / post_mortem Funktion aufruft und ein ähnliches Skript erstellt. Welche scheint hart zu sein , also gebe ich hier ziemlich auf.

Auch das ist keine sehr gute Implementierung. Es geht davon aus, dass die Frames, die Sie überspringen möchten, an der Spitze Ihres Stapels stehen und sonst seltsame Ergebnisse erzeugen. Z.B. Ein Fehler in der Eingabefunktion von df.apply erzeugt etwas Superartiges.

TLDR: Wird nicht von der stdlib unterstützt, aber Sie können Ihre eigene Debugger-Klasse erstellen, aber es ist nicht wichtig, dass Sie mit dem IPython-Debugger arbeiten.

    
Aske Doerge 14.11.2016 14:08
quelle

Tags und Links