我正在将ASP.NET和Web服务解决方案部署到IIS上作为一个开发服务器。看起来上一个做这份工作的人也部署了所有的.pdb文件。我问过他们,被告知如果在服务器上保留它们,“在日志中提供更好的堆栈跟踪信息”。
这是真的吗?我一直将它们留在本地机器以外的任何地方。
对于内部开发IIS服务器(不是生产环境,不能被外部访问),是否应该部署.pdb文件?有什么坏处吗?它们真的有任何好处吗?
我正在将ASP.NET和Web服务解决方案部署到IIS上作为一个开发服务器。看起来上一个做这份工作的人也部署了所有的.pdb文件。我问过他们,被告知如果在服务器上保留它们,“在日志中提供更好的堆栈跟踪信息”。
这是真的吗?我一直将它们留在本地机器以外的任何地方。
对于内部开发IIS服务器(不是生产环境,不能被外部访问),是否应该部署.pdb文件?有什么坏处吗?它们真的有任何好处吗?
我一直认为.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文件确实会添加堆栈跟踪信息,并减慢异常处理速度。 非常有趣!
如果你正在记录异常,那么部署PDB文件可以确保异常包含行号(所以Steven A. Lowe在许多场合告诉我;))
ThreadAbortException
时,pdb文件的存在会影响性能,还是只有在实际要求堆栈跟踪数据的处理程序存在时才会影响性能?我通过在我的异常处理程序中忽略该异常来解决Redirect/ThreadAbortException问题,因此我认为pdb文件不会影响性能。但这样做是错误的吗? - Joshua Frank