PDB文件详解

2023-10-27

  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打开下面的窗口。

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

 

然后调试进入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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PDB文件详解 的相关文章

  • vs+opencv环境配置出现程序无法启动及提示无法打开opencv_world400d.lib问题的解决方法

    vs opencv 1配置完成但是频频出错 1问题描述 无法启动程序 系统找不到指定的文件 我的原图忘记保存 故找了一张类似问题的图片做代替描述问题 在出现上述问题之后 点击确定后 程序报错 错误如下图 2解决方法 我已按照网上教程配置环境
  • 隐藏dlg窗口方法

    单独找到任务栏设置父窗口 并不能达到隐藏窗口的效果 还是有一个对话框在任务栏中出现 0 窗口属性设置步骤2 调整对话框属性ToolWindow为true步骤3 调整对话框属性Border为None 1 设置任务栏位父窗口 CWnd task
  • VC获取Unix时间戳

    获取Unix时间戳 std wstring GetUnixTimeStamp void FILETIME ft 0 SYSTEMTIME st 0 ULARGE INTEGER ull 0 GetSystemTime st SystemTi
  • error C2872: “Font”: 不明确的符号

    在VS2010中调用GDI 时 Font font fontFamily 24 FontStyleRegular UnitPixel 会提示提示 Font 不明确的符号的问题 1 gt 可能是 c program files microso
  • GDI和GDI+的应用场合思考

    GDI是微软公司的著名的二维图形引擎 GDI 则是微软公司为了提高显示效果而推出的一种新型图形引擎 下面我就我的一些使用经验阐述二者适用的应用场合 GDI基本能满足一般的绘图要求 我觉得GDI最令人诟病的是它画出来的线显示的锯齿实在比较厉害
  • LoadStdProfileSettings -- 加载MRU

    如何为自己的应用程序加入最近文件列表功能呢 最简单的方法就是在你新建工程的时候选择包含最近文件列表功能 也就是在 MFC AppWizard 的第 4 步的时候使 How many files would you like on your
  • 线程破解程序死循环

    最近用opencv mfc做了一个简单的程序 点击button后 打开视频 另一个button关闭视频 问题来了 读视频的程序是个死循环 怎么解 因此 应该考虑线程的问题了 让视频程序在线程里跑 何为线程 线程 有时被称为轻量级进程 Lig
  • PNG透明窗体全攻略(控件不透明)vc++程序指导

    这两天在研究透明窗体 总算略有小成 网上大部分文章都是介绍到把窗体弄透明就没有下文 其实窗体透明并不难 难就难在透明的窗体上还要放控件 今 天我就把窗体透明一直到控件不透明怎么制作一块给写了吧 先截张图诱惑下你们 如果你没兴趣就没必要再看下
  • VC6 ”add files to project“功能失效的解决方案

    在Win7系统下 安装MS2007以后 VC6 0 add files to project 功能失效了 网上的资料表明 这是与MS2007不兼容导致的 其具体解决方案如下 1 到如下网址 http download microsoft c
  • VC++6.0的兼容性问题解决方案

    VC6 0 能够在 XP 下很好的运行 无需进行额外的设置 但在 Win7 Win8 和 Win10 下 安装完成后还要修改兼容模式才可以 在Win7或Win10下使用VC6 0 对于Win7和Win10 需要将VC6 0的兼容模式修改为
  • CT2A

    1 CString转为char char szAsciiIP 64 memcpy szAsciiIP CT2A m pEncoder gt m strIP sizeof szAsciiIP 2 详见MSDN http msdn micros
  • git clone指定分支拉代码、版本回退、log/reflog对比

    指定分支clone代码 1 git clone 不指定分支 默认就是master git clone http 10 1 1 11 service tmall service git 2 git clone 指定分支 git clone b
  • C++学习日记和心得(一)(新手帖,高手勿笑)

    前言 我之前三年也学过其他语言 VB pascal 都不是非常主流 但有一定程序学习的基础 没学过程序的孩子也不要伤心 只要认认真真的学习还是可以学会的 我也是刚开始学C 所以希望大家跟我一同从0开始学习C 如果对我有一些疑问和批评欢迎提出
  • MFC窗口销毁过程

    MFC窗口销毁过程 考虑单窗口情况 假设自己通过new创建了一个窗口对象pWnd 然后pWnd gt Create 则销毁窗口的调用次序 1 手工调用pWnd gt DestroyWindow 2 DestroyWin
  • 如何去掉去掉VC++的安全警告提示

    在用Vc进行进程编写时 你有可能会遇到一大堆的警告 warning C4996 如 warning C4996 This function or variable may be unsafe 原因是VC使用了更加安全的run time li
  • 泛谈HWND和CWnd

    一 略析 HWND Windows系统中对所有窗口的一种标识 即窗口句柄 一个SDK概念而已 并没有实际对象操作的地址空间 它只是一个32位的无符号整型数值 代表了句柄号handle CWnd MFC类库中所有窗口类的基类 MFC中所有窗口
  • win7安装了vc++6.0打开已保存文件项目就会崩溃

    我用win7安装了vc 6 0的英文完整版 绿色中文版 发现当运行程序时 要打开已保存文件项目就会崩溃 系统对话筐就说 Microsoft R Developer Studio已停止工作 选择调试或者关闭 office 2010 与vc 6
  • DirectShow中的工具GraphEdit使用小结

    一 安装完Windows SDK 7 0或7 1后 在C Program Files Microsoft SDKs Windows v7 0 Bin下有32位的graphedt exe 及x64目录下有64位版本的graphedt exe
  • VC++ FTP文件下传(断点续传)

    include
  • 源文件字符集,编译器内部字符集,执行字符集,控制台乱码问题,Qt中文问题

    源文件字符集 源文件本身也是文本文件 所以源文件字符集是指源文件保存时采用哪种字符集编码 VC 下源文件默认是gbk编码 如果想要更改 可以通过 文件 高级保存选项 修改某个源文件的编码方式 似乎没有什么选项能够设置创建项目时的源文件编码

随机推荐

  • 字符与字符串的“+”操作

    字符的 操作 public class Firstproj public static void main String args 定义两个变量 int i 10 char c A A 的值是65 ASCII值 c a a 的值是97 c
  • redis之安装部署

    redis之安装部署 redis之基本使用 redis之应用场景 redis之源码制作rpm包 redis之安装部署 1 redis 6 2 12单机部署 1 1 redis 6 2 12下载安装 1 2 查看服务进程 2 redis 6
  • IOS 基础开发之 addSubview和insertSubview:atIndex: 区别

    两者都是添加子视图 视图的添加都是以栈的方式 即后进先出 addSubview 是添加到最后 即最后一个进栈 显示在所有子视图的最上面 insertSubview AtIndex 是根据索引添加到栈里面 可以根据需要添加到对应的栈的位置里面
  • android 语音识别 语音手电(一)

    一 语音识别库 cmu pocketsphinx 当然要用现成的语音识别库了 自己的水平离开发语音识别库还远的很呢 网上搜索找到卡内基梅龙大学的开源语音项目 好象是李开复创办的项目 有JAVA实现 有C语言实现 pocketsphinx是专
  • 使用vscode编码器统计代码行数

    在一些特殊情况中我们需要计算代码的行数 这时我们就可以借助vscode的VS Code Counter插件进行统计 第一步 选择VS Code Counter进行安装 安装完毕有条件的可以重启编码器 第二步 快捷键ctrl shift p进
  • Tensorflow 下测试gpu是否可用

    import tensorflow as tf tf test is gpu available
  • servlet和java区别_java – servlet和Web服务之间的区别

    Web服务是一种使用REST编程范例或SOAP协议为其客户端提供服务方法以进行通信的服务 有几种方法来实现Web服务 编写Web服务的最简单的方法是编写一个类并使用javax jws中的 WebService和 WebMethod注释进行注
  • php 导出excel的三种方法

    1 PHPExcel thinkphp PHPExcel放到这个目录下 导出excel表格 function exportExcel data filename xlsTitle iconv utf 8 gb2312 filename 文件
  • BI工程师日记

    从17年十月份入职BI工程师半年多的时间里 已熟练使用Tableau及SQL 越来越感觉到tableau的天花板 思考了好久如何打破天花板 想从几个方面入手 1 学习Python数据处理 神经网络庫的使用 结合tableau和Python
  • kubeadm 安装集群 1.16.12

    kubeadm 安装集群 添加源 mirror https mirrors aliyun com mirror https mirrors ustc edu cn docker 源 curl fsSL mirror docker ce li
  • 【喊7的次数重排】

    题目描述 喊7的次数重排 喊7是一个传统的聚会游戏 N个人围成一圈 按顺时针从1到N编号 编号为1的人从1开始喊数 下一个人喊的数字为上一个人的数字加1 但是当将要喊出来的数字是7的倍数或者数字本身含有7的话 不能把这个数字直接喊出来 而是
  • 对串级PID控温算法的解析

    目录 前言 单级PID 串级PID 系统分析 算法分析 总结 前言 笔者在做项目的过程中 需要对一个目标物体做精确控温 精度要求 1 需要在两分钟内使用电阻发热贴将温度由20控制到41 且无超调 根据控制原理 做精确控温应该使用PID算法
  • 026-从零搭建微服务-文件服务(二)

    写在最前 如果这个项目让你有所收获 记得 Star 关注哦 这对我是非常不错的鼓励与支持 源码地址 后端 https gitee com csps mingyue 源码地址 前端 https gitee com csps mingyue u
  • 【点云】PointCNN: Convolution On X-Transformed Points

    目录 测试 1 摘要 2 介绍 3 PointCNN 3 1 分层卷积 3 2 X Conv操作 3 3 PointCNN结构 4 参考 4 1 ELU激活函数 4 2 BatchNorm 测试 在Semantic3D上跑了PointCNN
  • jitter概念理解

    一般 PLL等时钟产生模块 都会有RMS jitter的描述 根据这个参数 可以计算出相关时钟的clock jitter 方便设置综合sdc的时钟约束 为什么只有RMS jitter 因为期望值就是理论周期值 根据期望值 RMS 均方差 就
  • 数据运营-计算留存率和转化率(漏斗分析&Python)

    一 案例数据 在数据运营中 留存率分析和转化率 漏斗 分析是经常用到的 本文结合具体案例总结了如何利用python求n日留存率以及各环节间转化率 指标释义 案例数据集介绍 本文是利用淘宝app的运营数据进行分析的 数据集中包含以下字段 部分
  • vue项目+el-tree,树结构展示,非常完整的代码,包含调接口拿真实数据渲染

    温故而知新 最近项目中频繁使用树形结构展示效果 因为不熟悉 备受折磨 代码贴出来 再复习一次 代码太长了 想看分析的可以搜我下一篇文章 下一篇会详细的写如何在项目中使用 效果 左侧是树 右侧是表格 点击任何一行都会展示对应的表格 完整代码如
  • Acwing 898. 数字三角形

    f i j 表示所有从起点开始 走到 i j 的路径中的和的最大值 自上而下到达 i j 有两种路径 一个是左上方 一个是正上方 f i j max f i 1 j 1 a i j f i 1 j a i j 注意边界情况 边界初始化为 I
  • 单机网游架设必学:Win7安装虚拟机详细步骤

    1 下载虚拟机软件 VMware VMware Workstation 中文正式版 10 0 1 137977 2 查了很多资料说虚拟机不会占用磁盘 但是我感觉应该是有影响的 所以这里我特意分出来一个空白的60G盘做测试用 分盘用 Acro
  • PDB文件详解

    PDB文件的介绍 PDB Program Data Base 意即程序的基本数据 是VS编译链接时生成的文件 DPB文件主要存储了VS调试程序时所需要的基本信息 主要包括源文件名 变量名 函数名 FPO 帧指针 对应的行号等等 因为存储的是