c# - 为什么 C# 发布版本包含调试信息

标签 c# .net disassembly

在反汇编我的 C# 程序(发布版本)时,我注意到它包含我在项目中使用的函数名称和变量(我认为这是调试信息,如果我错了,请纠正我)。

有人可以解释一下为什么它在那里以及程序是否需要它。

最佳答案

托管代码中的“调试信息”分为三个级别。

  1. 包含的元数据:这包括所有公开的命名空间、名称和类型(不包括局部变量名称等内容)。它被捆绑在程序集中,并允许该代码的使用者知道如何引用该代码并引用它。在 C/C++ 领域,这种级别的元数据被存储在H 文件中。在 COM 领域,您可以获得类型库。所有程序集都会得到这个 - 如果没有它,它们就无法被使用。

  2. 符号文件(又名PDB 文件)。这是有关内部名称、行号等的扩展信息。调试器使用此信息来使调试工作更好。您可以为“调试构建”或“发布构建”(或其他类型的构建)创建 PDB 文件。这是通过“高级build设置”对话框中的设置来控制的,该对话框可从项目属性的“构建”选项卡访问。默认情况下,发布版本设置为仅 PDB,而调试版本设置为完整(我相信这可能会直接在程序集中添加更多信息)。 PDB 文件在托管代码中不如在 C/C++ 领域那么重要。在那里,如果没有匹配的 PDB 文件,调试几乎是不可能的。

  3. 定义DEBUG常量:(在项目属性的Build选项卡上设置)。这个 #define 常量用作包含(或不包含)仅调试代码的开关。无论是否定义此常量,代码的工作方式可能会略有不同。

关于c# - 为什么 C# 发布版本包含调试信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52991408/

相关文章:

C# 如何改变标签的字体

c# - 连续发出多个 Web 请求的最简单方法是什么?

.net - .NET 中字段初始值设定项的用途是什么(除了可读性)?

c# - 使用 C# 在 Excel 中复制/粘贴单元格

.net - Oracle ManagedDataAccess Client 和关闭连接

assembly - 优化 ARM Cortex M3 代码

c# - 如何在 asp.net core rc2 中获取 Controller 的自定义属性

c# - 如何对 session 值进行单元测试?

c - 反汇编 C 函数的 IA32 32 位 AT&T 汇编代码

python - 尝试使用 capstone 通过 winappdbg 进行反汇编时出错