没有 pdb 文件的堆栈跟踪中更具体的异常位置
More specific exception location in stacktrace without pdb file
在应用程序中,应始终尽最大努力确保代码经过全面测试,并以能够妥善处理格式错误的输入或操作的方式编写。
虽然我们只是人,但错误会悄悄出现,在最后的努力中改善用户体验而不是毫不客气地崩溃到桌面,捕获未处理的异常、向用户抛出消息并记录一些异常是很常见的故障信息。
通常 PDB 不会与完成的程序一起分发,因此系统跟踪将不包含行号,这使得很难找到引发错误的违规行。
采用以下示例程序(为简单起见,一个 .net 控制台应用程序)
using System;
namespace ExceptionTest
{
class Program
{
static void Main(string[] args)
{
// Just in case we forget to catch something properly.
System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
Console.WriteLine(DoStuff(10));
Console.ReadKey();
}
static int DoStuff(int parameter)
{
int[] data = { 1, 2, 3, 4, 5, 6 };
int value = data[parameter]; // Improperly checked code
return value;
}
static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine(e.ExceptionObject.ToString());
Console.WriteLine("Press Enter to continue");
Console.ReadLine();
Environment.Exit(1);
}
}
}
如果在没有 .pdb 文件的情况下得到 运行,它将尽职尽责地捕获错误并报告。
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at ExceptionTest.Program.DoStuff(Int32 parameter)
at ExceptionTest.Program.Main(String[] args)
Press Enter to continue
有没有办法在用户代码中包含错误发生的点,或者这只是不存在于可执行文件中(显然包含一些符号信息,因为我们可以看到 DoStuff 函数名称。
例如,除了堆栈跟踪之外,我还有什么方法可以记录 int value = data[parameter];
。
您在没有 PDB 的调用堆栈中看到的内容是可用的,因为您的 C# 代码是作为中间语言 (IL) 提供的。
这样想:您可以通过反射做的所有事情(例如询问 类 和询问 类 他们的方法)在 IL 代码中也可用,因此可以成为堆栈的一部分跟踪。
但是,IL 代码仍然在发布版本中进行了优化,例如可以删除未使用的变量。
Is there any way to include the point
没有。该信息位于 PDB 中。这个想法是,您甚至为发布版本构建 PDB,并且 store them in a symbol server 至少为您交付给客户的版本构建 PDB。
我也不只是捕获异常并向用户显示信息或将其保存在日志文件中。相反,create a crash dump 文件 (.DMP),您可以使用为此目的存储的 PDB 在您的 PC 上进行分析。
在应用程序中,应始终尽最大努力确保代码经过全面测试,并以能够妥善处理格式错误的输入或操作的方式编写。
虽然我们只是人,但错误会悄悄出现,在最后的努力中改善用户体验而不是毫不客气地崩溃到桌面,捕获未处理的异常、向用户抛出消息并记录一些异常是很常见的故障信息。
通常 PDB 不会与完成的程序一起分发,因此系统跟踪将不包含行号,这使得很难找到引发错误的违规行。
采用以下示例程序(为简单起见,一个 .net 控制台应用程序)
using System;
namespace ExceptionTest
{
class Program
{
static void Main(string[] args)
{
// Just in case we forget to catch something properly.
System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
Console.WriteLine(DoStuff(10));
Console.ReadKey();
}
static int DoStuff(int parameter)
{
int[] data = { 1, 2, 3, 4, 5, 6 };
int value = data[parameter]; // Improperly checked code
return value;
}
static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine(e.ExceptionObject.ToString());
Console.WriteLine("Press Enter to continue");
Console.ReadLine();
Environment.Exit(1);
}
}
}
如果在没有 .pdb 文件的情况下得到 运行,它将尽职尽责地捕获错误并报告。
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at ExceptionTest.Program.DoStuff(Int32 parameter)
at ExceptionTest.Program.Main(String[] args)
Press Enter to continue
有没有办法在用户代码中包含错误发生的点,或者这只是不存在于可执行文件中(显然包含一些符号信息,因为我们可以看到 DoStuff 函数名称。
例如,除了堆栈跟踪之外,我还有什么方法可以记录 int value = data[parameter];
。
您在没有 PDB 的调用堆栈中看到的内容是可用的,因为您的 C# 代码是作为中间语言 (IL) 提供的。
这样想:您可以通过反射做的所有事情(例如询问 类 和询问 类 他们的方法)在 IL 代码中也可用,因此可以成为堆栈的一部分跟踪。
但是,IL 代码仍然在发布版本中进行了优化,例如可以删除未使用的变量。
Is there any way to include the point
没有。该信息位于 PDB 中。这个想法是,您甚至为发布版本构建 PDB,并且 store them in a symbol server 至少为您交付给客户的版本构建 PDB。
我也不只是捕获异常并向用户显示信息或将其保存在日志文件中。相反,create a crash dump 文件 (.DMP),您可以使用为此目的存储的 PDB 在您的 PC 上进行分析。