分类: WINDOWS
2010-05-11 10:23:31
符号文件——Windows 应用程序调试必备
作者:Generad USam
一、何谓符号文件?
符号文件(Symbol
Files)是一个数据信息文件,它包含了应用程序二进制文件(比如:EXE、DLL等)调试信息,专门用来作调试之用,最终生成的可执行文件在运行时并
不需要这个符号文件,但你的程序中所有的变量信息都记录在这个文件中。所以调试应用程序时,这个文件是非常重要的。用
Visual C++ 和 WinDbg 调试程序时都要用到这个文件。
在 Windows 系统中,符号文件以 .pdb 为扩展名,比如:每个 Windows 操作系统下有一个 GDI32.dll
文件,编译器在编译该 DLL 的时候会产生一个 GDI32.pdb 文件,一旦你拥有了这个 PDB 文件,那么便可以用它来调试并跟踪到
GDI32.dll 内部。该文件和二进制文件的编译版本密切相关,比如修改了 DLL 的输出函数,再编译该 DLL,那么原先的 PDB
文件就过时了,不能再用老的 PDB 文件来做调试工作,而必须使用最新的 PDB 文件版本。
Visual C++ 编译代码后会在 Debug 或者 Release 目录下生成一个 PDB
文件。一般情况下,符号文件包括以下的数据信息:
二、如何得到和安装符号文件?
安装符号文件的注意事项:
如果是手动安装符号文件,有一点很重要,那就是宿主机(Hostt Computer)上的符号文件必须与目标机器(Target
Computer)上的 Windows 版本相匹配。
这里所谓的宿主机指的是运行调试会话的机器,在典型的双系统调试会话环境中,宿主机可以是连接到目标机器的任何机器。目标机器指的是发生软件组件、系
统服务、应用程序或操作系统运行失败的机器。也即是需要被调试的机器,它是调试会话关注的焦点。目标机器可以近在咫尺,也可以位于完全不同的地方。有时我
们也将目标机器称之为——被调试者(debuggee),那么与之对应,宿主机则可以称为调试者(debugger)。
三、在 Visual C++ 使用符号文件的方法
在 Visual C++ 6.0 中的使用方法:
在 Visual C++ .NET 2003 中的使用方法:
四、如何产生 Release 版本二进制文件对应的 PDB 文件?
在 Visual C++ 6.0 中的方法:
在 Visual C++ .NET 2003 中的方法:
图一
五、关于 Free Build(也称 Retail Build)和 Checked Build(也称 Debug Build)
每个基于 NT 操作系统有两种不同的程序生成模式,即:
Free Build
生成的是最终用户版本,针对生成的二进制文件进行了彻底的优化,禁用了调试断言,并剥离了调试信息。这样一来使可执行程序文件更小,加载更快,使用的内存
也更小。
Checked Build 生成的是测试和调试版本。它包含额外的 Free Build
所没有的错误检查,参数验证和调试信息,Checked
Build 有助于隔离和跟踪可能导致不可预见的行为的问题,比如内存溢出,不正确的设备配置。虽然 Checked Build
提供了额外的保护,但与 Free Build
比较,它需要更多的内存开销和磁盘空间。由于可执行程序包含符号调试信息;调试时要执行附加的代码、参数检查和输出调试诊断信息,从而导致性能下降。
六、系统符号文件的更新方法
系统符号文件指 Windows 操作系统依赖的那几个重要的 DLL/SYS
和可执行文件对应的符号文件,常见的比如:gdi32.dll、Kernel32.dll、Kerberos.dll、psapi.dll、
user32.dll等,使用
WinDbg 调试时,你就会发现系统符号文件(PDB)有多重要,这些文件都与本地的 OS 密切相关,比如,Windows 2000
打了SP补丁的话,那么必须更新系统符号文件才能进行相关调试,原来的符号文件与打补丁后的系统就会不匹配,怎么办呢?
可以通过网络来更新!象下面这样在 WinDbg 的 Symbols Path 里面输入路径:
SRV*D:\Symbols\websymbols*(斜体部分是你在本地保存符号文件的路径)