【问题标题】:Deploying .PDB files in IIS. Any benefit?在 IIS 中部署 .PDB 文件。有什么好处吗?
【发布时间】:2008-12-19 17:00:02
【问题描述】:

我正在为 开发 服务器将 ASP.NET 和 Web 服务解决方案部署到 IIS。看起来最后一个完成这项工作的人也部署了所有 .pdb 文件。我问过这个问题,并被告知如果它们留在服务器上,它们“会在日志中提供更好的堆栈跟踪信息”。

这有什么道理吗?我总是将它们抛在后面,从不将它们部署到本地机器以外的任何地方。

对于内部开发 IIS 服务器(非生产,外部无法访问)是否有任何理由部署或不部署 .pdb 文件?有什么不好的事情会发生吗?它们真的有什么好处吗?

【问题讨论】:

    标签: .net asp.net web-services iis


    【解决方案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解释了这个过程

    【讨论】:

      猜你喜欢
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      相关资源
      最近更新 更多