2010-12-20 83 views
10

$DB::single=1$DB::single=2放在代碼中有什麼區別?當我在perl調試器命令行上執行'c'時,兩者似乎都具有相同的效果,即在分配後的語句處停止執行。

perldebug表示1的值等於剛剛按's'進入下一個語句,2與'n'相同,但是它會如何區分語句?

回答

16

perldebug

如果設置$DB::single2,這等於有了剛纔輸入的n命令(其中執行了子程序調用),而中1值意味着s命令(進入子程序調用) 。

你已經知道了很多。


從用戶的角度來看,我很確定沒有什麼區別。我基於這個實際的DB.pmsource code的檢查。

讓我們按照這個邏輯。您可能想要參考源代碼。我已經簡化了一些代碼來刪除不必要的細節,但是您應該能夠從我的描述中獲得這個想法。

在調試器中執行代碼時,(至少)有兩個重要變量runningsingle。這些組合是什麼決定的代碼是否運行:

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 

DB()功能對每一行執行的,它包含下面的代碼片段,如果single已設置將停止運行(它總是執行不管當前行):

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

這就是爲什麼,如果你在你的Perl代碼設置變量,它會破壞(由休息,我的意思是「停止運行的代碼」,而不是「損害莫名其妙」)在調試器下一行。

running時是0,所述DB()函數進入該小環:

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

換句話說,它等待在其上設置running1用戶命令。這可以通過以下三種功能之一來進行:

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

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

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

你可以看到,這三個命令設置的singlerunning的不同組合,這將在執行下一個Perl的行中使用(請參閱前面的表看看這些組合是什麼意思)。

在Perl代碼爲使用12的能力是一個事實,即您使用的是偷偷摸摸的,但巧招從你的Perl代碼本身中斷執行,通過設置一個變量,它會直接導致通常由調試器命令設置。

這就是爲什麼它不像你迫使調試器進入特定狀態那麼重要。

+1

沒有偷偷摸摸,有據可查。 – ysth 2010-12-20 21:54:46

+3

它可能已被很好地記錄下來,但我認爲這是DB.pm工作方式的一個簡單副作用,即某人發現有用(即使某人是原作者)。沒有人會在他們的正確思維中設計一個像這樣的API :-)他們會提供一個函數來做到這一點,以便不暴露內部運作,不只是讓一個變量設置爲兩個不同的值,價值在使用方面絕對沒有任何意義。 – paxdiablo 2010-12-20 23:23:12

相關問題