用于生产应用程序的 PDB 文件和“优化代码”标志
-
09-06-2019 - |
题
我什么时候应该在生产版本中包含 PDB 文件?我应该使用 Optimize code
标志以及这将如何影响我从异常中获取的信息?
如果有明显的性能优势,我会想要使用优化,但如果没有,我宁愿拥有准确的调试信息。生产应用程序通常会做什么?
解决方案
当您想要在堆栈跟踪中查看源文件名和行号时,请使用 pdb-only 选项生成 PDB。优化与 PDB 生成是分开的,即你可以优化 和 生成 PDB 而不会影响性能。
从 C# 语言参考
如果您使用 /debug:full,请注意,/debug:full 对 JIT 优化代码的速度和大小有一定影响,对代码质量影响较小。我们建议使用 /debug:pdbonly 或不使用 PDB 来生成发布代码。
其他提示
要回答您的第一个问题,如果您需要异常报告的行号,则只需包含生产版本的 PDB。
要回答你的第二个问题,使用带有 PDB 的“优化”标志意味着任何 堆栈“崩溃”将反映在堆栈跟踪中. 。我不确定报告的实际行号是否可能是错误的 - 这需要更多调查。
为了回答你的第三个问题,你可以通过一个相当巧妙的技巧来两全其美。默认调试构建和默认发布构建之间的主要区别在于,在执行默认发布构建时,会打开优化并且不会发出调试符号。因此,分四步:
更改您的发布配置以发出调试符号。这实际上对应用程序的性能没有影响,并且如果(何时?)您需要调试应用程序的发布版本,则非常有用。
使用新版本的构建配置进行编译,即 和 调试符号和 和 优化。请注意,99% 的代码优化是由 JIT 编译器完成的,而不是语言编译器。
在应用程序的文件夹中创建一个名为 xxxx.exe.ini(或 dll 或其他)的文本文件,其中 xxxx 是可执行文件的名称。该文本文件最初应如下所示:
[.NET Framework Debugging Control] GenerateTrackingInfo=0 AllowOptimize=1
通过这些设置,您的应用程序可以全速运行。当您想要通过打开调试跟踪并可能关闭 (CIL) 代码优化来调试应用程序时,只需使用以下设置:
[.NET Framework Debugging Control] GenerateTrackingInfo=1 AllowOptimize=0
编辑 根据猫眼的评论, 这也可以在托管环境中工作 例如 ASP.NET。
没有必要将它们包含在您的发行版中,但您绝对应该构建并保留它们。否则调试故障转储实际上是不可能的。
我还会开启优化。虽然它确实使调试变得更加困难,但根据应用程序的性质,性能提升通常非常重要。我们很容易看到某些算法的发布版本与调试版本的性能提高了 10 倍以上。