【问题标题】:Why does the C# release build contain debug info为什么 C# 发布版本包含调试信息
【发布时间】:2018-10-25 14:10:29
【问题描述】:

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

有人能解释一下为什么会出现,以及程序是否需要它。

【问题讨论】:

  • 类型和成员的名称当然会保留在编译的程序集中。此外,您可以选择将 pdb 文件与您的程序集一起部署或不部署,无论它是调试版本还是发布版本。您应该始终包含 pdb 文件以获取更详细的例外情况。
  • 如果你在谈论字段/属性/方法,那你就错了。这不是调试信息,而是在 CLR 中启用(后期)绑定和反射的必要元数据...
  • 类和成员的名称不是调试信息——.NET(托管)语言总是依赖于可用的反射元数据,不像像 C 这样的语言,其中的东西被分解成最低的机器如果省略调试信息,则没有更多数据的组件。局部变量名称是一种调试信息,因为有意义的名称是可选的(并且不能反映),但编译器仍然选择包含它们。诸如混淆器之类的第三方工具可以将名称更改为“无意义”的名称,但它们不能彻底删除元数据,因为 .NET 需要它。
  • .NET 语言被编译为 CIL,它仍然包含原始名称。也许您想了解一下。

标签: c# .net disassembly


【解决方案1】:

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

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

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

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

【讨论】:

  • .NET 元数据实际上包括一切,即使没有公开。 (或者,如果您愿意,.NET 会以足够的决心将所有内容“公开”给客户端。)这与某些非托管语言中的封闭世界假设完全不同。
  • 是的,我说错了。元数据中缺少诸如局部变量名称之类的内容。我会编辑答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多