2009-05-22 4 views
4

win32 API 함수에 대한 interop 호출을 사용하는 .net 프로세스에서 예외가 발생합니다. 디버거가 연결되어 있고 LastError 값을보고 싶습니다. Visual Studio 디버거에서 LastError 값을 볼 수 있습니까?LastError 값을 찾는 방법 .net 프로세스를 디버깅 할 때?

두 개의 메모 : 예외를 throw하는 프로세스는 내 것이 아니므로 소스 코드를 수정하여 LastError 값을 가져올 수 없습니다. 난 비주얼 스튜디오 2010 베타 버전을 사용하고
나는 VS 2008 작동하는 솔루션은 2010 년

감사와 함께 작동한다고 가정합니다.

답변

9

Marshal.GetLastWin32Error()으로 전화하면 마지막 Windows API 오류 메시지를받을 수 있습니다. 이는 제안 된 방법입니다 (P/Invoke 사용과 반대).

"GetLastWin32Error는 Kernel32.DLL에서 Win32 GetLastError API 메서드를 노출합니다.이 정보를 얻기 위해 GetLastError에 대한 직접 플랫폼 호출을 호출하는 것이 안전하지 않기 때문에이 메서드가 존재합니다.이 오류를 액세스하려면 코드를 사용하려면 GetLastError에 대한 자체 플랫폼 호출 정의를 작성하고 호출하는 대신 GetLastWin32Error를 호출해야합니다. 공용 언어 런타임은 GetLastError가 유지 관리되는 운영 체제를 덮어 쓰는 API를 내부적으로 호출 할 수 있습니다. " 소스를 수정하지의 측면에서 또한

는 :

이것은 Visual Studio를 직접 실행 창에서 작동은 호출이 DllImportAttribute.SetLastError로 장식 된 호출 /를 P를 제공했다. Windows API에 대한 P/Invoke 호출에서 해당 속성이 누락 되었다면 마샬링 API가 GetLastError의 값을 덮어 쓸 수 있기 때문에 운이 좋지 않을 것입니다.

+0

Marshal.GetLastWin32Error() - C#을 디버깅하는 동안 디버거 (조사 식 창)에서 작동합니다. - VS2010-Ultimate – hB0

3

"$ err"(this question 참조)을 보시기 바랍니다. 또한 P/Invoke 호출에 "SetLastError"를 추가하는 방법을 설명하는 this question을 살펴보십시오.

관련 문제