生产应用程序的PDB文件和"优化代码"标志

时间:2020-03-05 18:47:05  来源:igfitidea点击:

什么时候应该包括生产发行版的PDB文件?我是否应该使用"优化代码"标志,这将如何影响我从异常中获取的信息?

如果有明显的性能优势,我希望使用优化,但如果没有,我宁愿拥有准确的调试信息。生产应用程序通常要做什么?

解决方案

回答

如果要在堆栈跟踪中查看源文件名和行号,请​​使用仅pdb选项生成PDB。优化与PDB生成是分开的,即,我们可以优化和生成PDB,而不会影响性能。

从语言参考

If you use /debug:full, be aware that there is some impact on the speed and size of JIT optimized code and a small impact on code quality with /debug:full. We recommend /debug:pdbonly or no PDB for generating release code.

回答

不需要将它们包括在发行版中,但是我们绝对应该构建它们并保留它们。否则,几乎不可能调试故障转储。

我还将打开优化。尽管确实增加了调试的难度,但根据应用程序的性质,性能提升通常是非常微不足道的。对于某些算法,我们在发布版本与调试版本之间可以轻松地看到超过10倍的性能。

回答

要回答第一个问题,如果我们需要例外报告的行号,则只需在生产版本中包括PDB。

要回答第二个问题,在PDB中使用" Optimize"标志意味着任何堆栈"崩溃"都将反映在堆栈跟踪中。我不确定所报告的实际行号是否可能是错误的,这需要更多调查。

要回答第三个问题,我们可以通过巧妙的技巧来兼得两全。默认调试版本和默认发行版本之间的主要区别在于,当执行默认发行版本时,将打开优化功能,并且不会发出调试符号。因此,分四个步骤:

  • 更改发布配置以发出调试符号。这实际上对应用程序的性能没有影响,并且在(何时?)我们需要调试应用程序的发布版本时非常有用。
  • 使用新版本的构建配置进行编译,即使用调试符号和优化功能进行编译。请注意,代码优化的99%是由JIT编译器而不是语言编译器完成的。
  • 在应用程序的文件夹中创建一个名为xxxx.exe.ini(或者dll或者其他名称)的文本文件,其中xxxx是可执行文件的名称。该文本文件最初应如下所示:
[.NET Framework Debugging Control]
GenerateTrackingInfo=0
AllowOptimize=1
  • 有了这些设置,应用即可全速运行。当我们想通过打开调试跟踪并可能关闭(CIL)代码优化来调试应用程序时,只需使用以下设置:
[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

编辑根据cateye的评论,这也可以在诸如ASP.NET的托管环境中工作。