我正在为IIS的开发服务器部署ASP.NET和Web服务解决方案。看起来执行此作业的最后一个人也部署了所有.pdb文件。我询问了这个问题,并被告知如果它们留在服务器上,它们“会在日志中提供更好的堆栈跟踪信息”。
这有什么道理吗?我总是将它们留在后面,从不将它们部署到本地机器以外的任何地方。
对于内部开发IIS服务器(非生产,外部无法访问)是否有理由部署.pdb文件?有什么不好可能发生吗?他们真的能提供任何好处吗?
答案 0 :(得分:38)
我总是认为.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肯定会添加堆栈跟踪信息,并减慢异常处理速度。 非常有趣!
答案 1 :(得分:26)
如果要记录异常,那么部署PDB文件可确保异常包括行号(因此Steven A. Lowe已多次通知我;)
答案 2 :(得分:8)
部署.pdb文件会很有帮助。
有一篇MSDN文章here解释了这个过程