35

使用 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 上调试..

4

5 回答 5

47

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

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

您还问了一个问题,“我应该将我的 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 

正如罗杰在上面所建议的......

但是,如果您只有本地 PDB,您可能希望先放置 PDB 的路径,然后再像这样进入符号服务器

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

这样,在尝试使用 Symbols Server 缓存之前,Windbg 应该在您的 SomSubFolder 目录中看起来是本地的。

谢谢,亚伦

于 2009-02-21T21:46:29.657 回答
4

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

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

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

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

你看到:

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

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

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

于 2009-01-23T09:55:06.873 回答
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)。

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

于 2009-01-23T10:25:36.483 回答
2

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

从微软帮助:

-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. 
于 2009-01-23T04:15:13.143 回答
0

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

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

于 2020-10-30T00:31:28.853 回答