调试之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。
一、内容
* 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。
相关文章推荐
- 【深入探索c++对象模型】抽象类和纯虚函数的理解
- TCHAR,WCHAR,CHAR三者关系的梳理
- C++ Primer 第一部分基本语言
- C++笔记:class
- C++静态成员的用法
- 小问题大思考之C++临时对象
- 如何增加程序員的收入
- C++中函数的用法小结
- 十六进制字符串转换成十进制整数的C++实现源代码
- POJ 3278解题报告(C语言版)//Catch That Cow
- 求二元查找树的镜像 C++实现
- builder模式 c++
- C++单态类声明
- C++体会
- C/C++中switch用法的一种替换方式
- C/C++中switch用法的一种替换方式
- C++底层读取Shp文件
- C/C++ 获取目录下的文件列表信息
- C++高性能服务框架revolver:下载、编译和工程介绍
- TOJ 2674 Java Vs C++ 字符串处理