2015-01-03 25 views
5

Używam Pythona 2.6.6 i używam pdb do debugowania mojego programu Python, ale nie jestem pewien, jaka jest różnica między "następnym" i " do "in pdb, wydaje się, że oba z nich będą kontynuować wykonywanie aż do następnego wiersza w bieżącej funkcji.Jaka jest różnica między "następnym" a "do" w pdb

Odpowiedz

3

WPB help doc opisuje to w następujący sposób:

(Pdb) help next 
n(ext) 
Continue execution until the next line in the current function 
is reached or it returns. 

(Pdb) help until 
unt(il) 
Continue execution until the line with a number greater than the current 
one is reached or until the current frame returns 

Więcej usłużnie, Doug Hellman gives an example in his Python Module Tutorial of the Week który ilustruje różnicę:

aż komenda jest jak obok, oprócz tego, że wyraźnie trwa do wykonania biegu linia w tej samej funkcji o numerze linii wyższym niż aktualna wartość . Oznacza to na przykład, że dopóki nie można użyć do przekroczenia końca pętli.

pdb_next.py

import pdb 

def calc(i, n): 
    j = i * n 
    return j 

def f(n): 
    for i in range(n): 
     j = calc(i, n) 
     print i, j 
    return 

if __name__ == '__main__': 
    pdb.set_trace() 
    f(5) 

$ python pdb_next.py 
> .../pdb_next.py(21)<module>() 
-> f(5) 
(Pdb) step 
--Call-- 
> .../pdb_next.py(13)f() 
-> def f(n): 

(Pdb) step 
> .../pdb_next.py(14)f() 
-> for i in range(n): 

(Pdb) step 
> .../pdb_next.py(15)f() 
-> j = calc(i, n) 

(Pdb) next 
> .../pdb_next.py(16)f() 
-> print i, j 

(Pdb) until 
0 0 
1 5 
2 10 
3 15 
4 20 
> .../pdb_next.py(17)f() 
-> return 

(Pdb) 

Przed aż został uruchomiony, obecna linia była 16, ostatni wiersz z pętli . Po tym, jak został uruchomiony, wykonanie było w linii 17, a pętla została wyczerpana w .

Celem until jest dzielone z eponymous gdb command:

dalej działa aż do linii źródłowej minionym bieżącej linii, w bieżącej ramce stosu, został osiągnięty. To polecenie służy do uniknięcia pojedynczego przejścia przez pętlę więcej niż jeden raz. Jest to podobne do następnego polecenia, z wyjątkiem tego, że gdy do momentu napotkania przeskoku, to automatycznie kontynuuje wykonywanie, dopóki licznik programu nie przekroczy adresu skoku . Oznacza to, że po osiągnięciu końca pętli po pojedynczej przechodzeniu przez niego, dopóki program nie będzie kontynuował wykonywania aż do , wyjdzie z pętli. Natomiast kolejne polecenie na końcu pętli po prostu cofa się do początku pętli, co zmusza do przejścia przez następną iterację.