在IIS中部署.PDB文件。有什么好处吗?

25

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

这是真的吗?我一直将它们留在本地机器以外的任何地方。

对于内部开发IIS服务器(不是生产环境,不能被外部访问),是否应该部署.pdb文件?有什么坏处吗?它们真的有任何好处吗?

3个回答

40

我一直认为.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层并抛出一个异常。现在看看运行结果:

在相同文件夹下以调试模式带有.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

在没有 .pdb 文件的情况下以 调试 构建运行:

C:\Work\PdbSpeedTest\bin\Debug>PdbSpeedTest.exe
   at PdbSpeedTest.Program.Looper(Int32 x)
   at PdbSpeedTest.Program.Main(String[] args)
15.6252

使用 .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

在没有 .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文件确实会添加堆栈跟踪信息,并减慢异常处理速度。 非常有趣!


4
需要翻译的内容:可能需要强调的是,只有在出现异常情况下才会导致执行变慢--否则会给人留下.pdb文件会影响性能的印象,即使在发布版中也是如此。如果您的代码在没有异常的情况下正常运行,我认为性能不会受到影响(这就是为什么您不应该编写使用异常进行正常分支控制的代码)。 - Kevin P. Rice
1
@KevinP.Rice,然后你有.NET框架,在非常关键和经常使用的方面完全忽略了它,“Response.Redirect”会抛出“ThreadAbortException”,因为.NET不支持真正的信号。 - Chris Marisic
1
@ChrisMarisic 是的,这是一个缺陷。有一个解决方法:http://support.microsoft.com/kb/312629 - Kevin P. Rice
@ChrisMarisic:你是说当抛出ThreadAbortException时,pdb文件的存在会影响性能,还是只有在实际要求堆栈跟踪数据的处理程序存在时才会影响性能?我通过在我的异常处理程序中忽略该异常来解决Redirect/ThreadAbortException问题,因此我认为pdb文件不会影响性能。但这样做是错误的吗? - Joshua Frank
@JoshuaFrank 我还没有进行任何分析,但从这个答案中详细描述的工作来看,我会假设在所有情况下都会抛出异常。 - Chris Marisic

30

如果你正在记录异常,那么部署PDB文件可以确保异常包含行号(所以Steven A. Lowe在许多场合告诉我;))


那么在 Release 和 Debug 模式下构建应用程序有什么区别吗?有什么影响吗?我习惯于 Java 的编译调试,它会将行号和其他调试信息直接插入到 .class 文件中。 - CodingWithSpike
1
在调试中的摘要:没有优化,添加了[Debuggable]属性,部署了PDB,包括有条件编译的#IF DEBUG,不包括#IF RELEASE代码。 - Andrew Rollings

8

如果您希望远程调试应用程序,部署.pdb文件会很有帮助。

这里有一篇MSDN文章(链接)解释了这个过程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接