我应该使用调试信息编译发布版本为"full"还是"pdb-only"?

Rat*_*eek 110 c# debugging build debug-symbols visual-studio

在Visual Studio 2010 for C#项目中,如果转到项目属性>构建>高级>调试信息,则有三个选项:none,full或pdb-only.根据这个问题的答案,我相信我理解full和pdb之间的一些区别.但是,哪个更适合发布版本?如果我使用"完整"会有性能影响吗?如果我使用"pdb-only",那么调试生产问题会更难吗?

"full"和"pdbonly"有什么区别?https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option

Mat*_*ard 88

我会用pdb-only.您将无法将调试器附加到已发布的产品,但如果您获得崩溃转储,则可以使用Visual Studio或WinDBG在崩溃时检查堆栈跟踪和内存转储.

如果你使用full而不是pdb-only,那么你将获得相同的好处,除了可执行文件可以直接附加到调试器.鉴于您的产品和客户,您需要确定这是否合理.

确保将PDB文件保存在某处,以便在出现崩溃报告时可以引用它们.如果可以设置符号服务器来存储这些调试符号,那就更好了.

如果您选择建造none,那么在现场发生碰撞时您将无法追索.您将无法对事故进行任何形式的事后检查,这可能会严重妨碍您追踪问题的能力.

关于性能的说明:

无论约翰·罗宾斯埃里克利珀写了博客文章有关/debug的标志,他们都表明,这个设置为零性能的影响.有一个单独的/optimize标志,指示编译器是否应执行优化.

  • @AllonGuralnek引用链接的John Robbins的文章:*真正的原因:历史.回到.NET 1.0,存在差异,但在.NET 2.0中却没有.看起来.NET 4.0将遵循相同的模式.在与CLR调试团队进行双重检查后,根本没有任何区别.* (9认同)
  • @Matt,[调试开关上的MSDN文章](http://msdn.microsoft.com/en-us/library/8cw0bt21.aspx)明确警告使用"完整"设置对性能的影响:`If你使用/ debug:full,请注意,使用/ debug:full会对JIT优化代码的速度和大小产生一些影响,并对代码质量产生很小的影响.我们建议/ debug:pdbonly或不用PDB来生成发布代码 (7认同)
  • 事实并非如此.您可以使用仅pdb构建并仍然附加调试器.我只是为了确定而做到了. (5认同)
  • @Matt:如果'full'与'pdb-only'相比没有任何缺点,但只有优势,为什么'pdb-only'甚至存在?有没有理由在'完整'上使用它?此外,您应该将更正添加到"社区内容"部分中的MSDN文章. (3认同)
  • "我将使用pdb进行构建.您将无法将调试器附加到已发布的产品"这里的信息来源是什么?正如@Mark和我都注意到的那样,这似乎不正确. (2认同)

rpa*_*abi 58

警告/debug开关的 MSDN 文档(在Visual Studio中它是调试信息)似乎已经过时了!这就是它的错误

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

/ debug:pdbonly和/ debug:full之间的一个区别是/ debug:full编译器发出一个DebuggableAttribute,用于告诉JIT编译器调试信息是否可用.

那么,现在是什么呢?

  1. 仅限Pdb - 在.NET 2.0之前,它有助于调查已发布产品(客户机)的故障转储.但它没有让附加调试器.这不是.NET 2.0的情况.它与Full 完全相同.
  2. 完整 - 这有助于我们调查故障转储,还允许我们将调试器附加到发布版本.但与MSDN提到的不同,它不会影响性能(自.NET 2.0起).它与Pdb完全相同.

如果它们完全相同,为什么我们有这些选择?John Robbins(Windows调试之神)发现这些是出于历史原因.

回到.NET 1.0,存在差异,但在.NET 2.0中却没有.看起来.NET 4.0将遵循相同的模式.在与CLR调试团队进行双重检查后,完全没有区别.

控制JITter是否进行调试构建的是/ optimize开关.<...>

最重要的是,您希望使用/ optimize +和任何/ debug开关构建发布版本,以便可以使用源代码进行调试.

然后他继续证明这一点.

现在优化是一个单独的开关的一部分/optimize(在Visual Studio中称为Optimize code).

简而言之,无论DebugInfo设置pdb-only还是full,我们都会得到相同的结果.建议避免使用None,因为它会剥夺您能够分析已发布产品或附加调试器的故障转储.

  • 很棒的答案!我自己的调查(比较生成的文件)显示相同的结果. (3认同)

blo*_*art 16

您只需要PDB,但您不希望将PDB文件提供给用户.尽管如此,除了二进制文件之外,还可以将故障转储加载到WinDbg等调试器中,并查看程序实际失败的位置.当您的代码在您无权访问的计算机上崩溃时,这可能非常有用.

完整调试会将[Debuggable]属性添加到您的代码中.这对速度有很大影响.例如,可以禁用某些循环优化以使单步执行更容易.此外,它对JIT过程的影响很小,因为它打开了跟踪.


rhe*_*man 5

我正在编写一个未处理的异常处理程序,当使用 pdb-only 时,堆栈跟踪包括行号,否则当我选择 None 时,我只会得到 Sub/Function 的名称。

如果我不分发 .pdb,即使使用 pdb-only 构建,我也不会在堆栈跟踪中获得行号。

因此,我正在分发(XCOPY 在 LAN 上部署)pdb 以及来自我的 VB 应用程序的 exe。