`
liujianguangaaa
  • 浏览: 235142 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

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

  1. 全局变量(Global variables);
  2. 局部变量(Local variables);
  3. 函数名和它们的入口地址(Function names and the addresses of their entry points);
  4. FPO 数据(Frame Pointer Omission):Frame Pointer 是一种用来在调用堆栈(Call stack)中找到下一个将要被调用的函数的数据结构源代码的行序号(Source-line numbers);

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

  1. 先确定你的操作系统(OS)版本;
  2. 到微软网站下载相应的符号文件;
  3. 安装符号文件,对于符号文件的安装位置没有特贝要求,可以安装在任何目录中;
  4. 设置环境变量,使得调试工具(比如:Visual C++、WinDbg、Ntsd、DrWatson 等)能找到符号文件;

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

  如果是手动安装符号文件,有一点很重要,那就是宿主机(Hostt Computer)上的符号文件必须与目标机器(Target Computer)上的 Windows 版本相匹配。
  这里所谓的宿主机指的是运行调试会话的机器,在典型的双系统调试会话环境中,宿主机可以是连接到目标机器的任何机器。目标机器指的是发生软件组件、系 统服务、应用程序或操作系统运行失败的机器。也即是需要被调试的机器,它是调试会话关注的焦点。目标机器可以近在咫尺,也可以位于完全不同的地方。有时我 们也将目标机器称之为——被调试者(debuggee),那么与之对应,宿主机则可以称为调试者(debugger)。

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

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

  1. 打开 Visual C++ 6.0 的 Workspace 文件(*.dsw);
  2. 进入 Tools 菜单,选择 Options 菜单项 (Tools->Options);
  3. 单击 Directoties 标签;
  4. 在 “Show directories for”下拉列表中选择 “Executable files”;
  5. 将符号文件的路径添加到 “Directories” 路径列表中;
  6. 单击  OK 完成;

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

  1. 打开 Visual C++ .NET 的项目文件(*.vcproj);
  2. 在解决方案管理器中选中要使用符号文件的项目;
  3. 单击右键进入项目属性对话框;
  4. 选择“配置属性”中的“调试”;
  5. 在与“调试”对应的“操作”选项中有一个“符号路径”,在此添加符号文件的路径即可;
  6. 单击  “确定” 完成;

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

在 Visual C++ 6.0 中的方法:

  1. 打开 Visual C++ 6.0 的 Workspace 文件(*.dsw);
  2. 进入 Project 菜单,选择 Settings 菜单项 (Project->Settings),打开项目设置对话框;
  3. 在 “Settings for”列表中选择项目的 Release 配置;
  4. 单击“C/C++”标签;
  5. 在“Category”下拉列表框中选择“General”选项;
  6. 在“Debug info”下拉列表框中选择调试信息格式(具体选项参见图一),在此不必禁用任何优化选项;
  7. 单击“Link”标签;
  8. 在“Category”下拉列表框中选择“Debug”选项;
  9. 选中“Debug info”复选框,然后选择需要的链接调试类型(具体选项参见图一);
  10. 不要选择“Separate types”复选框;
  11. 在“Project options”编辑框的最后添加如下指令:/opt:ref,icf;
  12. 重新生成(Rebuild)项目;

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

  1. 打开 Visual C++ .NET 的项目文件(*.vcproj);
  2. 进入 Project 菜单,选择 Settings 菜单项 (Project->Settings),打开项目设置对话框;
  3. 在 “配置”下拉列表中选择项目的 “(活动)Release” 配置;
  4. 选择“配置属性”树型节点中的“C/C++” ==〉“常规”;
  5. 设置右边的“调试信息格式”选项(具体选项参见图一);
  6. 选择“配置属性”树型节点中的“链接器”==〉“调试”;
  7. 设置右边的“生成程序数据库文件”(具体选项参见图一);
  8. 选择“配置属性”树型节点中的“链接器”==〉“命令行”;
  9. 在“附加选项(D)”编辑框中添加如下指令:/opt:ref,icf;
  10. 按“确定”退出;
  11. 重新生成(Rebuild)项目;



图一

五、关于 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 的连接设置。具体方法恕不赘言。

分享到:
评论

相关推荐

    符号文件——Windows应用程序调试必备

    符号文件是Windows应用程序调试的必备部分,请需要的童鞋速度下起。

    windows驱动开发技术详解-part2

    学习和掌握Windows硬件驱动程序的开发是电子系统设计人员必备的能力。  本书是作者结合教学和科研实践经验编写而成的,不仅详细介绍了Windows内核原理,并且介绍了编 程技巧和应用实例,兼顾了在校研究生和工程...

    Windows驱动开发技术详解的光盘-part1

     从Windows最基本的两类驱动程序的编译、安装、调试入手讲解,非常容易上手,用实例详细讲解PCI、USB、虚拟串口、虚拟摄像头、SDIO等驱动程序的开发,归纳了多种调试驱动程序的高级技巧,如用WinDBG和VMWARE软件对...

    1——16内任意进制值转换

    例如,内存中的二进制数据可能会被转换为十六进制以方便查看和调试,或者用户输入的十进制数需要转换为二进制进行计算。因此,掌握进制转换是每位程序员的必备技能。 通过上述描述,我们可以编写一个简单的C语言...

    C#微软培训资料

    第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 3.5 小 结 .27 第二部分 C#程序设计基础.28 第四章 数 据 类 型 .28 4.1 值 类 型...

    AT_T汇编语言教程----学习内核必备知识

    ### AT&T汇编语言教程——理解Linux内核的必备知识 #### 重要性与应用场景 在操作系统(OS)的开发过程中,虽然大多数代码可以使用C/C++等高级语言编写,但与硬件紧密相关的部分以及对性能有极高要求的代码通常需要...

    Unix Programming Tools

    `gdb`提供了丰富的命令集,能够深入分析程序状态,是进行复杂程序调试不可或缺的工具。 #### emacs:全能的文本编辑器 `emacs`不仅仅是一个文本编辑器,它几乎是一个操作系统本身,具有高度可定制性和扩展性。`...

    汇编三件套debug、link、masm.zip

    `masm`全称为Microsoft Macro Assembler,是微软提供的一个汇编器,广泛应用于编写DOS和Windows下的汇编程序。`masm`支持宏指令,使得程序员可以定义并重复使用代码块,提高编写效率。`masm`使用`.asm`文件扩展名,...

    汇编语言程序设计教程

    汇编语言,作为计算机科学的基础,是直接对应机器语言的符号化表示,它允许程序员以更易读的形式编写程序,同时保持对硬件的直接控制。 汇编语言程序设计的关键知识点包括: 1. **基础知识**:首先要理解计算机的...

    java基础总结大全(笔记).doc

    Path配置了Windows系统中可执行文件的搜索路径,而Classpath则是Java类文件的搜索路径,确保JVM能找到所需的类文件。 变量是程序中存储数据的基本单元,定义变量是为了存储和重复使用同类型的常量。在逻辑运算中,`...

    汇编程序设计

    《汇编程序设计:探索选择结构与工具应用》 汇编语言,作为计算机科学的基础,是程序员与机器之间沟通的桥梁。它是一种低级编程语言,直接对应于计算机硬件的指令集,每条汇编指令通常对应一条机器码。虽然在现代...

    Visual C++ 编译链接信息手册

    5. **调试信息**:通过 `/Zi` 或 `/ZI` 选项生成调试信息,便于调试程序。 6. **链接器选项**:如 `/OPT`用于链接优化,`/NODEFAULTLIB`忽略默认库,`/SUBSYSTEM`指定可执行文件的子系统等。 **使用手册中的详细...

    计算机一级考试必备.pdf

    计算机——ENIAC诞生,开启了计算机时代。计算机发展历经四代,从电子管到晶体管,再到集成电路,最后发展到大规模集成电路。每一代的技术进步都极大地提升了计算机的性能和效率。 2. 计算机应用领域广泛,包括科学...

    汇编语言的调试软件(masm&link)

    《汇编语言的调试软件:MASM与LINK详解》 汇编语言,作为一种低级编程语言,直接对应机器指令,对于计算机系统底层的理解和优化有着不可替代的作用。在早期的计算机时代,尤其是在DOS环境下,汇编语言更是程序员的...

    MatLab与控制系统仿真(重点编程).docx

    MatLab 提供的集成开发环境——m 文件编辑器,支持文件的编辑、调试和运行,是进行程序开发的核心工具。用户可以通过这个编辑器创建、修改和管理 m 文件,进而实现复杂的控制系统仿真任务。 在进行控制系统仿真时,...

    c语言简洁实用笔记,嵌入式开发必备

    ### C语言简洁实用笔记——嵌入式开发必备 #### 一、解决提示窗一闪而过的两种方法 在C语言编程中,特别是在Windows环境下使用Visual Studio进行编译时,可能会遇到程序运行后窗口立即关闭的问题。这通常是由于...

    matlab.zip_matlab_matlab 中文帮助_matlab中文文档_matlab文档_zip

    通过编写M文件,用户可以自定义函数并进行程序调试。MATLAB的调试工具提供了设置断点、单步执行、查看变量值等功能,有助于找出和修复代码中的错误。 四、MATLAB图形系统 MATLAB的图形功能强大,可以生成各种类型...

Global site tag (gtag.js) - Google Analytics