將$DB::single=1
和$DB::single=2
放在代碼中有什麼區別?當我在perl調試器命令行上執行'c'時,兩者似乎都具有相同的效果,即在分配後的語句處停止執行。
perldebug
表示1的值等於剛剛按's'進入下一個語句,2與'n'相同,但是它會如何區分語句?
將$DB::single=1
和$DB::single=2
放在代碼中有什麼區別?當我在perl調試器命令行上執行'c'時,兩者似乎都具有相同的效果,即在分配後的語句處停止執行。
perldebug
表示1的值等於剛剛按's'進入下一個語句,2與'n'相同,但是它會如何區分語句?
如果設置$DB::single
到2
,這等於有了剛纔輸入的n
命令(其中執行了子程序調用),而中1
值意味着s
命令(進入子程序調用) 。
你已經知道了很多。
從用戶的角度來看,我很確定沒有什麼區別。我基於這個實際的DB.pm
source code的檢查。
讓我們按照這個邏輯。您可能想要參考源代碼。我已經簡化了一些代碼來刪除不必要的細節,但是您應該能夠從我的描述中獲得這個想法。
在調試器中執行代碼時,(至少)有兩個重要變量running
和single
。這些組合是什麼決定的代碼是否運行:
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;
換句話說,它等待在其上設置running
回1
用戶命令。這可以通過以下三種功能之一來進行:
sub next {
$DB::single = 2;
$running = 1;
}
sub step {
$DB::single = 1;
$running = 1;
}
sub cont {
$DB::single = 0;
$running = 1;
}
你可以看到,這三個命令設置的single
和running
的不同組合,這將在執行下一個Perl的行中使用(請參閱前面的表看看這些組合是什麼意思)。
在Perl代碼爲使用1
或2
的能力是一個事實,即您使用的是偷偷摸摸的,但巧招從你的Perl代碼本身中斷執行,通過設置一個變量,它會直接導致通常由調試器命令設置。
這就是爲什麼它不像你迫使調試器進入特定狀態那麼重要。
沒有偷偷摸摸,有據可查。 – ysth 2010-12-20 21:54:46
它可能已被很好地記錄下來,但我認爲這是DB.pm工作方式的一個簡單副作用,即某人發現有用(即使某人是原作者)。沒有人會在他們的正確思維中設計一個像這樣的API :-)他們會提供一個函數來做到這一點,以便不暴露內部運作,不只是讓一個變量設置爲兩個不同的值,價值在使用方面絕對沒有任何意義。 – paxdiablo 2010-12-20 23:23:12