在我的应用程序中,每当我的应用程序崩溃时,我都会使用 MiniDumpWriteDump 函数(请参阅 dbghelp.dll)来编写崩溃转储文件。
我还使用符号服务器来存储我所有的可执行文件和 pdb 文件,这样每当客户向我发送故障转储文件时,调试器就会自动获取正确版本的可执行文件和调试信息。
我还将 Windows DLL(ntdll.dll、kernel32.dll、...)及其调试信息存储在符号服务器中(使用 SymChk)。调试信息是从 Microsoft 的公共符号服务器获取的。
大多数情况下,这很完美,除非:
- 客户在其中一个 Windows DLL 中崩溃
- 并且客户使用我没有放入符号服务器的 DLL
这是因为在 Symbol Server 中存储每个 Windows DLL 的每个风格是完全不可撤销的(尤其是每周的补丁)。
因此,如果客户崩溃了,比如说 NTDLL.DLL 的 5.2.123.456 版本,而我没有将这个确切版本的 DLL 放在我的符号服务器中,那么我就被卡住了。甚至微软的公共符号服务器也无济于事,因为它只提供调试信息,而不是 DLL 本身。
我目前的解决方案是向客户索要他的 DLL,但这并不总是那么容易。因此,我正在寻找更好的解决方案。
有没有办法让调试器显示正确的调用堆栈,或者加载特定 DLL 的调试信息,即使您没有 DLL 的确切版本?
或者,有没有办法获得所有(或重要的)Windows DLL(来自 Microsoft)的所有版本?
编辑:
与此同时,我找到了一个非常简单的方法来解决这个问题。使用实用程序 ModuleRescue(请参阅http://www.debuginfo.com/tools/modulerescue.html),您可以从 minidump 文件生成虚拟 DLL。有了这些虚拟 DLL,调试器就满足了,并正确地开始从 Microsoft 服务器加载调试符号。