2010-12-20 9 views
10

Jaka jest różnica między umieszczeniem $DB::single=1 i $DB::single=2 w kodzie? Oba wydają się mieć identyczny efekt zatrzymania wykonywania na oświadczeniu następującym po przypisaniu, gdy robię "c" w linii poleceń debla perla.

perldebug mówi, że wartość 1 jest równoznaczna z naciśnięciem przycisku "s", aby przejść do następnej instrukcji, a 2 jest takie samo jak "n", ale jaka jest różnica w stosunku do instrukcji?

Odpowiedz

16

Od perldebug:

Jeśli ustawisz $DB::single do 2, jest to równoznaczne z konieczności tylko wpisane polecenie n (który wykonuje ponad wywołań podprogramów), natomiast wartość 1 oznacza komendę s (który wchodzi wywołań podprogramów) .

Tyle już wiesz.


Z punktu widzenia użytkownika jestem prawie pewien, że nie ma różnicy. Opieram to na badaniu rzeczywistego DB.pmsource code.

Przejdźmy do tego logicznie. Możesz odwołać się do kodu źródłowego. Uprośniłem trochę kodu, aby usunąć niepotrzebne szczegóły, ale powinieneś być w stanie uzyskać pomysł z moich opisów.

Podczas wykonywania kodu w debugerze są (przynajmniej) dwie ważne zmienne, running i single. Połączenie z nich to, co decyduje, czy kod jest uruchamiany:

running single description 
------- ------ ----------- 
    0  ?  not running 
    1  0  running flat-out 
    1  1  single stepping, execute into function 
    1  2  single stepping, execute over function 

Funkcja DB() wykonywana jest dla każdej pojedynczej linii i zawiera następujący fragment kodu, który będzie zatrzymać uruchomiony jeśli single został ustawiony (to zawsze wykonuje obecny skład niezależnie):

if ($DB::single) { 
    $DB::single = 0; 
    $running = 0; 
} 

Dlatego, jeśli ustawić zmienną w kodzie Perl, będzie przerwa (o zerwaniu, to znaczy „stop działa kod”, a nie „uszkodzenie jakoś”) debugger w następna linia.

Kiedy running jest 0 funkcja DB() wchodzi tę małą pętlę:

# Now sit in an event loop until something sets $running 
do { 
    $c->idle;   # call client event loop; must not block 
} until $running; 

Innymi słowy, to czeka na polecenia użytkownika, który ustawia running z powrotem do 1. Można to zrobić za pomocą jednej z trzech następujących funkcji:

sub next { 
    $DB::single = 2; 
    $running = 1; 
} 

sub step { 
    $DB::single = 1; 
    $running = 1; 
} 

sub cont { 
    $DB::single = 0; 
    $running = 1; 
} 

Widać, że te trzy polecenia skonfigurować inną kombinację single i running, która będzie używana podczas wykonywania następnego wiersza Perl (patrz wcześniejszy stół aby zobaczyć, co oznaczają te kombinacje).

Możliwość użyć 1 lub 2 w kodzie Perl jest bezpośrednim wynikiem tego, że używasz podstępne ale sprytny trik przerwać wykonywanie kodu Perl od siebie, ustawiając zmienną, która zwykle ustawia się za pomocą polecenia debuggera.

To dlatego wartość nie ma tak dużego znaczenia, jak wymuszenie debuggera w określonym stanie.

+1

nie podstępne, dobrze udokumentowane. – ysth

+3

Może to być dobrze udokumentowane, ale jestem zdania, że ​​był to prosty efekt uboczny sposobu pracy DB.pm, który odkrył ktoś był przydatny (nawet jeśli był to oryginalny autor). Nikt przy zdrowych zmysłach nie zaprojektowałby takiego interfejsu API :-) Zapewniliby funkcję, która by to zrobiła, aby nie eksponować wewnętrznych działań, a nie tylko pozwolić na ustawienie zmiennej na dwie różne wartości, różnica między tymi wartości są absolutnie niczym pod względem użytkowania. – paxdiablo

Powiązane problemy