【发布时间】:2014-07-31 21:57:15
【问题描述】:
我最近在工作中继承了一个 C# (.NET 4.0) 项目。该项目有 400k+ 行代码,并使用许多大型的 large try/catch 块来捕获 any 异常。有时,应用程序会引发 IndexOutOfRangeException,我的老板要求我尝试找到一种简单的方法来发现引发异常的数组的名称。 (这么大的 try/catch 块可以包含许多数组。)我知道我可以使用 FirstChanceException 事件来触发代码在引发 IndexOutOfRangeException 时执行。例如:
class ExceptionTest
{
public static void Main()
{
AppDomain.CurrentDomain.FirstChanceException
+= new EventHandler<FirstChanceExceptionEventArgs>(CurrentDomain_FirstChanceException);
int[] arr = new int[0];
arr[0] = 0;
Console.Read();
}
static void CurrentDomain_FirstChanceException(object sender,
FirstChanceExceptionEventArgs e)
{
if (e.Exception.GetType() == typeof(IndexOutOfRangeException))
{
Console.WriteLine(e.Exception.StackTrace);
}
}
}
不幸的是,我似乎无法以这种方式找到有问题的数组的名称,但是梳理 400k+ 行代码不是一种选择。
我个人不明白这项任务的意义,但如果能提供任何帮助,我将不胜感激。这甚至可能吗?
编辑:2014 年 8 月 5 日
我应该澄清一下:很容易找到有问题的数组 在 VS 中调试。这个任务的重点是发现哪些数组 在使用程序的 release 构建时抛出异常 由我们的客户。程序使用了一组日志文件,但是这些文件 仅指示抛出的异常类型 - 不是数组 名称或行号。
【问题讨论】:
-
不能分析异常堆栈看看问题出在哪里吗?
-
堆栈跟踪绝对是前进的方向。它应该向您显示包含错误的行。诚然,同一行可能有多个数组访问。
-
如果可能,使用程序集重建和部署调试符号。然后从异常中分析堆栈跟踪。
-
请确认
catch块不包含throw ex(或任何命名的异常变量),因为您将丢失堆栈跟踪。 -
你有运行时可用的 pdb 文件吗?
标签: c# arrays c#-4.0 first-chance-exception indexoutofrangeexception