WinDbg符号解析

时间:2009-01-23 03:03:10

标签: debugging dll windbg symbols

使用WinDbg时,应该在哪里放置私有符号文件(pdb?)?

我的情况是:我有一个我想调试的DLL。我有这个DLL的源代码和符号文件。这个DLL由另一个DLL(我没有符号或源代码)调用,而这些DLL又由EXE调用(我也没有符号或源代码)。

我的问题是我收到一条警告

  

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

我认为这个警告是我在调用堆栈中获取以下类型消息的原因:

  

MYDLL!ACLASS ::机能缺失+ SomeHexAddress

我的文件结构如下所示:

exe:C:\ TheProgram \ program.exe

调用dll:C \ TheProgram \ SomeSubfolder \ caller。???

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

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

5 个答案:

答案 0 :(得分:45)

很抱歉迟到的回复 在您的帖子中,您提到您看到以下错误消息。

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

您还会问一个问题,“我在哪里将我的符号放在符号路径中?”

以下是针对第一个问题的回复:

识别不匹配符号的步骤。

       
  1. !sym吵闹    
  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目录的本地。

谢谢, 亚伦

答案 1 :(得分:4)

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

您看到的警告不会对堆栈跟踪产生任何影响,但是您缺少caller.DLL和app.EXE 的符号这一事实的。

在windbg(本地)中配置符号就像使用:

一样简单
.sympath [+] path_to_pdbs
*和
.symfix + path_to_system_pdb_store

你看到了:

MYDLL!ACLASS ::机能缺失+ SomeHexAddress
实际上没有任何意义,只要SomeHexAddress是合理的(并且只要找到并加载了MyDll.pdb!) - 它看起来像一个正确的调用堆栈条目。

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

P.S。你不需要带有windbg的.map文件。

答案 2 :(得分: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 Symbol Server(缓存C:\ WebSymbols中的文件),还可以查找本地符号存储(\\symsvr\Symbols)。

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

答案 3 :(得分: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. 

答案 4 :(得分:0)

事实证明,在Visual Studio中配置的我的目标计算机在将目标计算机部署到它时没有获得最新的版本,因此出现“ driver.sys具有不匹配的符号”错误。

对于我来说,基本部署并没有使用驱动程序的修改版本替换驱动程序。使用devcon工具正确安装它,Windbg会再次高兴。