什么是符号文件

先不管什么是符号文件,先看看在没有符号文件支持时的情况,下面是VC8.0在没有符号文件支撑时的一个调用堆栈

下面是加载了PDB文件后的堆栈情况:

有没有发现最开始的稀奇古怪的十六进制符号都变成了函数名?这就是符号文件的魔力。

这里所说的“符号”就是“调试符号”,从软件调试的角度来讲,调试符号是将被调试的二进制程序和源程序联系起来的桥梁,很多重要的调试功能,例如源代码调试、栈回溯(如上表中的示例栈)、按名称显示函数或者变量名称等,都需要调试符号的支撑才能实现。

从编译器的角度来看,调试符号是编译器把源代码编译成二进制代码的过程中,为支持调试而摘录的调试信息,这些信息描述的目标对象主要包括:变量、变量类型、函数、标号(Label)、源代码行等。编译器或者其他专门的工具把这些信息收集提炼后输出到专门的文件中存储,这样的文件就是符号文件。

微软的编译器默认把这些符号信息保存在PDB文件中。PDB文件,是Program Database的缩写,从名字就知道,它专门用以描述(源)程序的数据库。其中的主要内容包括:

(1)代码所定义Class的类名,类成员的名字和类型;

(2) 变量的名字和类型;

(3) 函数的名字,函数的所有参数的名字和类型以及返回值。

PDB文件是微软定义的一种格式,微软并没有公开此文件的格式,但是提供了一组接口来访问此文件,即DIA(Microsoft Debug Interface Acess)。下面是有人开发一个用来查看PDB文件内容的一个工具的截图:

有了此PDB文件,当在调试器中试图读取某个内存地址的时候,调试器会尝试在对应的PDB文件中搜索,看这个内存地址是否有对应的符号。如果能够找到,调试器就会把这个符号显示出来,从而大大方便开发人员的调试。因此,在软件调试过程中,PDB文件是最为重要的信息,它比上面所说的map文件要重要的多。不过要使用PDB文件,需要专门的调试器的支持才行,例如VC、Windbg。

时间: 2024-10-05 03:16:31

什么是符号文件的相关文章

符号文件

1.1.  调试模式 1.debug模式:即直接从调试器里面启动程序,或按F5 2.验尸(post-mortem)调试:当你的程序发布给客户以后,客户在使用程序的过程中,可能会碰到一些很难重现的错误(bug).(包的crash)  这时操作系统可以将出错的程序的内存保存到一个文件(二进制文件)里面,然后你可以在自己的开发机上调试这个文件(找到这个二进制文件对应的PDB,然后找出相应的源码),找到程序错误的原因. 1.3.  符号文件(.pdb(Program Database File)) 符号

[转]Visual Studio调试之符号文件

http://www.cnblogs.com/killmyday/archive/2009/10/14/1582882.html 前面在不能设置断点的检查步骤和Visual Studio调试之断点进阶篇提到了调试符号文件及其作用,这篇文章我将要介绍调试符号文件的一些用法,如果你已经很熟悉调试文件的话,尽可以跳过本文. 调试符号文件为调试器提供了从二进制机器代码地址到源代码文本文件代码行的映射.因此有了符号文件,我们才能: 1.       设置断点,因为调试器需要符号文件提供的映射关系,将源代码

Capture新建元件符号文件

在许多情况下你可能只有器件的模型而没有在PSpice Capture 中使用的符号.在这种情况下,你需要创建符号文件(.olb).在许多情况下模型文件包含许多有子电路的器件模型.本节说明怎样用模型文件为模型文件中的器件创建相应的元件符号.模型文件是一个文本文件,可以用任何文本编辑器读取(例如,记事本).在许多情况下现有的厂商的Spice 文件使用扩展名.cir 或.mod. 一.在对应官网下载spice文件 二.创建符号文件 1.打开PSpice Model Editor 模型编辑器 2.Fil

D语言VisualD中在Release中如何使用符号文件

我们在使用try{}catch(Throwtable e){}时,输出堆栈信息时有符号文件才能知道错误在哪里发生. 新建工程,添加测试代码 import std.stdio; import std.string; void test_error() { throw new Exception("test"); } int main(string[] argv) { try { test_error(); } catch(Exception e) { writeln(e); } read

获取pe文件调试符号文件pdb路径

一般如果编译器设置了调试符号文件,则编译后的PE文件中调试字段会包含该路径,在一般的溯源分析中我们可能会注意到: 使用工具:pestudio 如下图,将文件加载进工具后,查看debug字段,可以发现pdb路径.注意:该路径不一定存在... 原文地址:http://blog.51cto.com/antivirusjo/2105150

linux下删除带特殊符号文件的方法

今天发现某个目录下面多了个"-exclude"目录,不知道是怎么产生的,直接rm -rf -exclude删掉,直接报rm:无效选项 - e错误,换成rm -rf \-exclude还是报同样的错误,后来找了点资料,终于干掉了,命令为: rm - -exclude /bin/rm -rf  \'

安全与加密之gpg,ssh服务

安全与加密 本章目录 gpg的使用 ssh服务 dropbear aide 1. gpg的使用 GPG是加密和数字签名的免费工具,大多用于加密信息的传递.除了仅用密码加密外,GPG最大的不同是提供了"公钥/私钥"对.利用你的"公钥"别人加密信息不再需要告诉你密码,随时随地都能发送加密信息.而这种加密是单向的,只有你的"私钥"能解开加密.数字签名又是另一大使用方向.通过签名认证,别人能确保发布的消息来自你,而且没有经过修改. 使用gpg实现对称加密

HOOK钩子技术5 SSDT Inline Hook

原理 内联钩子的原理在R3和R0下是相同的,就是不改变SSDT表项,而是改变函数内部前几条指令. 内联钩子的典型伪函数为: 恢复原指令 执行目标操作,或改写参数 执行原函数 返回时重新挂钩 demo #include "stdafx.h" #ifdef __cplusplus extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)

unix 文件属性

在unix下提到文件属性,不得不提的一个结构就是stat,stat结构一般定义如下: struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner