我应该编译发布版本与调试信息为“完整”或“ pdb-only”?

在 Visual Studio for a C # Project 中,如果您转到 Project Properties > Build > Advanced > Debug Info,您有三个选项: nonefullpdb-only

哪种设置最适合发布版本?


那么,fullpdb-only有什么不同呢?

如果我使用 full会有性能分歧吗?如果我使用 pdb-only调试生产问题会更困难吗?

45178 次浏览

您将只需要 PDB,但不希望将 PDB 文件提供给用户。不过,在二进制文件的旁边为自己准备这些文件,可以将崩溃转储加载到 WinDbg 这样的调试器中,并查看程序实际失败的地方。当您的代码在您无法访问的机器上崩溃时,这非常有用。

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

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

If you go with full rather than pdb-only, you'll get the same benefits, except that the executable can be attached directly to a debugger. You'll need to determine if this is reasonable given your product & customers.

确保将 PDB 文件保存在某个地方,以便在收到崩溃报告时可以引用它们。如果可以设置一个 符号服务器来存储这些调试符号,那就更好了。

如果你选择构建与 none,你将没有追索权时,有一个崩溃的领域。你将无法做任何类型的事后检查坠机,这可能会严重妨碍你的能力,追踪问题。

关于表现的一点注意:

John RobbinsEric Lippert都写过关于 /debug标志的博客文章,它们都指出了 此设置对性能的影响为 < em > zero 。有一个单独的 /optimize标志,它指示编译器是否应该执行优化。

I'm in the process of writing a unhandled exception handler and the stack trace includes the line number when pdb-only is used, otherwise I just get the name of the Sub/Function when I choose None.

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

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

警告 MSDN 文件 for /debug switch (In Visual Studio it is Debug Info) seems to be out-of-date! This is what it has which is incorrect

如果使用/debug: 满了,请注意对 JIT 优化代码的速度和大小对代码的影响很小 质量/调试: 满了。我们建议/调试: PDBONY或不使用 PDB 生成释放代码。

/debug: PDBONY和/debug: 满了之间的一个区别是 /debug: full 编译器发出一个 DebuggableAttribute,它用于 告诉 JIT 编译器调试信息是可用的。

Then, what is true now?

  1. PDB-only -在此之前。NET 2.0,它有助于调查崩溃转储从发布的产品(客户机)。但它不允许附加调试器。这不是来自。NET 2.0.exactly满了是一样的。
  2. Full -这有助于我们研究崩溃转储,还允许我们将调试器附加到发布版本。但与 MSDN 提到的不同,它不会影响性能(因为。NET 2.0).和 只有 PDB完全一样。

如果它们完全一样,为什么我们有这些选项?约翰罗宾斯(Windows 调试之神) 发现了这些存在的历史原因。

在.NET 1.0的时候是有区别的,但是在.NET 2.0中没有。 看起来.NET 4.0将遵循同样的模式 与 CLR 调试团队进行双重检查时,在 所有。

控制 JITter 是否执行调试构建的是/优化 switch. <…>

底线是您希望使用 和任何/debug 开关,以便您可以使用源代码进行调试 密码。

then he goes on to prove it.

Now the optimization is part of a separate switch /optimize (in visual studio it is called Optimize code).

简而言之,无论 DebugInfo 设置为 pdb-only 还是 full,我们都会得到相同的结果。建议避免使用 没有,因为它将使您无法分析来自已发布产品的崩溃转储或附加调试器。