1

managed.exe 中的 MyManagedFunc 调用 unmanaged.dll 中的 MyUnmanagedFunc()。我使用 Win32 在 unmanaged.dll 中生成了一个小型转储。设置未处理异常过滤器。我可以在调用堆栈中看到 MyUnmanagedFunc,但在托管端没有任何用处。

我应该能够使用 WinDbg 和 SOS.dll 来查看托管调用,对吗?下面是我的 WinDbg 会话。我究竟做错了什么?

可执行搜索路径为:
Windows XP 版本 2600 (Service Pack 3) MP (4 procs) 免费 x86 兼容
产品:WinNt,套件:SingleUserTS
机器名称:
调试会话时间:Fri Sep 25 12:59:28.000 2009 (GMT-5)
系统正常运行时间:不可用
处理正常运行时间:0 天 0:00:08.000
……………………………………………………………………………………………………………………………………
此转储文件中存储了一个感兴趣的异常。
可以通过 .ecxr 访问存储的异常信息。
(da0.1340):整数除以零 - 代码 c0000094(第一次/第二次机会不可用)
eax=03a50000 ebx=001a2578 ecx=00000007 edx=7c90e514 esi=001a2550 edi=001a25a8
eip=7c90e514 esp=0012dd24 ebp=0012dd34 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
*** 错误:找不到符号文件。默认为 ntdll.dll 导出符号 -
ntdll!KiFastSystemCallRet:
7c90e514 c3 ret
*** 错误:找不到符号文件。默认为 kernel32.dll 导出符号 -
0:000> .loadby sos mscorwks
0:000> !线程
*** 错误:找不到符号文件。默认为 mscorwks.dll 导出符号 -
未加载 mscorwks.dll 的 PDB 符号
请求线程存储失败
0:000> .ecxr
eax=0000000c ebx=00160c20 ecx=00000000 edx=00000000 esi=0012efb8 edi=0012eea4
eip=01201712 esp=0012edd8 ebp=0012eea4 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010206
*** 警告:无法验证 NativeDLL.dll 的校验和
NativeDLL!MyBad+0x22:
01201712 f77d0c idiv eax,dword ptr [ebp+0Ch] ss:0023:0012eeb0=00000000
*** 警告:无法验证 System.Windows.Forms.ni.dll 的校验和
*** 错误:模块加载完成,但无法为 System.Windows.Forms.ni.dll 加载符号

4

2 回答 2

1

从您的输出来看,您没有设置正确的符号路径。使用命令 .symfix 使 WinDbg 使用默认的公共 Microsoft 符号服务器(带有本地缓存​​)。如果您想在会话输出中包含任何详细信息,则需要这样做。有关设置符号的更多信息,请查看 WinDbg 帮助文件(使用 .hh 从 WinDbg 命令窗口启动它)。

从当前输出看来,您在线程 da0.1340 上有一个被零除的异常。但是,如果没有正确设置,您的 sos 命令不会产生有用的信息。

于 2009-09-25T18:29:27.057 回答
1

minidump 类型必须是 MiniDumpWithFullMemory。如果不是那种类型,就没有“ThreadStore”。

于 2009-09-26T07:06:57.130 回答