当我使用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,所以我想知道我是否遗漏了任何不是从符号中取出的内容服务器
或者我只需要处理我的进程中的DLL(-dumps)没有符号的事实,如果崩溃调用堆栈包含任何此类DLL,我必须幸运的是调用堆栈可用吗?
(注意:上面的输出只是一个例子。但是你可以在任何加载的DLL中崩溃,因为你的程序可以将垃圾传递给任何DLL的任何调用。)
答案 0 :(得分:3)
不幸的是,在MS上保持最新符号的过程似乎是由一群驴子来完成的,其中大部分驴子在几年前就已经死亡,而其余的驴子只能在一个轮班模式中工作,其中包括交替的第二个星期四。五月,只要满月发生在一月的一个星期天。
所以你可以期待(不)找到许多缺失的符号,并且没有什么可以做的。运行Fiddler将允许您通过symserv检查符号调用是否正确并且404'd,但除此之外,您不得不这样做。
我不知道为什么10年前整个业务都没有自动化,所以没有人会在没有发布符号的情况下从MS中发布任何内容,但事实并非如此。