.net - 发布生成 .pdb 文件,为什么?

标签 .net visual-studio debugging pdb-files debug-symbols

为什么 Visual Studio 2005 会生成 .pdb在发布时编译文件?我不会调试发布版本,那么为什么会生成它们呢?

最佳答案

因为如果没有 PDB 文件,就不可能通过地址级调试以外的任何方式来调试“发布”构建。 优化确实对您的代码产生了影响,如果出现问题(例如抛出异常),则很难找到罪魁祸首。甚至设置断点也极其困难,因为源代码行无法与生成的汇编代码一一对应(或什至以相同的顺序)。 PDB 文件可以帮助您和调试器,使事后调试变得更加容易。

您指出,如果您的软件已准备好发布,那么您应该在那时完成所有调试。虽然这当然是真的,但有几个要点需要牢记:

  • 您还应该使用“发布”版本测试和调试您的应用程序(在发布之前)。这是因为打开优化(在“调试”配置下默认禁用它们)有时会导致出现细微的错误,否则您不会发现这些错误。在进行此调试时,您将需要 PDB 符号。
  • 客户经常报告仅在“理想”条件下才会出现的边缘情况和错误。这些东西在实验室中几乎不可能重现,因为它们依赖于该用户机器的一些古怪配置。如果他们是特别有帮助的客户,他们会报告抛出的异常并为您提供堆栈跟踪。或者他们甚至会让你借用他们的机器远程调试你的软件。在任何一种情况下,您都需要 PDB 文件来帮助您。
  • 应始终在启用优化的“发布”版本上进行分析。再一次,PDB 文件派上用场,因为它们允许将被分析的汇编指令映射回您实际编写的源代码。

  • 您无法在编译后返回并生成 PDB 文件。* 如果您不在构建期间创建它们,您就失去了机会。创建它们没有任何伤害。如果您不想分发它们,您可以简单地从二进制文件中省略它们。但是,如果您后来决定想要它们,那您就不走运了。 最好始终生成它们并存档副本,以防万一您需要它们。

    如果你真的想关闭它们,那总是一个选择。在项目的“属性”窗口中,将要更改的任何配置的“调试信息”选项设置为“无”。

    但是请注意,“调试”和“发布”配置默认使用不同的设置来发出调试信息。您将希望保留此设置。对于 Debug 版本,“Debug Info”选项设置为“full”,这意味着除了 PDB 文件之外,调试符号信息也被嵌入到程序集中。您还可以获得支持编辑并继续等酷功能的符号。在 Release 模式下,选择了“pdb-only”选项,就像听起来一样,它只包含 PDB 文件,而不会影响程序集的内容。因此,这并不像 /bin 中是否存在 PDB 文件那么简单。目录。但是假设您使用“pdb-only”选项,PDB 文件的存在绝不会影响代码的运行时性能。

    * 如 Marc Sherman points out in a comment ,只要您的源代码没有更改(或者您可以从版本控制系统中检索原始代码),您就可以重建它并生成匹配的 PDB 文件。至少,通常。这在大多数情况下运行良好,但 the compiler is not guaranteed to generate identical binaries each time you compile the same code ,所以可能会有细微的差别。更糟糕的是,如果您在此期间对工具链进行了任何升级(例如为 Visual Studio 应用服务包),则 PDB 更不可能匹配。为了保证事后 PDB 文件的可靠生成,您不仅需要存档版本控制系统中的源代码,还需要存档整个构建工具链的二进制文件,以确保您可以精确地重新创建构建环境的配置.不用说,简单地创建和归档 PDB 文件要容易得多。

    关于.net - 发布生成 .pdb 文件,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5457095/

    相关文章:

    visual-studio - 在 Visual Studio 中本地管理切换编程任务的最佳方法是什么?

    c - 从名称 [.debug_info ??] 获取函数地址

    python - 在 Python 中从 code.interact() 恢复代码执行

    visual-studio - 我可以将 VisualStudio 2008 配置为始终构建启动项目吗?

    c - 为什么将空节点放入堆栈

    c# - 如何修复 json.net (Newtonsoft.Json) 运行时文件加载异常

    android - WPF XAML 浏览器应用程序 (XBAP) 是否适用于 Android 和 Windows Phone 浏览器?有哪些选择?

    c# - 错误 : MSB4803: The task "ResolveComReference" is not supported on the . NET Core 版本的 MSBuild

    c# - Task.Wait() - 任务的等待线程是否已挂起

    windows - 无法找到用于在 VS 2015 中创建 Visual C++ Windows 服务的模板