PDB文件:每个开发人员都必须知道的

         一 什么是PDB文件

        大部分的开发人员应该都知道PDB文件是用来帮助软件的调试的。但是他究竟是如何工作的呢,我们可能并不熟悉。本文描述了PDB文件的存储和内容。同时还描 述了debugger如何找到binay相应的PDB文件,以及debugger如何找到与binay对应的源代码文件。本文适用于所有的Native和 Managed的开发人员。

        在开始前,我们先定义2个术语:private build, 用来表示在开发人员自己机器上生成的build;public build,表示在公用的build机器上生成的build。private build相对来说比较简单,因为PDB和binay在相同的地方,通常地我们遇到的问题都是关于public build。 
 
        所有的的开发人员需要知道的最重要的事情是”PDB文件跟源代码同样的重要“, 没有PDB文件,你甚至不能debugging。对于public build,需要symbol server存储所有的PDB,然后当用户报告错误的时候,debugger才可以自动地找到binay相应的PDB文件, visual studio 和 windbg都知道如何访问symbol server。在将PDB和binay存储到symbol server前,还需要对PDB运行进行source indexing, source indexing的作用是将PDB和source关联起来。 
 
        接下来的部分假设有已经设置好了symbol server和source server indexing。TFS2010中可以很简单地完成对一个新的build的source indexing 和 symbol server copying。
 

        二 PDB文件的内容

        正式开始PDB的内容,PDB不是公开的文件格式,但是Microsoft提供了API来帮助从PDB中获取数据。
 
Native C++ PDB包含了如下的信息:
 * public,private 和static函数地址;
 * 全局变量的名字和地址;
 * 参数和局部变量的名字和在堆栈的偏移量;
 * class,structure 和数据的类型定义;
 * Frame Pointer Omission 数据,用来在x86上的native堆栈的遍历;
 * 源代码文件的名字和行数;
 
.NET PDB只包含了2部分信息:
 * 源代码文件名字和行数;
 * 和局部变量的名字;
 * 所有的其他的数据都已经包含在了.NET Metadata中了; 
 

        三 PDB如何工作

        当你加载一个模块到进程的地址空间的时候,debugger用2中信息来找到相应的PDB文件。第一个毫无疑问就是文件的名字,如果加载 zzz.dll,debugger则查找zzz.pdb文件。在文件名字相同的情况下debugger还通过嵌入到PDB和binay的GUID来确保 PDB和binay的真正的匹配。 所以即使没有任何的代码修改,昨天的binay和今天的PDB是不能匹配的。可以使用dempbin.exe来查看binary的GUID。
 
        在VisualStudio中的modules窗口的symbol file列可以查看PDB的load顺序。第一个搜索的路径是binary所在的路径,如果不在binary所在的路径,则查找binary中hardcode记录的build目录,例如obj\debug\*.pdb, 如果以上两个路径都没有找到PDB,则根据symbol server的设置,在本地的symbol server的cache中查找,如果在本地的symbol server的cache中没有对应的PDB,则最后才到远程的symbol server中查找。通过上面的查找顺序我们可以看出为什么public build和private build的PDB查找不会冲突。
 
        对于private build有时我们需要在别人的机器上debug的情况,需要将相应的PDB与binary一起拷贝,对于加入GAC的.NET的binary,需要将PDB文件拷贝到C:\Windows\assembly\GAC_MSIL\Example\1.0.0.0__682bc775ff82796a类似的binary所在的目录。另一个变通的方法是定义环境变量DEVPATH,从而代替使用命令GACUTIL将binary放入GAC中。在定义DEVPATH后,只需要将binary和PDB放到DEVPATH的路径,在DEVPATH下的binary相当于在GAC下。使用DEVPATH,首先需要创建目录且对当前build用户有写权限,然后创建环境变量DEVPATH且值为刚才创建的目录,然后在web.config,app.config或machine.config中开启development模式,启动对DEVPATH的使用
<configuration>
   <runtime>
      <developmentMode developerInstallation="true"/>
   </runtime>
</configuration>

        在你打开了development模式后,如果DEVPATH没有定义或路径不存在的话会导致程序启动时异常"Invalid value for registry"。而且如果在machine.config中开启DEVPATH的使用会影响其他的所有的程序,所以要慎重使用machine.config。
 
        最后开发人员需要知道的是源代码信息是如何存储在PDB文件中的。对于public builds,在运行source indexing tool后,版本控制工具将代码存储到你设置的代码cache中。对于private builds,只是存储了PDB文件的全路径,例如在c:\foo下的源文件mycode.cpp,在pdb文件中存储的路径为c:\foo\mycode.cpp。对于private builds可以使用虚拟盘来增加PDB对绝对路径的依赖,例如可以使用subst.exe将源代码路径挂载为V:,在别人的机器上debug的时候也挂载V:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【pyqt5学习】——graphicView显示opencv图像

imgpath "result.jpg"img cv2.imread(imgpath) # 读取图像img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转换图像通道x img.shape[1] # 获取图像大小y img.shape[0]self.zoomscale 1 # 图片放缩尺度frame QImage(img, x, y, x * 3, QImage.Format_RGB888)…

项目总结——机房收费系统合作版

机房合作就结束了&#xff0c;这次合作开发是第一次与别人一块儿开发一个系统&#xff0c;收获还是蛮大的。以下我总结几点算是经验吧&#xff0c;供以后參考&#xff1a; 管理上1.计划在准备合作开发之前我们三个去找米老师&#xff0c;老师给我们规定了时间。半个月。尽管计划…

CenterOs 防火墙设置

为什么80%的码农都做不了架构师&#xff1f;>>> 1. 重启后生效的 开启&#xff1a; chkconfig iptables on 关闭&#xff1a; chkconfig iptables off 2. 及时生效 开启&#xff1a; service iptables start 关闭&#xff1a; service iptables stop 查看防火墙规则…

设计模式六大原则(3)——依赖倒置原则

定义&#xff1a;高层模块不应该依赖低层模块&#xff0c;二者都应该依赖其抽象&#xff1b;抽象不应该依赖细节&#xff1b;细节应该依赖抽象。 问题由来&#xff1a;类A直接依赖类B&#xff0c;假如要将类A改为依赖类C&#xff0c;则必须通过修改类A的代码来达成。这种场景下…

【机器学习——决策树】——两种方法实现,含模型的保存和调用

目录 1、ID3算法 2、使用sklearn API——模型保存和调用成功 1、ID3算法 以下实现了决策树的创建、可视化绘制、决策树的保存和调用 但是在利用决策树进行预测的时候出现错误 分类代码 #实用决策树进行分类 def classify(inputTree, featLabels, testVec): firstStr = in…

重温 const 指针

在进行声明指针时&#xff0c;可以在类型前或后使用关键字const&#xff0c;也可在两个位置都使用。 下面都是合法的声明&#xff0c;但是含义大不同&#xff1a; const int * pOne; //指向整形常量 的指针&#xff0c;它指向的值不能修改 int * const pTwo; //指向整…

提交MTBF eservice以及log注意事项

[DESCRIPTION]提交MTBFeservice需要注意的描述&#xff0c;log事项[SOLUTION]提交MTBF eservice时&#xff0c;请注意1.描述清楚问题现象2. 描述清楚问题发生的时间点3.描述清楚问题发生时在run的case提交log时请注意1.MTBF的log通常会很大&#xff0c;若log太大&#xff0c;只…

Apache Cassandra和Apache Ignite:关系并置和分布式SQL

为什么80%的码农都做不了架构师&#xff1f;>>> 在上一篇文章中&#xff0c;回顾和总结了Cassandra中使用的查询驱动数据模型&#xff08;或者说非常规数据模型&#xff09;方法论的缺陷。事实证明&#xff0c;如果不对查询有深入的了解&#xff0c;通过该方法论将…

Android高级开发专题晋升班

Android高级开发专题晋升班 适用人群&#xff1a;1-3年以上经验的开发者丨学员平均薪酬20K/月转载于:https://www.cnblogs.com/lythonliu/p/6285531.html

使用opencv简单的播放AVI程序(40行)

学习OPENCV的第一个例子 #include <highgui.h> #include <cassert> #include <iostream> #include <Windows.h> using namespace std; void OnTrackbarSlide(int pos);int g_slider_position 0; CvCapture *g_capture NULL; int main(int argc , cha…

【纠错】——mysql Authentication plugin ‘caching_sha2_password‘ is not supported问题处理

mysql Authentication plugin ‘caching_sha2_password’ is not supported问题处理 使用mysql8.0版本&#xff0c;登录失败&#xff0c;提示 Authentication plugin ‘caching_sha2_password’ is not supported。 原因是在MySQL 8.0以后&#xff0c;默认的密码加密方式是cac…

关于EL表达式取值的问题

EL表达式取值时,如果没有指定作用域,EL表达式会自动按照作用域的大小,从小到大依次去找;比如${s},会自动按照"pageContext,request,session,application"的顺序去找属性名为s的属性.如果找到,则显示.否则,什么都不显示. 当Map中存整数时,如果想采用EL表达式取值,Map的…

统计信息自动收集任务失效原因排查

环境&#xff1a;Oracle 11.2.0.3 RAC问题&#xff1a;统计信息自动收集任务失效原因排查 1.查看自动任务的状态2.进一步查看其它信息3.解决问题1.查看自动任务的状态 查看自动任务的状态&#xff0c;确认是enabled状态&#xff1a; SQL> select client_name,status from db…

Markdown使用

#一级标题 ##二级标题 ###三级标题 斜体 粗体 斜体粗体 代码段> 删除内容效果是&#xff1a; 这是一级标题 这是二级标题 这是三级标题 这是斜体这是粗体这是斜体粗体 代码段 FileInputStream is new FileInputStream("text"); byte[] iput new byte[1024]; is.…

灰度图的width和widthstep的区别

灰度图的width是表示图像的每行像素数&#xff0c;widthstep指表示存储一行像素需要的字节数。 在OpenCV里边&#xff0c;widthStep必须是4的倍数&#xff0c;从而实现字节对齐&#xff0c;有利于提高运算速度。 如果8U单通道图像宽度为3&#xff0c;那么widthStep是4&#xff…

【pyradiomics学习】——安装pyradiomics以及简单示例

目录 数据集下载&#xff1a; 示例代码 参考文献&#xff1a; bug修复 运行结果&#xff1a; 数据集下载&#xff1a; https://www.jianguoyun.com/p/DcEwQq0Q45bOBxj09JYC (访问密码: gd8dmv) 示例代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 20…

最新Django2.0.1在线教育零基础到上线教程(九)

演示地址&#xff1a; http://mxonline.mtianyan.cn 教程仓库地址1: https://github.com/mtianyan/DjangoGetStarted 教程仓库地址2: https://github.com/mtianyan/Mxonline2 教程仓库地址3: https://github.com/mtianyan/Mxonline3 9-1 讲师列表页 teacherlist 和 teacher det…

过滤器 拦截器 区别

转 http://www.cnblogs.com/wangyuyu/archive/2013/07/02/3167354.html1、拦截器是基于java的反射机制的&#xff0c;而过滤器是基于函数回调 2、过滤器依赖与servlet容器&#xff0c;而拦截器不依赖与servlet容器 3、拦截器只能对action请求起作用&#xff0c;而过滤器则可以对…

php --魔术常量 /魔术方法

魔术常量&#xff1a;1. __LINE__返回文件中的当前行号。2. __FILE__返回所在文件的完整路径。包含文件名3. __FUNCTION__返回所在函数名称。4. __CLASS__返回所在类的名称。5. __METHOD__返回所在类方法的名称。需要注意__METHOD__返回的是"class::function"的形式&…

【pyradiomics学习】——影像组学特征

目录 1、形状特征&#xff08;14个&#xff09; 2、一阶特征&#xff08;18个&#xff09; 灰度共生矩阵特征&#xff08;24个&#xff09; 灰度区域大小矩阵特征&#xff08;16个&#xff09; 灰度行程矩阵特征&#xff08;16个&#xff09; 邻域灰度差矩阵特…