NET PDB文件到底包含多少秘密?
虽然我希望.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文件到底包含多少秘密?的更多相关文章
- pdb文件 PDB文件:每个开发人员都必须知道的 .NET PDB文件到底是什么?
pdb文件包含了编译后程序指向源代码的位置信息,用于调试的时候定位到源代码,主要是用来方便调试的. 在程序发布为release模式时,建议将 pdb文件删除, 同时,对外发布的时候,也把 pdb删除, ...
- 关于 PDB 文件你需要知道什么?
引言 大多数人知道 PDB 文件是用来帮助我们 debug 的,但也仅此而已. 本文主要介绍当你遇到 PDB 文件时(windows 开发中),你必须要知道的内容. 重要的事情说三遍 PDB 文件和源 ...
- PDB文件说明
文/玄魂 .PDB文件,全称为“程序数据库”文件.我们使用它(更确切的说是看到它被应用)大多数场景是调试应用程序.目前我们对.PDB文件的普遍认知是它存储了被编译文件的调试信息,作为符号文件存在.那么 ...
- 每个开发人员必须知道PDB文件知识
大多数开发人员都意识到PDB文件有助于您进行调试,但仅此而已.如果你不知道PDB文件是怎么回事,不要觉得很糟糕,因为虽然有文档在那里,但它分散在周围,而且大部分是为编译器和调试器编写器准备的.虽然编写 ...
- 生成类库项目时同时生成的pdb文件是什么东东?
英文全称:Program Database File Debug里的PDB是full,保存着调试和项目状态信息.有断言.堆栈检查等代码.可以对程序的调试配置进行增量链接.Release 里的PDB是p ...
- 【C# 调试】.net中的 .pdb文件是什么,有什么用
mscn:在 Visual Studio 调试器(C#)中指定符号 (.pdb) 和源文件 PDB全称Program Database,程序数据库 ( .pdb) 文件(也称为符号文件)将项目源代码中 ...
- Microsoft Visual Studio PDB文件相关事宜
Microsoft Visual Studio PDB:调试的符号文件,程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置: 当以 /ZI 或 /Zi(用于 C/C ...
- 2016-07-07: 重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件
使用VS2008在一个解决方案中包含多个项目时,当设置多个项目的中间目录为同一个目录时,在增量编译时出现"重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件,请重新创建预编译头问 ...
- VS2013 编译程序时提示 无法查找或打开 PDB 文件
"Draw.exe"(Win32): 已加载"C:\Users\YC\Documents\Visual Studio 2013\Projects\Draw\Debug\ ...
随机推荐
- gRPC-拦截器简单使用
概述 gRPC作为通用RPC框架,内置了拦截器功能.包括服务器端的拦截器和客户端拦截器,使用上大同小异.主要作用是在rpc调用的前后进行额外处理. 从客户端角度讲,可以在请求发起前,截取到请求参数并修 ...
- 数据采集,SCADA, 使用MQTT的方式来进行消息单/双向传输,什么场景使用MQTT
1.先来了解下: 看完得出关键字:发布.订阅模式,事件驱动,主题,生产与消费解耦 2.轻量级 普通的socket连接对服务器的消耗太大了,socket服务端是很消耗资源的,一台服务器能链接的客户端是有 ...
- Windows 编译安装 nginx 服务器 + rtmp 模块
有关博客: <Windows 编译安装 nginx 服务器 + rtmp 模块>.<Ubuntu 编译安装 nginx>.<Arm-Linux 移植 Nginx> ...
- Hive学习笔记(三)—— 数据类型
Hive的基本使用(一)--数据类型 1. Hive的基本数据类型 Hive数据类型 Java数据类型 长度 例子 TINYINT byte 1byte有符号整数 20 SMALINT short 2 ...
- tkinter基础-输入框、文本框
本节内容 了解输入框.文本框的使用方法 利用1制作简易界面 首先明确上面由几个元素组成:该界面由界面标题,输入框.两个按钮.文本框组成. 该界面我们需要实现的功能: 在输入框中输入文字,点击inser ...
- 论文笔记: Matrix Factorization Techniques For Recommender Systems
Recommender system strategies 通过例子简单介绍了一下 collaborative filtering 以及latent model,这两个方法在之前的博客里面介绍过,不累 ...
- MongoDB和Java(1):Linux下的MongoDB安装
最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...
- jmeter学习笔记(二十二)——监听器插件之jp@gc系列
一.jp@gc - Actiive Threads Over Time 不同时间活动用户数量展示 下面是一个阶梯加压测试的图标 二.jp@gc - Transactions per Second ...
- mongos
官方文档:https://docs.mongodb.com/manual/reference/program/mongos/#bin.mongos mongos是MongoDB shard的缩写,它是 ...
- idea忽略并隐藏.idea文件夹.iml文件不提交到svn
File-->setting-->Editor-->File Types 选中.boringignore,添加*.iml;.idea;即可