2010-03-20 3 views
3

현재 처리되지 않은 예외가 발생했을 때 정보를 얻기 위해 콜백을 제공하기 위해 SetUnhandledExceptionFilter()을 사용했습니다. 그 콜백은 ExceptionAddress을 제공하는 EXCEPTION_RECORD을 제공합니다.C++ Win32 처리되지 않은 예외 처리기

[1] 실제로 무엇입니까 ExceptionAddress 무엇입니까? 예외를 제공하는 함수/코드의 주소 또는 일부 함수가 액세스하려고 시도한 메모리 주소입니까?

[2] 처리되지 않은 예외가 발생할 때 더 나은 정보를 줄 수있는 더 좋은 메커니즘이 있습니까? (나는 디버그 모드를 사용하거나 런타임 성능에 영향을주는 코드를 추가 할 수 없다. 가능한 한 빨리 코드를 실행할 때 충돌이 드물고 릴리스 빌드에서만 가능하다.)

[3] 몇 가지 방법이있다. 처리되지 않은 예외가 발생할 때 호출 스택 주소. 이 아마도 이미 DLL의 코드에 의해 발생 된 그 충돌을 가정하는 것이 좋다,

[4] 가정 ExceptionAddress 주소 A를 가지고, 나는 DLL X로드 및 기본 주소 A-xA+y에서 다른 DLL Y에서 실행해야 엑스?

답변

5

(1) ExceptionAddress은 예외의 원인이 된 코드의 주소입니다. 액세스 위반 오류 (0xC0000005)의 경우 예외 레코드의 추가 인수 중 하나는 읽기 또는 쓰기가 시도 된 주소를 보유하고 다른 인수는 읽기 또는 쓰기인지를 알려줍니다. 이것은 당신이 질문에서 제공하는 링크에 문서화되어 있습니다.

(2) no. 또한 릴리스 빌드에 디버그 정보를 추가해도 성능에는 영향을 미치지 않습니다. 이것을 확인하고 직접 볼 수 있습니다.

(3) dbghelp.dll은 충돌을 조사하기위한 완벽한 라이브러리를 제공합니다. ather의 사이에는 완전한 충돌 스택을 얻을 수있는 StackWalk64이 있습니다.

(4) ExceptionAddress을 인수로 사용하여 GetModuleHandleEx을 호출하면 문제가되는 코드가있는 DLL의 핸들을 얻을 수 있습니다. 어떤 DLL의 질문에 관해서는 을 말합니다. 크래시는 "CAUSED"의 정의에 따라 다릅니다. 한 dll에서 발생하는 크래시는 완전히 다른 관련이없는 dll의 버그 일 수 있습니다.

+0

(1) OK (2) 제 경우에는 릴리스 빌드에 대한 정보를 디버깅 할 때 충돌이 발생하지 않습니다. (3) 감사합니다. 사용법을 알려주세요. (4) 나는 이것을 시도 할 것이다. 덕분에 – uray

+0

다음은 Google의 호의에 따라 사용법을 보여주는 기본 튜토리얼입니다. http://jpassing.com/2008/03/12/walking-the-stack-of-the-current-thread/ – shoosh

0

직접적인 질문에 대한 대답,하지만 가능성이 당신이 필요로하는 무엇을 : http://www.codeproject.com/KB/debug/postmortemdebug_standalone1.aspx

사후 디버깅은 프로그램이 클라이언트 컴퓨터에 구축 릴리스에서 실행될 때 예외 장소를 찾을 수있는 방법입니다.

+0

그래, 나도 그걸 사용 했어.하지만 dev 쪽에서 미니 덤프를 읽는 데 시간이 많이 걸렸어. 나는 어디서 예외가 발생했는지 빨리 추측 할 필요가있다. – uray

0
또한

, 귀하의 질문에없는 직접적인 대답,하지만 난 당신을 도울 수 있다고 생각 :

http://www.codeproject.com/KB/applications/blackbox.aspx

그것은 당신에 스택 출력을 줄 것이다, 화면이나 파일을 읽을 수있는 출력을 생성합니다 다른 유용한 정보와 함께 예외가 발생한 위치를 찾으십시오.

그것은 저에게 좋았습니다.

"Blackbox revised"라는 향상된 버전이 있습니다. 현재 웹 사이트를 찾을 수 없습니다.

관련 문제