2008-10-01 5 views
45

C/C++ 코드를 단계별 실행하면서 실패한 Win32 API를 호출했습니다 (일반적으로 도움이되지 않는 일반적인 오류 코드 (예 : 0)을 반환 함). 코드에서 후속 오류 정보를 검사 할 수있는 반환 값을 가진 후속 GetLastError() 호출을하지 않습니다.Visual Studio에서 디버깅하는 동안 GetLastError()를 실행하는 방법

오류를 재 컴파일하지 않고 재현하지 않고 어떻게 오류 값을 얻을 수 있습니까? 조사 식 창에 "GetLastError()"를 입력해도 작동하지 않습니다 ("구문 오류"). 시계 창에서

답변

56

몇 번 언급했듯이 @err 의사 레지스터는 마지막 오류 값을 표시하고 @err,hr은 오류를 문자열로 표시합니다 (가능한 경우).

VS (Visual Studio .NET 2002)부터 시작하여 '@'문자를 사용하여 가상 레지스터를 나타내는 Visual Studio 팀원 인 Andy Pennell에 따르면 '$' ($err,hr에서와 같이). 당분간 $와 @ 둘 다 지원됩니다.

조건부 중단 점에서 $ err 의사 레지스터를 사용할 수도 있습니다. 따라서 마지막 오류가 0이 아닌 경우에만 코드 행을 중단 할 수 있습니다. 매우 편리한 트릭이 될 수 있습니다.

일부 다른 의사가 (존 로빈스 '뛰어난 책, "Debugging Applications for Microsoft .NET and Microsoft Windows")를 사용하면 편리하게 찾을 수 있음을 등록합니다 - 스레드 정보가

  • $clk을 차단 보여줍니다 -
    • $tib

      타이밍에 유용한 클럭 수를 (보여줍니다 함수). 이것을보다 쉽게 ​​사용하려면 $clk 시계를 넣고 $clk=0 시계를 추가하십시오. 두 번째 시계는 현재 값을 표시 한 후 의사 레지스터를 지우므로 다음 단계 또는 단계를 수행하면 해당 작업에 대한 시간 만 제공됩니다. 이것은 디버거 오버 헤드의 상당 부분을 포함하는 대략적인 타이밍이지만 여전히 유용 할 수 있습니다.
  • +0

    그들은 '$'에 대한 깊은 따뜻한 감정을 가지고있다. 도스의 '$'로 끝나는 문자열을 기억하십시오. 상징주의에 대해 이야기해라. – Constantin

    +2

    Heh - 우스운 이야기. 이유는 WinDbg 및 해당 사촌 인 ntsd/cdb와 함께 VS 디버거를 사용하려고하기 때문입니다. –

    6

    ERR,hr은 일반적으로 트릭

    +1

    @ err, hr으로 변경하면 금세입니다. – Constantin

    +0

    왜 그렇게해야합니까? ERR, hr은 나를 위해 잘 작동합니다. – QBziZ

    +0

    예를 들어 범위에 'ERR' 변수가있을 수 있습니다. 그러면 마지막 오류 코드와 다른 것을 인쇄 할 수 있습니다. – solgar

    0

    "편집하고 계속"오류를 (그냥 저장하는 새로운 글로벌 변수를 작성하지 않습니다) 볼 수 있도록 코드를 추가를한다. 이런 종류의 오류 처리 코드를 실행하는 기존 함수를 신속하게 호출 할 수 있다면 정말 잘 작동합니다.

    보너스로 향후 새 코드도 남겨 둘 수 있습니다.

    이렇게 할 수 없다면 QBziZ는 "ERR, hr"이 맞습니다.

    +1

    편집하고 계속 코드의 큰 부분에서 잘 작동하지 않는다 –

    관련 문제