2010-12-20 2 views
10

$DB::single=1$DB::single=2을 코드에 넣는 것의 차이점은 무엇입니까? 두 가지 모두 Perl 디버거 명령 행에서 'c'를 할 때 할당 다음의 명령문에서 실행을 중지하는 것과 동일한 효과를 갖는 것으로 보입니다.

perldebug은 1의 값은 's'를 눌러 다음 문장으로 이동하고 2는 'n'과 동일하지만 문장이 어떻게 달라 졌는지를 나타냅니다. perldebug 가입일

답변

16

: 1의 값 s 명령 (서브 루틴 호출을 입사하는)을 의미하는 반면

2$DB::single를 설정하면, 그것은 (서브 루틴 호출을 통해 실행)을 n 명령을 단지 갖는 입력 동등의 .

이미 많이 알았습니다.


사용자 입장에서 볼 때 차이가 없다고 확신합니다. 나는 이것을 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; 
} 

)에서 디버거 다음 라인. 그것은 다시 1-running 설정을 사용자 명령에 대기 환언

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

:

running0이다

상기 DB() 기능이 작은 루프로 들어간다. 이것은 다음과 같은 세 가지 기능 중 하나에 의해 수행 될 수 있습니다 :

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

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

sub cont { 
    $DB::single = 0; 
    $running = 1; 
} 
당신은이 세 가지 명령은 다음 펄 라인을 실행하는 동안 사용됩니다 singlerunning의 다른 조합을 설정할 것을 볼 수 있습니다

는 (이전 표 참조 이 조합의 의미를 확인하십시오.

펄 코드 중 하나 1 또는 2를 사용할 수있는 기능은 것 변수를 설정하여, 펄 코드 자체에서 실행을 중단하는 몰래하지만 영리한 트릭을 사용하고 있다는 사실의 직접적인 결과이다 일반적으로 디버거 명령으로 설정됩니다.

그렇기 때문에 디버거를 특정 상태로 만드는 것은 중요하지 않습니다.

+1

부적절하지 않고 문서화가 잘되어 있습니다. – ysth

+3

잘 설명되어 있을지 모르겠지만, DB.pm이 작동하는 방식의 단순한 부작용이었다고 생각합니다. 누군가 발견했다고해도 누군가가 원저자 였다고해도 유용합니다. 아무리 올바른 마음을 가진 사람이라도 다음과 같은 API를 설계 할 것입니다 :-) 그들은 변수를 두 개의 다른 값으로 설정하는 것뿐만 아니라 내부 작업을 노출시키지 않는 함수를 제공했을 것입니다. 값은 사용면에서 전혀 없습니다. – paxdiablo

관련 문제