2009-07-07 5 views
0

때때로 모든 시스템에서 내 코드가 충돌합니다. 꽤 자주 내 사용자는 Windows 충돌 대화 상자의 스크린 샷을 보냅니다. 예를 들어, 나는 최근에 수신이 :Windows 크래시 대화 상자의 16 진수 의미

 
Unhandled win32 exception @ 0x3a009598 in launcher2g.exe: 
0xC00000005: Access violation writing location 0x00000000. 

그것은 나에게 분명 (때문에가 0xc0000005 코드뿐만 아니라 기입 오류 메시지) 내 launcher2g.exe 과정에서 어딘가에 널 포인터를 다음과 같은거야. 명확하지 않은 점은 '0x3a009598'숫자의 중요성입니다. 문제를 유발 한 어셈블러 명령어가 저장된 프로세스의 주소 공간에 코드 오프셋이 있습니까?

launcher2g.exe 모듈이 프로세스에로드 된 위치가 0x3a000000이라는 가정하에 Visual Studio 디버거를 사용하여 어셈블러 코드를 0x3a009598에서 확인했지만 불행히도 'int 3'명령이 많이있었습니다 (이것은 디버그 빌드이므로 많은 int 3 패딩이 있습니다.)

나는이 @ 0x12345678 숫자를 최대한 활용하는 방법을 항상 궁금해했다. 여기 누군가가 더 많은 설명을 들려 주거나 더 자세한 설명을 나눌 수 있다면 좋을 것이다.

UPDATE : Finding crash information using the MAP file : 사람이 미래에이 문제를 발견 경우, 여기에 내가 위에 인용 된 것과 같은 오류 메시지를 이해하는 방법에 대해 설명합니다 내가 찾은 매우 흥미로운 읽기입니다.

답변

2

0x3a009598은 충돌을 일으킨 x86 명령어의 주소입니다.

일반적으로 EXE는 기본 설정로드 주소 (일반적으로 0x04000000 iirc)로로드됩니다. 그래서 그것은 아마도 0x3a009598에서 멀리 피가 흘렀을 것입니다. 프로세스에 의해로드 된 일부 DLL은 아마도이 주소에 있습니다.

크래시 덤프는 일반적으로 사용자가 생성하여 보낼 수있는 경우 이러한 종류의 디버깅에 가장 유용한 방법입니다. Visual Studio 2005 이상에서로드하여 시스템 DLL의 자동 기호 확인을 얻을 수 있습니다.

다음 빌드 프로세스에 의해 생성 된 .map 파일은 문제가되는 기능을 결정하는 데 도움이됩니다. 충돌이 발생한 exe/dll 모듈과 실제로드 주소가 무엇인지 파악할 수 있다고 가정합니다.

XP 사용자는 DrWatsn32를 사용하여 크래시 덤프를 생성하고 보낼 수 있습니다. Vista 이상에서는 Windows 오류보고가 c : \ users \\ AppData \ Local \ Temp * .mdmp에 크래시 덤프를 씁니다.

+0

예, 해당 주소에 DLL이 있으며 어떤 경우인지 알 수 있습니다. 내 응용 프로그램과 연결되는 DLL을 개발했습니다.) Vista의 크래시 덤프에 대한 한 가지 의견 : 어떻게 든 사용할 수있게해야합니까? 몇 가지 충돌이 발생했지만 % TEMP %에서 mdmp 파일을 볼 수 없습니다. .map 파일에 대한 포인터를 보내 주셔서 감사합니다. –

+0

I * think * 사용자가 Windows 오류보고로 오류 보고서를 보내도록 선택한 경우에만 mdmp 파일이 나타날 수 있습니다. 분명히 적절한 인증서가있는 응용 프로그램 파일에 디지털 서명을하면 실제로 "MS에이 오류보고 및 수정 사항보기"대화 상자를 통해 제출하는 Microsoft의 크래시 덤프를 얻을 수있는 몇 가지 방법이 있습니다 보여줍니다. 이 옵션이 얼마나 쉽고 비용 효율적인지 조언 할 수는 없습니다. –