2014-01-13 54 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位调试器。 –

相关问题