在 IIS 中部署 .PDB 文件。有啥好处吗?
Posted
技术标签:
【中文标题】在 IIS 中部署 .PDB 文件。有啥好处吗?【英文标题】:Deploying .PDB files in IIS. Any benefit?在 IIS 中部署 .PDB 文件。有什么好处吗? 【发布时间】:2008-12-19 17:00:02 【问题描述】:我正在为 开发 服务器将 ASP.NET 和 Web 服务解决方案部署到 IIS。看起来最后一个完成这项工作的人也部署了所有 .pdb 文件。我问过这个问题,并被告知如果它们留在服务器上,它们“会在日志中提供更好的堆栈跟踪信息”。
这有什么道理吗?我总是将它们抛在后面,从不将它们部署到本地机器以外的任何地方。
对于内部开发 IIS 服务器(非生产,外部无法访问)是否有任何理由部署或不部署 .pdb 文件?有什么不好的事情会发生吗?它们真的有什么好处吗?
【问题讨论】:
【参考方案1】:我一直认为 .pdb 文件仅供调试器使用。如果运行时总是检查它们的调试信息,那应该意味着抛出异常时执行速度较慢,因为它必须读取 .pdb,对吧?
所以我做了一个快速测试:
using System;
using System.Text;
namespace PdbSpeedTest
class Program
static void Main(string[] args)
DateTime start = DateTime.Now;
try
Program p = new Program();
p.Looper(0);
catch (NotImplementedException e)
Console.WriteLine(e.StackTrace);
TimeSpan span = DateTime.Now - start;
Console.WriteLine(span.TotalMilliseconds.ToString());
internal void Looper(int x)
try
if (x < 100)
Looper(x + 1);
else
throw new NotImplementedException("blah!");
catch (NotImplementedException e)
throw new NotImplementedException("blah!", e);
这只是递归 100 级深度并引发异常。现在查看运行时结果:
作为debug构建with在同一文件夹中的.pdb:
C:\Work\PdbSpeedTest\bin\Debug>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x) in C:\Work\PdbSpeedTest\Program.cs:line 37
at PdbSpeedTest.Program.Main(String[] args) in C:\Work\PdbSpeedTest\Program.cs:line 16
31.2504
作为debug构建运行没有 .pdb:
C:\Work\PdbSpeedTest\bin\Debug>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x)
at PdbSpeedTest.Program.Main(String[] args)
15.6252
作为release构建使用 .pdb运行:
C:\Work\PdbSpeedTest\bin\Release>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x) in C:\Work\PdbSpeedTest\Program.cs:line 37
at PdbSpeedTest.Program.Main(String[] args) in C:\Work\PdbSpeedTest\Program.cs:line 16
31.2504
作为release构建运行没有 .pdb:
C:\Work\PdbSpeedTest\bin\Release>PdbSpeedTest.exe
at PdbSpeedTest.Program.Looper(Int32 x)
at PdbSpeedTest.Program.Main(String[] args)
15.6252
这些是从常规的旧命令提示符运行的,而不是在 Visual Studio 中运行的。所以 .pdb 肯定会添加堆栈跟踪信息,并减慢异常处理速度。 很有趣!
【讨论】:
可能应该强调较慢的执行只有在例外情况下才会发生——否则给人的印象是 .pdb 文件会损害性能,即使是发布版本也是如此。我认为如果您的代码在没有异常的情况下顺利运行,性能不会受到影响(这就是为什么您不应该使用利用异常进行正常分支控制的编写代码)。 @KevinP.Rice 然后你有 .NET 框架,当它涉及到一个非常关键且经常使用的方面时,它会完全忽略它,Response.Redirect
它会抛出 ThreadAbortException
,因为 .NET 不支持真正的信号。
@ChrisMarisic 是的。这是一个缺陷。有一个解决方法:support.microsoft.com/kb/312629
@ChrisMarisic:您是说当ThreadAbortException
被抛出 时,pdb 文件的存在会损害性能,或者仅当您有一个实际要求堆栈的处理程序时跟踪数据?我通过忽略异常处理程序中的异常来处理 Redirect/ThreadAbortException 问题,因此我希望 pdb 文件不会损害性能。但这有错吗?
@JoshuaFrank 我没有做任何分析,但从这个答案中详述的工作来看,我会假设在所有情况下都会抛出异常。【参考方案2】:
如果您正在记录异常,那么部署 PDB 文件可确保异常包括行号(因此 Steven A. Lowe 已多次通知我;))
【讨论】:
那么在 Release vs Debug 中构建应用程序有什么作用?任何事物?我习惯了 Java 世界,其中编译调试将 line#s 和其他调试信息直接插入到 .class 文件中。 链接此处:social.msdn.microsoft.com/Forums/en-US/clr/thread/… 调试摘要:无优化,添加 [Debuggable] 属性,已部署 PDB,包括有条件编译的#IF DEBUG,不包括#IF RELEASE 代码。【参考方案3】:如果您希望远程调试应用程序,部署 .pdb 文件会很有帮助。
有一篇MSDN文章here解释了这个过程
【讨论】:
以上是关于在 IIS 中部署 .PDB 文件。有啥好处吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 base64 代替原始文件(png、jpg、jpeg、gif)有啥好处吗?