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

时间:2008-09-03 14:50:03

标签: c# visual-studio build-process

何时应该为生产版本包含PDB文件?我应该使用Optimize code标志吗?这会如何影响我从异常中获得的信息?

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

3 个答案:

答案 0 :(得分:19)

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

来自the C# Language Reference

  

如果使用/ debug:full,请注意使用/ debug:full对JIT优化代码的速度和大小有一些影响,对代码质量影响很小。我们建议/ debug:pdbonly或不用PDB来生成发布代码。

答案 1 :(得分:16)

要回答您的第一个问题,如果您的异常报告需要行号,则只需要在生产版本中包含PDB。

要回答您的第二个问题,使用PDB的“优化”标志意味着任何stack "collapse" will be reflected in the stack trace。我不确定报告的实际行号是否错误 - 这需要更多调查。

要回答你的第三个问题,你可以用一个相当巧妙的技巧充分利用这两个世界。默认调试版本和默认版本构建之间的主要区别在于,在执行默认版本构建时,将打开优化并且不会发出调试符号。所以,分四步:

  1. 更改发布配置以发出调试符号。这对您的应用程序的性能几乎没有影响,并且如果(当?)您需要调试应用程序的发布版本时非常有用。

  2. 使用新版本的构建配置进行编译,例如带有调试符号,带有优化。请注意,99%的代码优化是由JIT编译器完成的,而不是语言编译器。

  3. 在应用程序的文件夹中创建一个名为xxxx.exe.ini(或dll或其他)的文本文件,其中xxxx是可执行文件的名称。此文本文件最初应如下所示:

    [.NET Framework Debugging Control]
    GenerateTrackingInfo=0
    AllowOptimize=1
    
  4. 通过这些设置,您的应用可以全速运行。如果要通过启用调试跟踪和可能关闭(CIL)代码优化来调试应用程序,只需使用以下设置:

    [.NET Framework Debugging Control]
    GenerateTrackingInfo=1
    AllowOptimize=0 
    
  5. 编辑根据cateye的评论,this can also work in a hosted environment,例如ASP.NET。

答案 2 :(得分:3)

没有必要将它们包含在您的发行版中,但您绝对应该构建它们并保留它们。否则调试崩溃转储几乎是不可能的。

我也会开启优化。虽然它确实使调试更加困难,但性能提升通常非常重要,具体取决于应用程序的性质。对于某些算法,我们很容易在发布与调试版本上看到超过10倍的性能。