Windows应用程序调试-符号文件

一、何谓符号文件?

符号文件(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 文件。一般情况下,符号文件包括以下的数据信息:

全局变量(Global variables);

局部变量(Local variables);

函数名和它们的入口地址(Function names and the addresses of their entry points);

FPO 数据(Frame. Pointer Omission):Frame. Pointer 是一种用来在 调用堆栈(Call stack)中找到下一个将要被调用的函数的数据结构源代码的行序号 (Source-line numbers);

二、如何得到和安装符号文件?

先确定你的操 作系统(OS)版本;

到微软网站下载相应的符号文件;

安装符号文件,对 于符号文件的安装位置没有特贝要求,可以安装在任何目录中;

设置环境变量, 使得调试工具(比如:Visual C++、WinDbg、Ntsd、DrWatson 等)能找到符号文件;

安装符号文件的注意事项:

如果是手动安装符号文件,有一点很重要,那 就是宿主机(Hostt Computer)上的符号文件必须与目标机器(Target Computer)上的 Windows 版本相匹配。

这里所谓的宿主机指的是运行调试会话的机器,在典型的 双系统调试会话环境中,宿主机可以是连接到目标机器的任何机器。目标机器指的是发生 软件组件、系统服务、应用程序或操作系统运行失败的机器。也即是需要被调试的机器, 它是调试会话关注的焦点。目标机器可以近在咫尺,也可以位于完全不同的地方。有时我 们也将目标机器称之为——被调试者(debuggee),那么与之对应,宿主机则 可以称为调试者(debugger)。

三、在 Visual C++ 使用符号文件的方法

在 Visual C++ 6.0 中的使用方法:

打开 Visual C++ 6.0 的 Workspace 文件( *.dsw);

进入 Tools 菜单,选择 Options 菜单项 (Tools->Options);

单击 Directoties 标签;

在 “Show directories for”下拉 列表中选择 “Executable files”;

将符号文件的路径添加到 “Directories” 路径列表中;

单击 OK 完成;

在 Visual C++ .NET 2003 中的使用方法:

打开 Visual C++ .NET 的项目文件(*.vcproj) ;

在解决方案管理器中选中要使用符号文件的项目;

单击右键进入项目属 性对话框;

选择“配置属性”中的“调试”;

在与 “调试”对应的“操作”选项中有一个“符号路径”, 在此添加符号文件的路径即可;

单击 “确定” 完成;

四、 如何产生 Release 版本二进制文件对应的 PDB 文件?

在 Visual C++ 6.0 中的方 法:

打开 Visual C++ 6.0 的 Workspace 文件(*.dsw);

进入 Project 菜单,选择 Settings 菜单项 (Project->Settings),打开项目设置对话框;

在 “Settings for”列表中选择项目的 Release 配置;

单击 “C/C++”标签;

在“Category”下拉列表框中选择 “General”选项;

在“Debug info”下拉列表框中选择调 试信息格式(具体选项参见图一),在此不必禁用任何优化选项;

单击 “Link”标签;

在“Category”下拉列表框中选择 “Debug”选项;

选中“Debug info”复选框,然后选择需 要的链接调试类型(具体选项参见图一);

不要选择“Separate types”复选框;

在“Project options”编辑框的最后添加如下 指令:/opt:ref,icf;

重新生成(Rebuild)项目;

在 Visual C++ .NET 2003 中的方法:

打开 Visual C++ .NET 的项目文件(*.vcproj);

进入 Project 菜单,选择 Settings 菜单项 (Project->Settings),打开项目设置对话框 ;

在 “配置”下拉列表中选择项目的 “(活动) Release” 配置;

选择“配置属性”树型节点中的 “C/C++” ==〉“常规”;

设置右边的“调试信息格 式”选项(具体选项参见图一);

选择“配置属性”树型节点中 的“链接器”==〉“调试”;

设置右边的“生成程序 数据库文件”(具体选项参见图一);

选择“配置属性”树型节 点中的“链接器”==〉“命令行”;

在“附加选项 (D)”编辑框中添加如下指令:/opt:ref,icf;

按“确定”退出 ;

重新生成(Rebuild)项目;

541x112

图一

五、关于 Free Build(也称 Retail Build)和 Checked Build(也称 Debug Build)

每个基于 NT 操作系统有两种不同的程序生成模式,即:

Free Build (或 Retail Build)

Checked Build (或 Debug Build)

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*http://msdl.microsoft.com/download/symbols

(斜体部分是你在本地保存符号文件的路径)

如果你不是通过代理上网 ,那么在你用 WinDbg 打开一个被调试程序后,输入 symchk 回车,WinDbg 就会自动的 连到微软的网站根据你的机器的情况更新的 PDB 文件,并将它保存在上面斜体部分指定 的本地路径里,这样你就可以确保你的符号文件版本和你机器上的文件版本一致。

如果你是通过代理上网那么你需要配置 IE 的连接设置。具体方法恕不赘言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值