首页 文章

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

提问于
浏览
103

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

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

4 回答

  • 4

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

    如果您使用 full 而不是 pdb-only ,那么您需要确定这是否合适,因为您的产品和客户 .

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

    如果您选择使用 none 进行构建,那么当您无法对事故进行任何事后检查时,您将无法追索,这可能会严重妨碍您追踪问题的能力 .

    A note about performance:

    John RobbinsEric Lippert都写过关于 /debug 标志的博客文章,它们都表明 this setting has zero performance impact . 有一个单独的 /optimize 标志,指示编译器是否应执行优化 .

  • 51

    WARNING MSDN documentation for / debug开关(在Visual Studio中是Debug Info)似乎已经过时了!这就是 incorrect

    如果您使用/ debug:full,请注意对JIT优化代码的速度和大小有一些影响,并且/ debug:full对代码质量的影响很小 . 我们建议/ debug:pdbonly或不用PDB来生成发布代码 . / debug:pdbonly和/ debug:full之间的一个区别是/ debug:full编译器发出DebuggableAttribute,它用于告诉JIT编译器调试信息是否可用 .

    那么,现在是什么呢?

    • Pdb-only - 在.NET 2.0之前,它有助于调查已发布产品(客户机)的故障转储 . 但它没有让附加调试器 . 这不是.NET 2.0的情况 . 它与 Full 完全相同 .

    • Full - 这有助于我们调查故障转储,还允许我们将调试器附加到发布版本 . 但与MSDN提到的不同,它不会影响性能(自.NET 2.0起) . 它与 Pdb-only 完全相同 .

    如果它们完全相同,为什么我们有这些选择? John Robbins(windows调试上帝)found out这些都是出于历史原因 .

    回到.NET 1.0,存在差异,但在.NET 2.0中却没有 . 看起来.NET 4.0将遵循相同的模式 . 在与CLR调试团队进行双重检查后,完全没有区别 . 控制JITter是否进行调试构建的是/ optimize开关 . <...>最重要的是,您希望使用/ optimize和任何/ debug开关构建发布版本,以便可以使用源代码进行调试 .

    然后他继续证明这一点 .

    现在优化是单独的开关的一部分 /optimize (在visual studio中它被称为 Optimize code ) .

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

  • 16

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

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

  • 84

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

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

    所以,我正在分发(在LAN上的XCOPY部署)pdb以及我的VB应用程序的exe .

相关问题