2014-01-13 9 views
0

24-7 디버거가없는 Win7 시스템을 실행해야하는 내 VB.NET 코드에서 크래시 덤프를 디버깅하려고합니다. 모든 모듈의 대상은 32 비트이므로 64 비트 항목을 시도하는 이유는 모르겠습니다.32 비트 대상을 선택한 경우 크래시 덤프가 64 비트를 표시합니다. 왜요?

디버거에 연결하려고하는데 실패 했으므로 중단됩니다. 나는 기계에 로그인하여 다시 추락 한 것을 발견, 그래서 나는 다음과 같은 추적에 멈추는 crashdump.DMP 파일을 만들 : 디버거가 원격으로 연결되어있는 경우 동일한 코드가 전혀 충돌하지 않습니다

wow64.dll!Wow64NotifyDebugger() + 0x1d bytes 
wow64.dll!HandleRaiseException() + 0xee bytes 
wow64.dll!Wow64NtRaiseException() + 0x88 bytes 
wow64.dll!whNtRaiseException() + 0x15 bytes  
wow64.dll!Wow64SystemServiceEx() + 0xd7 bytes 
wow64cpu.dll!TurboDispatchJumpAddressEnd() + 0x2d bytes  
wow64.dll!RunCpuSimulation() + 0xa bytes 
wow64.dll!Wow64LdrpInitialize() + 0x429 bytes 
ntdll.dll!LdrpInitializeProcess() + 0x1936 bytes 
ntdll.dll!string "Enabling heap debug options\n"() - 0x45fe9 bytes 
ntdll.dll!LdrInitializeThunk() + 0xe bytes 

또는 로컬.

아무에게도 무엇을 찾아 볼 수 있습니까? 디버거를 마음대로 설치하고 Debug.Writeline() 호출 결과를 볼 수 있도록 실행 파일을 Debug x86 빌드로 컴파일했습니다.

+0

해당 컴퓨터에 디버거가없는 경우 어떻게 크래시 덤프를 만드나요? 그리고 콜 스택에'ntdll.dll! string "이 포함되어 있어야합니다. 힙 디버그 옵션을 활성화하려면 \ n"()'? 이전에는 본 적이 없지만이 프로세스에서 사용할 수있는 Gflags 옵션이있을 수 있습니다. –

답변

0

64 비트 시스템에서 '32 비트 창 '은 호출을 32 비트에서 64 비트로 변환하는 wow64라는 에뮬레이션 레이어에서 실행됩니다. 그래서 정상입니다.

나는 당신의 질문에서 완전히 이해하지 못했습니다 : 예기치 않은 충돌/어떻게 든 디버거로 인한 것입니까?

+0

이것은 기술적으로 잘못되었습니다. 32 비트 코드는 ** 64 비트 Windows에서는 ** 에뮬레이트되지 않으며 통화는 변환되지 않습니다. 32 비트 및 64 비트 버전의 다양한 OS 제공 사용자 모드 라이브러리가 있으며 프로세스가 32 비트인지 64 비트인지에 따라 적절한 버전이로드됩니다. –

+2

@AndrewMedico 변환은 사용자 모드 DLL과이를 지원하는 시스템 호출 사이의 수준에서 수행됩니다. 그렇습니다. 정확한 비트 설정으로 많은 DLL을 얻지 만, 시스템/커널은 64 비트이기 때문에 번역이 진행됩니다. '에뮬레이트'가 너무 강한 단어 일 수 있습니까? 그러나 어떤면에서 볼 때 경로 리디렉션 등이 진행되는 것은 확실합니다. 따라서 시스템 호출을 변환하는 것보다 wow64에서 더 많은 일이 발생합니다. 따라서 '에뮬레이트'됩니다. – MicroVirus

0

이것은 정상입니다. "WOW64"는 Windows에서 64 비트 호환성 시스템의 32 비트 이름이며 64 비트 Windows 시스템에서 32 비트 코드를 실행하면 관련됩니다.

+0

실행 파일을 Debug x86 빌드로 컴파일하여 원하는대로 디버거를 연결하고 Debug.Writeline() 호출 결과를 볼 수 있습니다. – SMerrill8

+0

@ SMerrill8 : 예, 32 비트 디버거를 연결할 때 예. –