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

问题描述 投票:0回答:3

我什么时候应该为产品发布包含 PDB 文件?我应该使用

Optimize code
标志吗?这将如何影响我从异常中获得的信息?

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

c# visual-studio build-process
3个回答
19
投票

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

来自C#语言参考

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


16
投票

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

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

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

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

  2. 使用您的新版本构建配置进行编译,即 with 调试符号和 with 优化。请注意,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 
    

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


3
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.