在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 回答
我会用
pdb-only
构建 . 您将无法将调试器附加到已发布的产品,但如果您获得崩溃转储,则可以使用Visual Studio或WinDBG来检查崩溃时的堆栈跟踪和内存转储 .如果您使用
full
而不是pdb-only
,那么您需要确定这是否合适,因为您的产品和客户 .确保将PDB文件保存在某处,以便在出现崩溃报告时可以引用它们 . 如果可以设置symbol server来存储这些调试符号,那就更好了 .
如果您选择使用
none
进行构建,那么当您无法对事故进行任何事后检查时,您将无法追索,这可能会严重妨碍您追踪问题的能力 .A note about performance:
John Robbins和Eric Lippert都写过关于
/debug
标志的博客文章,它们都表明 this setting has zero performance impact . 有一个单独的/optimize
标志,指示编译器是否应执行优化 .WARNING MSDN documentation for / debug开关(在Visual Studio中是Debug Info)似乎已经过时了!这就是 incorrect
那么,现在是什么呢?
Pdb-only - 在.NET 2.0之前,它有助于调查已发布产品(客户机)的故障转储 . 但它没有让附加调试器 . 这不是.NET 2.0的情况 . 它与 Full 完全相同 .
Full - 这有助于我们调查故障转储,还允许我们将调试器附加到发布版本 . 但与MSDN提到的不同,它不会影响性能(自.NET 2.0起) . 它与 Pdb-only 完全相同 .
如果它们完全相同,为什么我们有这些选择? John Robbins(windows调试上帝)found out这些都是出于历史原因 .
然后他继续证明这一点 .
现在优化是单独的开关的一部分
/optimize
(在visual studio中它被称为Optimize code
) .简而言之,无论DebugInfo设置pdb-only还是full,我们都会得到相同的结果 . 建议避免 None ,因为它会剥夺您能够分析已发布产品或附加调试器的故障转储 .
您只需要PDB,但您不希望将PDB文件提供给用户 . 尽管如此,除了二进制文件之外,还可以将故障转储加载到WinDbg等调试器中,并查看程序实际失败的位置 . 当您的代码在您无权访问的计算机上崩溃时,这可能非常有用 .
完整调试会将[Debuggable]属性添加到您的代码中 . 这对速度有很大影响 . 例如,可以禁用某些循环优化以使单步执行更容易 . 此外,它对JIT过程的影响很小,因为它打开了跟踪 .
我正在编写一个未处理的异常处理程序,堆栈跟踪包含使用pdb-only时的行号,否则我只是得到Sub / Function的名称选择无 .
如果我不分发.pdb,即使使用pdb-only构建,我也不会在堆栈跟踪中获得行号 .
所以,我正在分发(在LAN上的XCOPY部署)pdb以及我的VB应用程序的exe .