当我使用 Visual Studio(或 WinDBG)从另一台机器加载 Windows 进程转储文件时,它会显示很多消息,例如:
(从 Visual Studio 2005 输出)
'DumpDS20080626-103000-4204-4012.dmp': Loaded 'c:\symbols_cache\ntdll.dll\411096d4b7000\ntdll.dll', Symbols loaded (source information stripped).
'DumpDS20080626-103000-4204-4012.dmp': Loaded 'c:\symbols_cache\kernel32.dll\411096d4106000\kernel32.dll', Symbols loaded (source information stripped)
'DumpDS20080626-103000-4204-4012.dmp': Loaded 'c:\symbols_cache\wsock32.dll\41109712a000\wsock32.dll', Symbols loaded (source information stripped).
'DumpDS20080626-103000-4204-4012.dmp': Loaded 'c:\symbols_cache\winmm.dll\411096df2e000\winmm.dll', Symbols loaded (source information stripped).
...
这些消息表明调试器正在(正确地)从符号缓存(来自http://msdl.microsoft.com/download/symbols )加载所有这些系统 DLL 的确切版本。
但是,我也看到以下消息:
'DumpDS20080626-103000-4204-4012.dmp': Loaded '*C:\WINDOWS\system32\iphlpapi.dll', No matching binary found.
'DumpDS20080626-103000-4204-4012.dmp': Loaded 'C:\WINDOWS\system32\mfc42loc.dll', Binary was not built with debug information.
'DumpDS20080626-103000-4204-4012.dmp': Loaded '*C:\WINDOWS\system32\xpsp2res.dll', No matching binary found.
'DumpDS20080626-103000-4204-4012.dmp': Loaded '*C:\WINDOWS\system32\msjet35.dll', No matching binary found.
'DumpDS20080626-103000-4204-4012.dmp': Loaded '*C:\WINDOWS\system32\msjter35.dll', No matching binary found.
'DumpDS20080626-103000-4204-4012.dmp': Loaded '*C:\WINDOWS\system32\msjint35.dll', No matching binary found.
'DumpDS20080626-103000-4204-4012.dmp': Loaded '*C:\WINDOWS\system32\vbscript.dll', No matching binary found.
'DumpDS20080626-103000-4204-4012.dmp': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_3bf8fa05\mfc80u.dll', Symbols loaded.
'DumpDS20080626-103000-4204-4012.dmp': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700\msvcr80.dll', Symbols loaded.
...
所以似乎有一些文件,我的机器上安装的版本实际上与生成转储的机器上的 DLL 匹配,还有其他文件,我机器上的版本与位于机器上的二进制文件不匹配生成了转储,但显然 MS 符号服务器不包含这些 DLL 的任何 bin/符号。
上面列出的 DLL(iphlpapi.dll,...,msjint35.dll,...)肯定来自 MS,所以我想知道我是否遗漏了它们不是从符号服务器获取的任何内容?
还是我只需要处理我的进程(-dumps)中有没有符号的DLL,如果崩溃调用堆栈包含任何这样的DLL,我将不得不幸运地调用堆栈可用?
(注意:上面的输出只是一个例子。但是你几乎可以在任何加载的 DLL 中崩溃,因为你的程序可以将垃圾传递给任何 DLL 的任何调用。)