2014-01-13 83 views
0

我試圖從我的VB.NET代碼調試故障轉儲,應該運行24-7的Win7機器沒有調試器。所有模塊上的目標是32位,所以我不知道它爲什麼會嘗試64位的東西。當32bit目標被選擇時,Crashdump會顯示64bit。爲什麼?

看來它試圖附加到調試器並失敗,因此它會中止。 我登錄到機器,發現它再次崩潰,所以我做它停在下面的跟蹤一個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 x86版本,以便我可以隨意附加調試器並查看Debug.Writeline()調用輸出。

+0

如果該機器沒有調試器,您將如何創建故障轉儲?並且需要發生的事情是:callstack包含'ntdll.dll!string'啓用堆調試選項\ n「()'?我從來沒有見過,但也許有一些Gflags選項啓用此過程。 –

回答

0

在64位系統上,「32位窗口」在仿真層上運行,名爲wow64(您會看到),它將調用從32位轉換爲64位。所以這很正常。

我沒有完全從你的問題理解:是意外的崩潰/某種程度上由調試器造成的?

+0

這在技術上是錯誤的。在64位Windows上,32位代碼不是**模擬,並且調用不會被轉換。各種操作系統提供的用戶模式庫都有32位和64位版本,根據進程是32位還是64位來加載相應的版本。 –

+2

@AndrewMedico翻譯是在用戶模式DLL和支持它們的系統調用之間的級別完成的。 所以是的,你確實得到了很多正確的位設置的DLL,但由於系統/內核只有64位,所以有一個翻譯正在進行。 也許'模擬'是一個單詞太強大?但從某種意義上說,它當然也包括路徑重定向等等,也在繼續。所以在翻譯系統調用的時候會發生更多的事情,因此'模擬'。 – MicroVirus

0

這是完全正常的。 「WOW64」是Windows中32位64位兼容性系統的名稱,當您在64位Windows系統上運行32位代碼時會涉及該名稱。

+0

我已將可執行文件編譯爲Debug x86版本,因此我可以隨意附加調試程序並查看Debug.Writeline()調用輸出。 – SMerrill8

+0

@ SMerrill8:是的,當你連接一個32位調試器。 –

相關問題