首页 > 解决方案 > 为什么 C# 发布版本包含调试信息

问题描述

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

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

标签: c#.netdisassembly

解决方案


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

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

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

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


推荐阅读