【问题标题】:IndexOutOfRangeException: Get Array's NameIndexOutOfRangeException:获取数组的名称
【发布时间】: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


【解决方案1】:

使用此代码

try
{
    //large number of arrays in you code like
    int[] arr1;
    int[] arr2;
    //these type of codes and declerations
}
catch(Exception e)
{
    Console.WriteLine(e.Message + "  " + e.StackTrace);
}

现在这个 StackTrace 会告诉你在哪个行号,你的代码有错误

【讨论】:

  • 请看我上面的编辑。这适用于发布版本吗?
【解决方案2】:

经过大量思考、研究和实验,我发现所描述的内容是不可能的。是的,我可以在行号中获得,但不幸的是,编译后的应用程序分发的不同版本太多,代码非常动态,行号将毫无意义。

【讨论】:

  • 如果无法确定哪些代码已分发给谁,听起来发布过程需要一些改进。
猜你喜欢
  • 2017-12-29
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2011-01-26
  • 2021-07-01
  • 2020-02-15
  • 2016-07-01
  • 2019-10-26
相关资源
最近更新 更多