2013-05-23 4 views
1

때때로 Visual Studio 디버거가 잘못된 현재 명령을 표시합니다. 가장 단순한 이유는 다음과 같습니다.디버거에 잘못된 명령이 표시됩니다.

  • 오래된 .pdb 파일. 이 파일에는 이진 파일의 어느 오프셋이 코드 줄에 해당하는지에 대한 정보가 들어 있습니다. 이러한 파일이 오래된 경우 분명히 디버거는 잘못된 줄을 표시합니다.
  • 디버그 대신 릴리스 모드로 컴파일 된 프로그램. 릴리스 모드는 일반적으로 옵티마이 저가 코드를 더 빠르게 (또는 더 작게) 수정할 수 있도록 최적화를 켭니다. 이 경우 바이너리 파일은 더 이상 소스 코드에 해당하지 않으므로 디버거는 실제 실행 된 행을 표시 할 수 없습니다.

하지만 제 경우가 다릅니다. 여기에 소스 코드 (C#)가 있습니다 :

if (match.Groups.Count != 4) 
    throw new InvalidOperationException("Internal error: Invalid regular expression!"); 

MyEnum myEnum; 
try 
{ 
    // (...) 

나는 소스를 디버깅했습니다. 디버거는 조건문에서 멈추어 진 결과, match.Groups.Count은 실제로 4와 같습니다. 분명히 throw 문은 건너 뛰었어야했지만 놀랍게도 그렇지 않았습니다. 그러나 throw 문을 "실행"한 후 디버거는 다음 유효한 문으로 이동하여 예상 한대로 계속 실행합니다.

무슨 일이 일어 났습니까?

+2

FYI : 자신의 질문에 답변 할 때 디스플레이 하단에 "자신의 질문에 답하십시오"확인란이 있습니다. 내 생각에 사람들이 끼어 들지 않고 대답하는 것을 막을 수 있다고 생각합니다. –

+0

그래, 잊어 버렸어 :) 고마워. – Spook

답변

1

이러한 경우 일반적으로 해체 할 가치가 있습니다. 나는 jne 명령 (1)에서 중단 점을 설정

if (match.Groups.Count != 4) 

00000344 mov   rax,qword ptr [rbp+30h] 
00000348 mov   rax,qword ptr [rax] 
(...) 
00000399 test  eax,eax 
0000039b jne   00000000000003ED // (1) 

    throw new InvalidOperationException("Internal error: Invalid regular expression!"); 

0000039d lea   rdx,[00049AC0h] 
000003a4 mov   ecx,7000024Eh 
000003a9 call  000000005F7CC994 
(...) 
000003dc call  000000005ED32730 
000003e1 mov   rcx,qword ptr [rbp+000000F8h] 
000003e8 call  000000005F7CC64C 
000003ed nop // (2) 

    MyEnum myEnum; 
    try 
    { 

000003ee nop // (3) 

:처럼 내 경우는 보았다. 어셈블러를 많이 모르는 사람들을 위해 (조건부 명령문은 test과 같은 조건부 점프와 같이 컴파일되고 jne (j ump) ot와 같은 일종의 조건부 점프로 컴파일됩니다. e qual). 그래서 중단 점을 설정하는 장소는 실제로 throw 문을 실행할지 여부를 결정하는 최종 결정이었습니다.

스텝 오버 (F10) 후 디버거가 (2) 위치로 건너 뛰었으므로 throw 문을 올바르게 건너 뜁니다. 다시 알지 못하는 사람들을 위해서, nop (N o op eration)은 실제로는 아무 것도하지 않는 어셈블러 명령어입니다. 컴파일러는 일반적으로 그것을 사용하여 어셈블리 코드를 정렬하여 성능이 향상되도록합니다 (저수준 프로세서를 사용합니다).

그러나 컴파일러가 망쳐서 .pdb 파일에 정보를 저장 했으므로 nopthrow 문에 포함되어 있습니다. 디버거가 이것을 읽고 throw 문에 현재 명령 표식기를 배치합니다. 하지만 실제 어셈블리 코드가 정확했기 때문에 그냥 실행 (아무 것도하지 않음)하고 계속 실행했습니다.

누군가가 비슷한 문제를 겪고있는 경우를 대비하여이 예제를 남겨 두었습니다. 그 원인을 찾는 데 도움이되기를 바랍니다. 만날 수있는 것은 드물지만 누가 알겠습니까? ...

관련 문제