您的位置:首页 > 编程语言 > C语言/C++

调试之pdb文件(C++)

2014-02-25 15:04 477 查看
pdb:program database

一、内容

* public,private 和static函数地址;

* 全局变量的名字和地址;

* 参数和局部变量的名字和在堆栈的偏移量;

* class,structure 和数据的类型定义;

* Frame Pointer Omission 数据,用来在x86上的native堆栈的遍历;

* 源代码文件的名字和行数;

二、作用

用来帮助软件的调试的。(废话)

原理:当你加载一个模块到进程的地址空间的时候,debugger用1中信息来找到相应的PDB文件。第一个毫无疑问就是文件的名字,如果加载 zzz.dll,debugger则查找zzz.pdb文件。在文件名字相同的情况下debugger还通过嵌入到PDB和binay的GUID来确保
PDB和binay的真正的匹配。 所以即使没有任何的代码修改,昨天的binay和今天的PDB是不能匹配的。可以使用dempbin.exe来查看binary的GUID。 这也是为什么说一定要“pdb文件和dll文件相对应”的原因

三、生成

link.exe 的时候,在/DEBUG的情况下选择/Zi选项(C++),具体请查看MSDN的链接器选项

MSDN正解:当用 /ZI 或 /Zi 编译 C/C++ 程序时或用 /debug 编译 Visual Basic/C#/JScript .NET 程序时将创建 PDB 文件。

四、debug和release下的pdb文件

Debug里的PDB是full,保存着调试和项目状态信息、有断言、堆栈检查等代码。

Release 里的PDB是pdb-only,基本上:出什么错了+错误在哪行。

链接器将创建 project.PDB,它包含项目的 EXE 文件的调试信息。project.PDB 包含完整的调试信息(包括函数原型),而不仅仅是 VCx0.PDB 中的类型信息。这两个 PDB 文件都允许增量更新。

Visual Studio 调试器使用由链接器直接创建的 project.PDB 文件并将此 PDB 的绝对路径嵌入到 EXE 或 DLL 文件中。如果调试器在该位置无法找到 PDB 文件或者如果路径无效(例如,如果项目被移动到了另一台计算机上),调试器将搜索包含 EXE 的路径,即在解决方案的“属性页”中指定的“符号路径”(“调试符号文件”页 ->“通用属性”文件夹)。调试器不会加载与所调试的二进制不匹配的 PDB。

顺便说下,release版的exe程序用windbg调试时,就严格要求exe和pdb匹配,因为调试器不会加载与所调试的二进制不匹配的
PDB。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: