PDB文件详解

PDB文件详解PDB文件的介绍PDB(ProgramDataBase),意即程序的基本数据,是VS编译链接时生成的文件。DPB文件主要存储了VS调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、FPO(帧指针)、对应的行号等等。因为存储的是调试信息,所以一般情况下PDB文件是在Debug模式下才会生成。PDB文件的调用过程模块(Module),EXE和DLL都可以称之为模块,因为它们都有…

大家好,又见面了,我是你们的朋友全栈君。

  1. PDB文件的介绍

PDB(Program Data Base),意即程序的基本数据,是VS编译链接时生成的文件。DPB文件主要存储了VS调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、FPO(帧指针)、对应的行号等等。因为存储的是调试信息,所以一般情况下PDB文件是在Debug模式下才会生成。

  1. PDB文件的调用过程

模块(Module),EXE和DLL都可以称之为模块,因为它们都有自已独立的Stack,所以我们在调试程序时,可以在Call Stack窗口查看到所有调用的Module Name。并且可以右键查看相应模块的ybmol Load Information,即该模块调用的PDB文件路径的过程。

每个模块被载入的时候,其相同名字的PDB文件同时被载入。所以Debug模式下,不仅因为代码没有优化,同时因为要载入PDB文件,所以Debug模式下的程序执行速度非常慢。

每个模块只会生成一个相同名字的PDB文件,并且模块生成的同时,会校验PDB文件生成GUID记录在模块内。这是因为调试时,调试器强制要求每个模块必须和PDB文件保持一致。实验过程中,用之前生成的PDB文件替换当前生成的PDB文件时,Debug窗口会显示No symbols loaded. MSDN也做了相应的说明:The debugger will load only a PDB for a binary that exactly matches the PDB that was created when the binary was built.

PDB文件中记录了源文件路径的相关信息,所以在载入PDB文件的时候,就可以将相关调试信息与源码对应。这样可以可视化的实时查看调试时的函数调用、变量值等相关信息。模块当中记录的PDB文件是绝对路径。所以只要模块在当前电脑上载入,调试器自然地会根据模块当中的路径信息找到相应PDB文件并载入。同样PDB文件中记录的源文件路径也是绝对路径,所以PDB文件只要在当前电脑上载入,调试进入相应模块时,都能够匹配到记录的源文件,然后可视化地查看相应信息。

如果源文件找不到,那么依然能够查看调试信息,只是这个时候只能查看汇编代码,不能通过源文件可视化查看信息。一般情况下,绝大多数C++程序员不具备阅读汇编代码的能力。所以完全通过PDB文件调试,意义与作用均没有多大。如果要让其他人能够调试自已的代码,PDB文件和源码都应该提供,只提供PDB文件的意义不大。如果确实有类似的需求,可以保留相应生成的PDB文件。微软的很多库默认是不提供PDB文件的,但是近来微软逐渐开放了一些库的PDB文件。

  1. VS搜索PDB文件的路径顺序

MSDN中详细的讲述:

1. The Visual Studio debugger uses the path to the PDB in the EXE or DLL file to find the project.PDB file.

2. If the debugger cannot find the PDB file at that location or if the path is invalid (for example, if the project was moved to another computer), the debugger searches the path containing the EXE.

3. the symbol paths specified in the Options dialog box (Debugging folder, Symbols node).

1是默认当前路径,2是编译链接时记录在模块当中的路径。现在重点说3,即设置符号文件路径。

通过Options->Debuggin->Symbols或在Call Stack窗口右键找到Symbol Settings打开下面的窗口。

PDB文件详解

我将PDF的生成路径调整到D:\,调试时将PFB文件剪切到D:\Other目录。

PDB文件详解

 

然后调试进入dll模块时,右键在Call Stack对应的Module上选择查看Symbol Load Information.

 

通过上图即可以看到VS加载PDB文件的顺序,这与MSDN中介绍的是一样的。

Symbol Settings窗口里,还可以从服务器上缓存符号文件,可是我试了很多方式,均没有成功。

为什么讲这个设置符号文件呢?因为有时候,有些项目非常庞大,并且代码是共享的,所以代码会放到服务器上。很多很大PDB调试文件,如果拷贝到本地电脑上比较麻烦。这个时候,就可以指定网络路径,直接通过网络路径调试。

  1. 静态库的PDB文件

静态库也有自已的PDB文件,只不过其名字是VC80.PDB/VC100.PDB这样的名字。静态库的PDB文件会在链接时合并到EXE/DLL的PDB文件中去。如果生成的静态库lib里有记录相应的PDB文件,却又没有相应的PDB文件,那么静态库链接成EXE/DLL时就会报警告找不到静态库对应的PDB文件。所以如果静态库作第三方库发布时,可以不用生成PDB文件,这样调用者链接时就不会报警告。

通过PDB文件可以获取函数名及对应的代码行号,更多信息可以参考微软给的示例。

更多详细资料见:https://msdn.microsoft.com/zh-cn/library/2008hf0e

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136923.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于递归和迭代[通俗易懂]

    关于递归和迭代[通俗易懂]首先明确递归和迭代的概念。递归:程序调用自身的编程技巧(将大问题化解为相同结构的小问题,从待解问题一直分解到已知答案的最小问题,在逐级返回得      到原解)    使用递归的两个阶段:    1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;    2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.迭代:从已知式出发

    2022年6月6日
    42
  • vue组件通讯之$attrs

    vue组件通讯之$attrs使用场景我们会遇到这样的场景,比如对element-ui的el-table组件进行二次开发,但是el-table组件有很多属性比如控制高度的height,传入数据的data还有border、size、fit等一个个的去传显然不大现实,这个使用用$attrs处理起来就会特别优雅。举例子组件:自定义组件对el-table进行封装,用$attrs接收父组件传过来的属性<template&g…

    2022年10月18日
    2
  • Jps算法_JPS算法

    Jps算法_JPS算法目录概念 强迫邻居(ForcedNeighbour) 跳点(JumpPoint) JPS寻路算法(JumpPointSearch) 实现原理 示例过程 JPS+(JumpPointSearchPlus) 预处理 示例过程 总结 参考概念JPS(jumppointsearch)算法实际上是对A*寻路算法的一个改进,因此在阅读本文之前需要先了解A*算法。A*算法在扩展节点时会把节点所有邻居都考虑进去,这样openlist中点的..

    2026年1月29日
    3
  • 什么是泛型?- 泛型入门篇

    什么是泛型?- 泛型入门篇目录1、什么是泛型?2、泛型是怎么编译的泛型的编译机制:擦除机制1、什么是泛型?泛型其实就是将类型作为参数传递,泛型允许程序员在编写代码时使用一些以后才指定的类型,在实例化该类时将想要的类型作为参数传递,来指明这些类型。为什么要引入泛型?例如:自己实现一个顺序表publicclassMyArrayList{publicint[]elem;publicintusedSize;publicMyArrayList(){this.ele

    2022年6月15日
    31
  • android p是哪个版本,Android P是什么系统?Android P与Android有什么区别?[多图][通俗易懂]

    对于AndroidP系统,是一个既熟悉又陌生的概念,网上关于AndroidP爆料很多,但具体是什么系统,与Android系统有什么区别都不太清楚。随着一年一度的古哥I/O2018开发者大会的正式召开。AndroidP系统也渐渐解开了大家的问题,具体分析如下。这次大会,算是底层系统的更新,配合手机厂商的深度定制将会带来焕然一新的使用体验。全新的AndroidP开发者预览版正式加入…

    2022年4月6日
    41
  • connection closed gracefully_kalilinux中文乱码

    connection closed gracefully_kalilinux中文乱码使用FTPClient向linux上传文件出现这个错误org.apache.commons.net.ftp.FTPConnectionClosedException:Connectionclosedwithoutindication. atorg.apache.commons.net.ftp.FTP.__getReply(FTP.java:317) atorg.apache….

    2022年8月30日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号