虽然我希望.NET PDB文件与本地PDB文件处理方式相同,但我们在这件事上没有任何选择,因为事情就是这样。我相信微软的调试器团队多年来听到过很多类似帕特里克的评论。也许我们会在未来的Visual Studio版本中看到所有问题都得到解决。

帕特里克非常幸运能够通过VPN远程调试到客户机器中。我相信你们大多数读者都会喜欢这样的场景!对于我们大多数人来说,只要让用户/管理员打开日志并将输出发送给我们,就和登月旅行一样困难。

本机二进制PDB文件非常敏感。正如我在关于PDB文件的原始文章中指出的,本机PDB文件包含以下数据(如果它们没有被剥离):

  • 公共、私有和静态函数地址
  • 全局变量名称和地址
  • 参数和局部变量的名称和偏移在堆栈上的位置
  • 由类、结构和数据定义组成的类型数据
  • 帧指针省略(FPO)数据,这是在x86上进行本机堆栈遍历的关键
  • 源文件名及其行

如果你把这些文件交给一个客户,你已经给了他们所有缺少源文件的东西。事实上,使用完整的本地PDB文件,使用公共DBGHELP符号API编写一个工具来编写一个重新创建头文件的工具并不难。如果你重视你的工作,你永远不想让你的本地PDB文件泄漏相关信息。

另一方面,.NET PDB文件只包含以下信息:

  • 源文件名及其行
  • 局部变量名

那么调试器如何知道所有关于.NET类型的信息呢?从二进制文件中的元数据来看,不需要在.NET PDB文件中复制元数据。.NET的优点是“自描述对象”,因此您需要更多有关二进制文件中类型的信息。元数据是如何使用反射加载以前从未见过的二进制文件并开始实例化其类型。正如您可以想象的,这意味着由于相同的元数据,将.NET二进制文件直接反编译回您选择的首选语言并不太难。选择.NET的易用性意味着你必须放弃一些东西,因为没有免费的午餐。

因为.NET PDB文件不包含任何敏感的内容,我说给他们自由!在Patrick的例子中,我将把.NET PDB文件给客户,这样他就可以对本机和.NET进行远程调试。所有源文件都加载在运行Visual Studio UI的本地计算机上,因此您不会放弃这些文件。

先发制人的评论攻击:是的,如果你做了一些疯狂的蠢事,比如在你的构建路径中嵌入域名和登录密码,这将显示在你给客户的.NET PDB文件中。我说的是正常的情况<big smile!>

实际上,我建议您为.NET PDB文件创建一个安装程序,以便可以将它们安装到与二进制文件相同的目录中。调试器(本地或远程)总是首先在加载二进制文件的目录中查找匹配的.NET PDB文件。要求您的客户手动将每个.NET PDB文件复制到适当的目录是一个灾难的秘诀。安装程序是好事,尽管Windows安装程序API有点麻烦。

让我将创建.NET PDB文件安装程序的“推荐”改为“强烈推荐”。您是否注意到开发机器上未处理的异常与测试或客户机器上的异常之间有一个有趣的区别?当您查看开发机器上未处理的异常时,您会看到调用堆栈以及一些非常有用的信息:调用堆栈中每个项的源和行。在开发计算机上,本地生成PDB文件与二进制文件位于同一目录中,异常类中的.NET StackTrace字段会自动读取它们以获取源和行信息。当你有一个写300行方法的同事时,准确的行在调用堆栈中有很大的帮助。

通过.NET PDB文件安装程序,您可以让复制未处理异常的客户安装符号,这样当您将异常转储到日志时,您就得到了源代码和行代码。这就是我所说的快速调试!

请记住,抛出的每个异常都使用StackTrace类,因此在计算调用堆栈时,由于符号查找,性能会受到一些影响。正如您可以猜到的,有许多变量会影响性能,所以我不能给您一个确切的数字,但事实上,您将在堆栈中拥有确切的源代码和代码行,这意味着您将更快地调试问题,这最终是性能的最终改进。

NET PDB文件到底包含多少秘密?的更多相关文章

  1. pdb文件 PDB文件:每个开发人员都必须知道的 .NET PDB文件到底是什么?

    pdb文件包含了编译后程序指向源代码的位置信息,用于调试的时候定位到源代码,主要是用来方便调试的. 在程序发布为release模式时,建议将 pdb文件删除, 同时,对外发布的时候,也把 pdb删除, ...

  2. 关于 PDB 文件你需要知道什么?

    引言 大多数人知道 PDB 文件是用来帮助我们 debug 的,但也仅此而已. 本文主要介绍当你遇到 PDB 文件时(windows 开发中),你必须要知道的内容. 重要的事情说三遍 PDB 文件和源 ...

  3. PDB文件说明

    文/玄魂 .PDB文件,全称为“程序数据库”文件.我们使用它(更确切的说是看到它被应用)大多数场景是调试应用程序.目前我们对.PDB文件的普遍认知是它存储了被编译文件的调试信息,作为符号文件存在.那么 ...

  4. 每个开发人员必须知道PDB文件知识

    大多数开发人员都意识到PDB文件有助于您进行调试,但仅此而已.如果你不知道PDB文件是怎么回事,不要觉得很糟糕,因为虽然有文档在那里,但它分散在周围,而且大部分是为编译器和调试器编写器准备的.虽然编写 ...

  5. 生成类库项目时同时生成的pdb文件是什么东东?

    英文全称:Program Database File Debug里的PDB是full,保存着调试和项目状态信息.有断言.堆栈检查等代码.可以对程序的调试配置进行增量链接.Release 里的PDB是p ...

  6. 【C# 调试】.net中的 .pdb文件是什么,有什么用

    mscn:在 Visual Studio 调试器(C#)中指定符号 (.pdb) 和源文件 PDB全称Program Database,程序数据库 ( .pdb) 文件(也称为符号文件)将项目源代码中 ...

  7. Microsoft Visual Studio PDB文件相关事宜

    Microsoft Visual Studio PDB:调试的符号文件,程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置: 当以 /ZI 或 /Zi(用于 C/C ...

  8. 2016-07-07: 重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件

    使用VS2008在一个解决方案中包含多个项目时,当设置多个项目的中间目录为同一个目录时,在增量编译时出现"重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件,请重新创建预编译头问 ...

  9. VS2013 编译程序时提示 无法查找或打开 PDB 文件

    "Draw.exe"(Win32):  已加载"C:\Users\YC\Documents\Visual Studio 2013\Projects\Draw\Debug\ ...

随机推荐

  1. EasyExcel读取文件-同步处理数据

    读取代码 // 前端传过来的文件 MultipartFile file; InputStream inputStream = file.getInputStream(); // 读取excel数据,边 ...

  2. Unity 代码提示符和UGUI屏幕自适应

    [Header]("提示字符") Canvas Scaler  屏幕自适应

  3. MNIST机器学习入门(一)

    一.简介 首先介绍MNIST 数据集.如图1-1 所示, MNIST 数据集主要由一些手写数字的图片和相应的标签组成,图片一共有10 类,分别对应从0-9 ,共10 个阿拉伯数字. 原始的MNIST ...

  4. git 学习笔记 --从远程库克隆

    上次我们讲了先有本地库,后有远程库的时候,如何关联远程库. 现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆. 首先,登陆GitHub,创建一个新的仓库,名字叫gitskill ...

  5. Ambari深入学习(II)-实现细节

    在第一节中,我们简单讲了一下Ambari的系统架构.我们这一节主要分析Ambari的源代码,总览Ambari的具体实现方式及其工作细节. 一.Ambari-Server启动 Ambari-Server ...

  6. XML和Json的特点

    Xml特点: 1.有且只有一个根节点: 2.数据传输的载体 3.所有的标签都需要自定义 4.是纯文本文件 Json(JavaScript Object Notation)特点: json分为两种格式: ...

  7. flask与Flask-CORS的使用

    flask与Flask-CORS的使用 一.安装 pip install flask-cors 二.使用 # 文件:manage.py from flask_cors import CORS from ...

  8. 2019 咪咕文化java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.咪咕文化等公司offer,岗位是Java后端开发,最终选择去了咪咕文化. 面试了很多家公司,感觉大部分公司考察的点 ...

  9. windows xp远程连接

    本节将用到windows网络共享,实现外网可以远程连接局域网内的任意主机 实验环境 两台windows xp虚拟机(内网+外网),一台主机 配置外网虚拟机 首先,为虚拟机添加两块网卡.一块作为网关(内 ...

  10. Implement CGLIB in ABAP

    What is cglib?A Byte Code Generation Library which is high level API to generate and transform Java ...