Microsoft Visual Studio PDB文件相关事宜
2016-08-27 13:18
295 查看
Microsoft Visual Studio PDB:调试的符号文件,程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置;
当以 /ZI 或 /Zi(用于 C/C++)生成时,将创建一个 PDB 文件。
在 Visual C++ 中,/Fd 选项用于命名由编译器创建的PDB 文件。
当使用向导在Visual Studio 中创建项目时,/Fd 选项被设置为创建一个名为 project.PDB 的 PDB。
如果使用生成文件创建 C/C++ 应用程序,并指定 /ZI 或 /Zi 而不指定 /Fd 时,则最终将生成两个 PDB 文件。
具体分两种情况(引用摘自网络):
1、构建静态库时,可在工程属性 –> C/C++ –> 输出文件 –> 程序数据库名 设置生成的pdb文件名称,如果不指定,默认是生成为VCx0.pdb,这里x是VS版本号,例如用VS2008,就会生成VC90.pdb。编译静态库时默认生成的.pdb文件名字都一样,引用这个静态库的项目能找到正确的.pdb,因VS会在生成的文件中嵌入 .pdb 文件的路径。
举个例子,在ToolA下,构建了一个静态库ToolA.lib,对应生成一个vc90.pdb,同样在在ToolB下,构建了一个静态库ToolB.lib,对应生成一个vc90.pdb。最终的工程Work.exe同时链接了这两个静态库.这时,生成Work.pdb的时候,就会在ToolA.lib中找到它对应的符号文件路径ToolA/vc90.pdb,以及ToolB.lib对应的符号文件路径ToolB/vc90.pdb,合并生成最终工程的Work.pdb。
2、构建可执行文件或动态库时,编译期会生成一个.pdb文件,链接期也会生成一个.pdb文件,编译期生成的pdb文件可以在工程属性 –> C/C++ –> 输出文件 –> 程序数据库名 中设置,链接期生成的.pdb文件可在工程属性–>链接器–>调试–> 生成调试信息(设置Yes),生成程序数据库名设置。
编译期生成的pdb文件,默认也是用vcx0命名,是编译器在编译过程中,把每个.obj文件对应的符号信息存储在其中的,但不包括函数定义。而链接期生成的.pdb文件,默认使用工程名命名,是链接器在链接工程时,根据编译器生成的vcx0.pdb再进一步加工出来的,具有完整信息的符号文件。就像链接器根据各个.obj文件生成exe或dll一样,编译期生成的.pdb文件是编译-链接过程的中间产物,最后用于调试程序的是链接期生成的ProjectName.pdb
Visual Studio 调试器或其他调试工具在调试时,使用 EXE 或 DLL 文件中的PDB 路径查找 project.PDB 文件。如果调试器在该位置无法找到 PDB 文件或者如果路径无效,调试器将搜索包含 EXE 的路径或者dll的同级目录;如工程是别人编写的,则应连同符号文件一起,我们只要把符号文件与exe或者dll放在同级目录,调试器也能找到它;在调试器中也可以自己指定符号文件路径;
调试器不会加载与所调试的二进制不匹配的 PDB文件。
当以 /ZI 或 /Zi(用于 C/C++)生成时,将创建一个 PDB 文件。
在 Visual C++ 中,/Fd 选项用于命名由编译器创建的PDB 文件。
当使用向导在Visual Studio 中创建项目时,/Fd 选项被设置为创建一个名为 project.PDB 的 PDB。
如果使用生成文件创建 C/C++ 应用程序,并指定 /ZI 或 /Zi 而不指定 /Fd 时,则最终将生成两个 PDB 文件。
具体分两种情况(引用摘自网络):
1、构建静态库时,可在工程属性 –> C/C++ –> 输出文件 –> 程序数据库名 设置生成的pdb文件名称,如果不指定,默认是生成为VCx0.pdb,这里x是VS版本号,例如用VS2008,就会生成VC90.pdb。编译静态库时默认生成的.pdb文件名字都一样,引用这个静态库的项目能找到正确的.pdb,因VS会在生成的文件中嵌入 .pdb 文件的路径。
举个例子,在ToolA下,构建了一个静态库ToolA.lib,对应生成一个vc90.pdb,同样在在ToolB下,构建了一个静态库ToolB.lib,对应生成一个vc90.pdb。最终的工程Work.exe同时链接了这两个静态库.这时,生成Work.pdb的时候,就会在ToolA.lib中找到它对应的符号文件路径ToolA/vc90.pdb,以及ToolB.lib对应的符号文件路径ToolB/vc90.pdb,合并生成最终工程的Work.pdb。
2、构建可执行文件或动态库时,编译期会生成一个.pdb文件,链接期也会生成一个.pdb文件,编译期生成的pdb文件可以在工程属性 –> C/C++ –> 输出文件 –> 程序数据库名 中设置,链接期生成的.pdb文件可在工程属性–>链接器–>调试–> 生成调试信息(设置Yes),生成程序数据库名设置。
编译期生成的pdb文件,默认也是用vcx0命名,是编译器在编译过程中,把每个.obj文件对应的符号信息存储在其中的,但不包括函数定义。而链接期生成的.pdb文件,默认使用工程名命名,是链接器在链接工程时,根据编译器生成的vcx0.pdb再进一步加工出来的,具有完整信息的符号文件。就像链接器根据各个.obj文件生成exe或dll一样,编译期生成的.pdb文件是编译-链接过程的中间产物,最后用于调试程序的是链接期生成的ProjectName.pdb
Visual Studio 调试器或其他调试工具在调试时,使用 EXE 或 DLL 文件中的PDB 路径查找 project.PDB 文件。如果调试器在该位置无法找到 PDB 文件或者如果路径无效,调试器将搜索包含 EXE 的路径或者dll的同级目录;如工程是别人编写的,则应连同符号文件一起,我们只要把符号文件与exe或者dll放在同级目录,调试器也能找到它;在调试器中也可以自己指定符号文件路径;
调试器不会加载与所调试的二进制不匹配的 PDB文件。
相关文章推荐
- Microsoft Visual Studio 开发的C++程序软件发布相关事宜
- 未能加载文件或程序集"Microsoft.VisualStudio.Web.PageInspector.Loader"
- Microsoft Visual studio 2005 里怎么生成.exe 文件
- 未能找到元数据文件C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\..\IDE\EntityFramework.dl
- visual studio .net c++ 无法查找或打开 PDB 文件。
- Microsoft Visual studio 2005 里怎么生成.exe 文件
- VS2013 代码先行迁移,报:未能加载文件或程序集 Microsoft.VisualStudio.Shell, Version=10.0.0.0
- 未能加载文件或程序集“Microsoft.VisualStudio.Web.PageInspector.Loader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。
- Microsoft.VisualStudio.Shell.14.0.dll 文件位置
- Microsoft Visual Studio下编译缺少头文件unistd.h解决办法
- Microsoft Visual Studio 2008 在文件中查找 不弹框
- 类模板 文件分离(VS 2012即Microsoft VISUAL STUDIO 11.0 )
- Microsoft Visual Studio 2005 Team System相关下载
- OpenCV:Visual Studio "无法查找或打开PDB文件"解决方法
- AndroidStudio导入项目到VisualSVN Server并忽略(ignore)相关文件详细步骤
- Microsoft Visual studio 2005 里怎么生成.exe 文件
- Microsoft Visual Studio 2010 Express for Windows Phone 新建文件 设置启动
- Microsoft Visual Studio下编译缺少头文件unistd.h解决办法
- 未能加载文件或程序集“Microsoft.VisualStudio.Shell" 系统找不到指定的文件
- Visual Studio 提示某个dll文件(已在Microsoft Visual Studio 外对该文件进行了修改,是否重新加载它)