2

当我使用 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 的任何调用。)

4

1 回答 1

3

不幸的是,在 MS 上保持最新符号的过程似乎是由一群驴子运行的,其中大部分在几年前就死了,其余的只在 5 月的第二个星期四进行轮班模式,只要满月发生在一月的一个星期日。

因此,您可以期望(不)找到很多丢失的符号,并且对此无能为力。运行 Fiddler 将允许您检查对符号的调用是否正确并由 symserv 进行 404 处理,但除此之外,您只需要这样做。

我不知道为什么整个业务在 10 年前没有自动化,所以没有人会在不发布符号的情况下从 MS 发布任何东西,但事实并非如此。

于 2011-04-19T18:33:03.350 回答