【问题标题】:WinDbg symbol resolutionWinDbg 符号解析
【发布时间】:2010-10-03 01:44:06
【问题描述】:

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

我的情况是:我有一个要调试的 DLL。我有这个 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

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

【问题讨论】:

  • 相关问题:stackoverflow.com/questions/2743323

标签: debugging dll windbg symbols


【解决方案1】:

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

对我来说,基本上部署并没有用它的修改版本替换驱动程序。使用devcon工具正确安装,Windbg又开心了。

【讨论】:

    【解决方案2】:

    只要你能告诉调试器它们在哪里,你把私有符号文件放在哪里都没有关系。

    您看到的警告没有对堆栈跟踪有任何影响,但事实上您缺少 caller.DLL 和 app.EXE 的符号 确实 .

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

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

    你看到:

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

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

    附:您不需要带有 windbg 的 .map 文件。

    【讨论】:

      【解决方案3】:

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

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

      您还问了一个问题,“我应该将我的 DLL 的符号放在符号路径中的什么位置?”

      这是对第一个问题的回应:

      识别不匹配符号的步骤。

      1. !sym 嘈杂
      2. .重新加载
      3. x MyDll!*class*
        *这会重新加载您的 dll,或者您可以键入 kb 以显示应该加载它的 DLL 的调用堆栈。
      4. !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
      

      在尝试使用符号服务器缓存之前,Windbg 应该在您的 SomSubFolder 目录中看起来是本地的。

      谢谢, 亚伦

      【讨论】:

      • 但是,对我的windbg无效,不知道为什么
      【解决方案4】:

      作为构建过程的一部分,我们将私有 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)。

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

      【讨论】:

        【解决方案5】:

        一种选择是将符号文件保留在它们所在的位置(即在构建输出文件夹中),然后使用 -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”?
        • 为我工作:windbg.exe -y "SRVc:\websymbolsmsdl.microsoft.com/download/symbols"
        • 省略最后的分号。不知道为什么 StackOverflow 不断添加它。
        猜你喜欢
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-07
        • 2017-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多