windbg 找到我的应用程序 pdb 文件,即使我没有透露它的路径
windbg finds my application pdb file even when I haven't revealed its path
- 我在文档下的默认项目文件夹中创建了一个简单的演示应用程序 (app.exe)。
- 我将 app.exe 复制到 c:\test\app 文件夹,但没有复制 pdb 文件。
我 运行 这个可执行文件带有 windbg(文件菜单 > 打开可执行文件)。我希望它找不到符号文件,但它确实找到了!
我将同情设置为 .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[=10=]B631FCA474F4F6FBBE54C497C5821361\msvcp120.i386.pdb
0f740000 0f82e000 MSVCR120 (private pdb symbols) c:\test\symbols\msvcr120.i386.pdbF5E2EF340A453ABC8B8F67DC6FD8082\msvcr120.i386.pdb
76860000 768a7000 KERNELBASE (pdb symbols) c:\test\symbols\wkernelbase.pdbBA6126FA6340F1ABFAE58DB8B7FB7D1\wkernelbase.pdb
769e0000 76af0000 kernel32 (pdb symbols) c:\test\symbols\wkernel32.pdb5F42F53681439D989AC0FC08F7F8F72\wkernel32.pdb
77210000 77390000 ntdll (pdb symbols) c:\test\symbols\wntdll.pdb\B5ACAC3B4A6C4515AF416D60366399652\wntdll.pdb
所以我是 运行ning 的可执行文件在 c:\test\app\app.exe
中,它如何在 my documents
文件夹中找到它的 pdb 文件?
我验证过,没有缓存。
应用程序在可执行文件本身中包含 PDB 文件的路径。您可以通过多种方式使其可见:
您可以验证,例如使用 Sysinternals Strings 实用程序:
strings app.exe | findstr ".pdb"
将输出 PDB 的完整路径。
实现类似结果的另一个工具(更专门用于调试)是 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
在 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
或者,首先找出模块的地址,然后转储 headers(这非常冗长)。
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
如果您不希望路径成为可执行文件的一部分,请检查是否有 compiler/linker 设置关闭此功能,例如/pdbpath:none
Microsoft Visual C++ 编译器。
如果您不希望调试器找到 PDB,请将 PDB 移至其他文件夹而不是可执行文件。
- 我在文档下的默认项目文件夹中创建了一个简单的演示应用程序 (app.exe)。
- 我将 app.exe 复制到 c:\test\app 文件夹,但没有复制 pdb 文件。
我 运行 这个可执行文件带有 windbg(文件菜单 > 打开可执行文件)。我希望它找不到符号文件,但它确实找到了!
我将同情设置为 .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[=10=]B631FCA474F4F6FBBE54C497C5821361\msvcp120.i386.pdb
0f740000 0f82e000 MSVCR120 (private pdb symbols) c:\test\symbols\msvcr120.i386.pdbF5E2EF340A453ABC8B8F67DC6FD8082\msvcr120.i386.pdb
76860000 768a7000 KERNELBASE (pdb symbols) c:\test\symbols\wkernelbase.pdbBA6126FA6340F1ABFAE58DB8B7FB7D1\wkernelbase.pdb
769e0000 76af0000 kernel32 (pdb symbols) c:\test\symbols\wkernel32.pdb5F42F53681439D989AC0FC08F7F8F72\wkernel32.pdb
77210000 77390000 ntdll (pdb symbols) c:\test\symbols\wntdll.pdb\B5ACAC3B4A6C4515AF416D60366399652\wntdll.pdb
所以我是 运行ning 的可执行文件在 c:\test\app\app.exe
中,它如何在 my documents
文件夹中找到它的 pdb 文件?
我验证过,没有缓存。
应用程序在可执行文件本身中包含 PDB 文件的路径。您可以通过多种方式使其可见:
您可以验证,例如使用 Sysinternals Strings 实用程序:
strings app.exe | findstr ".pdb"
将输出 PDB 的完整路径。
实现类似结果的另一个工具(更专门用于调试)是 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
在 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
或者,首先找出模块的地址,然后转储 headers(这非常冗长)。
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
如果您不希望路径成为可执行文件的一部分,请检查是否有 compiler/linker 设置关闭此功能,例如/pdbpath:none
Microsoft Visual C++ 编译器。
如果您不希望调试器找到 PDB,请将 PDB 移至其他文件夹而不是可执行文件。