WinDbg符号解析

35

使用WinDbg调试时,私有符号文件(pdb?)应放置在何处?

我的情况是:我有一个需要调试的DLL。我拥有此DLL的源代码和符号文件。这个DLL被另一个DLL调用(我没有符号或源代码),然后由一个EXE调用(我也没有符号或源代码)。

我的问题是,我收到了一个警告,内容如下:

*** 警告: 无法验证C:\TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll的校验和

我认为这个警告就是导致我在调用堆栈中看到以下信息的原因:

MyDll!AClass::AFunction+SomeHexAddress

我的文件结构类似于这样:

exe: C:\TheProgram\program.exe

调用的dll: C\TheProgram\SomeSubfolder\caller.???

我想要调试的DLL: C:\TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll

注意:我将符号文件路径和源文件路径设置为调试DLL在工作区中生成的位置,且与exe不在同一驱动器上。但我复制了pdb+map文件并将其放在我想要调试的dll上。


相关问题:stackoverflow.com/questions/2743323 - denfromufa
5个回答

47

抱歉回复晚了。
在你的帖子中,你提到看到了以下错误信息。

*** WARNING: Unable to verify checksum for C:\TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll

你也问了这个问题:“我应该把我的DLL符号放在哪里的符号路径中?”

这是针对第一个问题的答复:

识别不匹配符号的步骤。

  1. !sym noisy
  2. .reload
  3. x MyDll!*class*
    *这会重新加载你的dll,或者你可以输入kb来显示DLL的调用栈,它也应该会加载它。
  4. !sym quiet
    *重置回原始的安静符号加载

此外,你还可以运行

0:001> lmv m myDll  *(and examine the Checksum)

注意:如果您有一个校验和,则Windbg可以将DLL的校验和与PDB的校验和进行匹配。每个开发环境都有不同的方式来生成校验和。

以下是关于PDB放置位置的问题的回答

如果您已经将MyDll.pdb添加到符号存储中,那么您可以使用以下语法:

.sympath SRV*c:\symcache*http://msdl.microsoft.com/download/symbols 

正如Roger上面建议的那样...

但是如果您只有本地的PDB文件,您可能希望先将PDB文件的路径放在符号服务器之前,像这样:

.sympath C:\TheProgram\SomeSubfolder\AnotherSubfolder\;SRV*c:\symcache*http://msdl.microsoft.com/download/symbols

这样,Windbg在尝试使用符号服务器缓存之前,应该先查找您的SomSubFolder目录。

谢谢, Aaron


然而,对于我的windbg来说并不有效,我不知道为什么。 - peng xu

4

只要你能告诉调试器它们在哪里,私有符号文件放在哪里并不重要。

你看到的警告对堆栈跟踪没有任何影响,但是你丢失了调用者DLL和应用程序EXE的符号。

在windbg中配置符号(本地)就像使用以下命令一样简单:

.sympath[+] path_to_pdbs
*和
.symfix+ path_to_system_pdb_store

你看到的:

MyDll!AClass::AFunction+SomeHexAddress
只要SomeHexAddress是合理的(并且已经找到并加载了MyDll.pdb!),实际上并没有意义 - 它看起来像一个正确的调用堆栈条目。

现在,我的问题是,你遇到了什么问题?

P.S.你不需要.windbg文件。


3
作为我们构建过程的一部分,我们会将私有PDB文件和发布的EXE/DLL文件复制到符号服务器上。最简单的方式就是使用UNC路径,但你也可以配置HTTP访问。
使用SYMSTORE.EXE程序来复制你的输出文件。
然后,配置你的调试器(我们使用Visual Studio和WinDbg)以查找该路径。对于WinDbg而言,最简单的方法是设置一个环境变量:
_NT_SYMBOL_PATH=
    SRV*C:\WebSymbols*http://msdl.microsoft.com/download/symbols;
    \\symsvr\Symbols

(所有内容都应在一行上)

这将配置WinDbg查找Microsoft符号服务器(将文件缓存到C:\ WebSymbols中),并且还会查找本地符号存储(\\symsvr\Symbols)。

我们还使用Source Server工具将SVN详细信息存储在PDB文件中,这意味着我们可以返回到用于构建特定版本的确切源文件。请查看...\Debugging Tools for Windows (x86)\srcsrv


2

一种选择是将符号文件保留在它们所在的位置(即构建输出文件夹中),然后使用-y WinDbg 命令行选项来定位这些文件。使用此方法应该可以保证符号文件始终是最新的。

根据 Microsoft 帮助文档:

-y SymbolPath 
Specifies the symbol search path. Separate multiple paths with a 
semicolon (;). If the path contains spaces, it should be enclosed 
in quotation marks. For details, and for other ways to change this 
path, see Symbol Path. 

那么我该如何使用它?在命令提示符中输入“WinDbg.exe -y BuildOutputFolderHere”即可。 - krebstar
对我来说可以用:windbg.exe -y "SRVc:\websymbolshttp://msdl.microsoft.com/download/symbols" - mhenry1384
在末尾不要加分号。不知道为什么StackOverflow会自动添加。 - mhenry1384

0
事实证明,我的目标机器 - 在Visual Studio中配置 - 在部署时没有获得最新的构建版本,因此出现了“driver.sys符号不匹配”的错误。
基本上,部署没有为我替换驱动程序的修改版本。使用devcon工具来正确安装它,Windbg就会再次正常运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接