在 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)有啥好处吗?

在简单的 Web 文档系统(或基本 CMS)上使用 RDBMS 与平面文件有啥真正的好处吗?

在 Weblogic 中复制连接池有啥好处吗?

在Qt中我们使用更多的指针,有啥好处吗?

在 pyspark 中注册我的 udf 有啥好处吗?

使用对象初始化器有啥好处吗?