【问题标题】:windbg finds my application pdb file even when I haven't revealed its path即使我没有透露它的路径,windbg 也会找到我的应用程序 pdb 文件
【发布时间】:2016-07-07 06:23:24
【问题描述】:
  1. 我在文档下的默认项目文件夹中创建了一个简单的演示应用程序 (app.exe)。
  2. 我将 app.exe 复制到 c:\test\app 文件夹,而没有复制 pdb 文件。

我用windbg 运行这个可执行文件(文件菜单> 打开可执行文件)。我希望它找不到符号文件,但它确实找到了!

我将 sympath 设置为 .sympath srv*c:\test\Symbols*https://msdl.microsoft.com/download/symbols

lm 的输出是

0:000> lm
start    end        module name
013b0000 013b8000   App      C (private pdb symbols)  c:\users\username\documents\visual studio 2013\Projects\App\Release\App.pdb
0f500000 0f571000   MSVCP120   (private pdb symbols)  c:\test\symbols\msvcp120.i386.pdb\0B631FCA474F4F6FBBE54C497C5821361\msvcp120.i386.pdb
0f740000 0f82e000   MSVCR120   (private pdb symbols)  c:\test\symbols\msvcr120.i386.pdb\16F5E2EF340A453ABC8B8F67DC6FD8082\msvcr120.i386.pdb
76860000 768a7000   KERNELBASE   (pdb symbols)          c:\test\symbols\wkernelbase.pdb\90BA6126FA6340F1ABFAE58DB8B7FB7D1\wkernelbase.pdb
769e0000 76af0000   kernel32   (pdb symbols)          c:\test\symbols\wkernel32.pdb\515F42F53681439D989AC0FC08F7F8F72\wkernel32.pdb
77210000 77390000   ntdll      (pdb symbols)          c:\test\symbols\wntdll.pdb\B5ACAC3B4A6C4515AF416D60366399652\wntdll.pdb

所以我正在运行的可执行文件在c:\test\app\app.exe,它是如何在my documents文件夹中找到它的pdb文件的?

我验证了,没有缓存。

【问题讨论】:

  • 哦,不,一个有效的工具。哎哟。

标签: c++ windbg


【解决方案1】:

应用程序在可执行文件本身中包含 PDB 文件的路径。您可以通过多种方式使其可见:

  1. 您可以验证,例如使用Sysinternals Strings 实用程序:

    strings app.exe | findstr ".pdb"
    

    将输出到 PDB 的完整路径。

  2. 另一个实现类似结果的工具(更具体一点的调试)是DebugDir

    E:\[...]\DebugDir>DebugDir.exe "E:\[...]\Reporter.exe"
    File: E:\[...]\Reporter.exe
    Number of entries in debug directory: 1
    
    Debug directory entry 1:
    Type: 2 ( CodeView )
    TimeStamp: 5772e493  Characteristics: 0  MajorVer: 0  MinorVer: 0
    Size: 120  RVA: 000ba482  FileOffset: 000b8682
    CodeView format: RSDS
    Signature: {eac36e37-78c5-47c5-bc95-7c6e5896f694}  Age: 1
    PdbFile: E:\[...]\obj\Debug\Reporter.pdb
    
  3. 在 WinDbg 本身中,使用!lmi

    0:009> !lmi Reporter
    [...]
    Debug Data Dirs: Type  Size     VA  Pointer
                 CODEVIEW    77, 82cf2,   80ef2 RSDS - GUID: {588CF7EE-FA7C-44F9-850C-382520749BE8}
                   Age: 1, Pdb: E:\[...]\obj\Debug\Reporter.pdb
        Symbol Type: DEFERRED - No error - symbol load deferred
        Load Report: no symbols loaded
    

    或者,首先找出模块的地址,然后转储标头(这很冗长)。

    0:009> lm m Reporter
    start    end        module name
    002c0000 00350000   Reporter   (deferred)             
    
    0:009> !dh 002c0000 
    [...]
    Debug Directories(1)
        Type       Size     Address  Pointer
        cv           77       82cf2    80ef2    Format: RSDS, guid, 1,     E:\[...]\obj\Debug\Reporter.pdb
    

如果您不希望路径成为可执行文件的一部分,请检查是否存在关闭此功能的编译器/链接器设置,例如/pdbpath:none 用于 Microsoft Visual C++ 编译器。

如果您不希望调试器找到 PDB,请将 PDB 移动到其他文件夹而不是可执行文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多