Debugging WinDbg符号分辨率

Debugging WinDbg符号分辨率,debugging,dll,windbg,symbols,Debugging,Dll,Windbg,Symbols,使用WinDbg时,应将专用符号文件(pdb?)放置在何处 我的情况是:我有一个DLL,我想调试。我有这个DLL的源代码和符号文件。此DLL由另一个DLL(我没有符号或源代码)调用,而另一个DLL又由EXE(我也没有符号或源代码)调用 我的问题是我收到了一个警告 ***警告:无法验证C:\TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll的校验和 我认为此警告是我在调用堆栈中收到以下类型消息的原因: 我的DLL!AClass::a函数+Some

使用WinDbg时,应将专用符号文件(pdb?)放置在何处

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

我的问题是我收到了一个警告

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

我认为此警告是我在调用堆栈中收到以下类型消息的原因:

我的DLL!AClass::a函数+SomeHexAddress

我的文件结构如下所示:

exe:C:\TheProgram\program.exe

调用dll:C\TheProgram\SomeSubfolder\caller

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


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

一个选项是将符号文件保留在原来的位置(即,在构建输出文件夹中),然后使用-yWinDbg命令行选项定位这些文件。使用此方法应确保符号文件始终是最新的

从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. 

只要能够告诉调试器私有符号文件在哪里,它们就放在哪里并不重要。 您看到的警告对堆栈跟踪没有任何影响,但事实上您缺少caller.DLL和app.EXE的符号。 在windbg(本地)中配置符号与使用以下命令一样简单:

.sympath[+]路径\u到\u pdbs
*和
.symfix+路径到系统pdb存储 你看: 我的DLL!AClass::a函数+SomeHexAddress 实际上,只要某个hexaddress是合理的(并且已经找到并加载了MyDll.pdb!),它就没有任何意义——它看起来像是一个正确的调用堆栈条目。 现在,我的问题是,你遇到的问题是什么?
另外,您不需要使用windbg使用.map文件。

作为构建过程的一部分,我们将私有PDB文件和发布的EXE/DLL文件复制到符号服务器。最简单的说,这只是一个UNC路径,但您可以将其配置为使用HTTP进行访问

要复制输出文件,请使用SYMSTORE.EXE程序

然后,配置调试器(我们使用visualstudio和WinDbg)以查看该路径。对于WinDbg,最简单的方法是设置环境变量:

_NT_SYMBOL_PATH=
    SRV*C:\WebSymbols*http://msdl.microsoft.com/download/symbols;
    \\symsvr\Symbols
(这应该都在一条线上)

这将WinDbg配置为查看Microsoft Symbol服务器(在C:\WebSymbols中缓存文件)和本地符号存储(
\\symsvr\Symbols


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

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

*** WARNING: Unable to verify checksum for C:\TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll
您还会问这样一个问题:“我应该在符号路径中将DLL的符号放在哪里?”

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

识别不匹配符号的步骤

  • !!sym噪音
  • .重新加载
  • x MyDll*类别*
    *这将重新加载dll,或者您可以键入kb以显示dll的调用堆栈,该调用堆栈也应加载dll。
  • !!sym安静
    *重置为原始安静符号加载 你也可以跑步

    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 
    
    正如罗杰在上面所建议的

    但是,如果您只是在本地拥有PDB,那么您可能希望在像这样转到符号服务器之前先放置到PDB的路径

    .sympath C:\TheProgram\SomeSubfolder\AnotherSubfolder\;SRV*c:\symcache*http://msdl.microsoft.com/download/symbols
    
    这样,在尝试使用Symbols服务器缓存之前,Windbg应该先查看SomSubFolder dir的本地

    谢谢,
    Aaron

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


    基本上,我并没有用它的修改版本替换驱动程序。使用
    devcon
    工具正确安装它,Windbg会再次感到高兴。

    那么我该如何使用它呢?键入命令提示符“WinDbg.exe-y BuildOutputFolderHere”?对我有效:WinDbg.exe-y“SRVc:\websymbols”在末尾省去分号。不知道为什么StackOverflow一直在添加。相关问题:StackOverflow.com/questions/2743323然而,它对我的windbg无效,我不知道为什么