Zoeken…


The Python Debugger: Step-through Debugging met _pdb_

De Python Standard Library bevat een interactieve debugging-bibliotheek genaamd pdb . pdb heeft uitgebreide mogelijkheden, de meest gebruikte is de mogelijkheid om een programma te 'doorlopen'.

Gebruik voor het onmiddellijk aangaan van stapsgewijze foutopsporing:

python -m pdb <my_file.py>

Hiermee wordt de debugger op de eerste regel van het programma gestart.

Meestal wilt u een specifiek gedeelte van de code targeten voor foutopsporing. Hiertoe importeren we de pdb-bibliotheek en gebruiken we set_trace () om de stroom van deze verontruste voorbeeldcode te onderbreken.

import pdb

def divide(a, b):
    pdb.set_trace()
    return a/b 
    # What's wrong with this? Hint: 2 != 3

print divide(1, 2)

Als u dit programma uitvoert, wordt de interactieve debugger gestart.

python foo.py 
> ~/scratch/foo.py(5)divide()
-> return a/b
(Pdb) 

Vaak wordt deze opdracht op één regel gebruikt, zodat er met een enkel # -teken commentaar op kan worden gegeven

 import pdf; pdb.set_trace()

Bij de (Pdb) prompt kunnen opdrachten worden ingevoerd. Deze opdrachten kunnen debugger-opdrachten of python zijn. Om variabelen af te drukken, kunnen we p van de debugger of pythons afdrukken gebruiken .

(Pdb) p a
1
(Pdb) print a
1

Gebruik voor een lijst met alle lokale variabelen

locals

ingebouwde functie

Dit zijn goede debugger-opdrachten om te weten:

b <n> | <f>: set breakpoint at line *n* or function named *f*.
# b 3
# b divide
b: show all breakpoints.
c: continue until the next breakpoint.
s: step through this line (will enter a function).
n: step over this line (jumps over a function).
r: continue until the current function returns.
l: list a window of code around this line.
p <var>: print variable named *var*.
# p x
q: quit debugger.
bt: print the traceback of the current execution call stack
up: move your scope up the function call stack to the caller of the current function
down: Move your scope back down the function call stack one level
step: Run the program until the next line of execution in the program, then return control back to the debugger
next: run the program until the next line of execution in the current function, then return control back to the debugger
return: run the program until the current function returns, then return control back to the debugger
continue: continue running the program until the next breakpoint (or set_trace si called again)

De debugger kan python ook interactief evalueren:

-> return a/b
(Pdb) p a+b
3
(Pdb) [ str(m) for m in [a,b]] 
['1', '2']
(Pdb) [ d for d in xrange(5)]
[0, 1, 2, 3, 4]

Notitie:

Als een van uw variabelenamen samenvalt met de foutopsporingscommando's, gebruikt u een uitroepteken ' ! 'vóór de var om expliciet naar de variabele te verwijzen en niet naar de opdracht debugger. Het kan bijvoorbeeld zo zijn dat u de variabelenaam ' c ' voor een teller gebruikt en deze misschien wilt afdrukken terwijl u in de debugger staat. een eenvoudig ' c' -commando zou de uitvoering voortzetten tot het volgende breekpunt. Gebruik in plaats daarvan ' ! C ' om de waarde van de variabele als volgt af te drukken:

(Pdb) !c
4

Via IPython en ipdb

Als IPython (of Jupyter ) zijn geïnstalleerd, kan de debugger worden gebruikt met:

import ipdb
ipdb.set_trace()

Wanneer bereikt, wordt de code afgesloten en afgedrukt:

 /home/usr/ook.py(3)<module>()
      1 import ipdb
      2 ipdb.set_trace()
----> 3 print("Hello world!")

ipdb>

Dit betekent duidelijk dat je de code moet bewerken. Er is een eenvoudiger manier:

from IPython.core import ultratb
sys.excepthook = ultratb.FormattedTB(mode='Verbose',
                                     color_scheme='Linux',
                                     call_pdb=1)

Hierdoor wordt de debugger aangeroepen als er een niet-opgevangen uitzondering is opgetreden.

Foutopsporing op afstand

Soms moet je python-code debuggen die door een ander proces wordt uitgevoerd en in dit geval komt rpdb van pas.

rpdb is een wrapper rond pdb die stdin en stdout omleidt naar een sockethandler. Standaard opent het de debugger op poort 4444

Gebruik:

# In the Python file you want to debug.
import rpdb
rpdb.set_trace()

En dan moet u dit in terminal uitvoeren om met dit proces te verbinden.

# Call in a terminal to see the output
$ nc 127.0.0.1 4444

En je krijgt pdb promt

> /home/usr/ook.py(3)<module>()
-> print("Hello world!")
(Pdb)


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow