跳过第一次机会异常

时间:2014-03-10 15:35:24

标签: c# exception first-chance-exception

我继承了一个项目,当在调试中启动时,会抛出8-10k NotImplementedException s的大道。因此,在调试时,应用程序需要花费一分多钟才能启动...单。时间。

我与该项目的原始开发人员进行了交谈,他们对该问题的解决方案是“只需按Ctrl + F5即可启动,无需附加调试器”。除了这是解决开发历史中最大问题的解决方案之外,它确实有效并且应用程序立即启动。我正在尝试学习这个新的代码库,所以只是跳过调试器对我来说不是一个选择。

显然我知道没有应用程序应该从万个异常开始,但在我修复之前我必须能够调试程序。

我想抑制或跳过第一次机会异常的方式与没有连接调试器的情况相同。我查看了this thread并将[DebuggerNonUserCode]属性应用于相关方法,但它只阻止将异常写入输出窗口。该程序仍需要一分钟才能启动。这可能吗?

编辑:

我忘了提及,我在Debug-> Exceptions窗口中没有检查任何内容。此外,所有异常都包含在Try.. Catch语句

2 个答案:

答案 0 :(得分:4)

  1. 检查调试下的Visual Studio设置 - >例外 - >公共语言运行时异常 - >系统 - > System.NotImplementedException并确保未选中Thrown。 (默认情况下不应该检查它,但即使要处理异常,也会导致它停止)。
  2. 糟糕的解决方法:在代码中超出所有异常的部分,您要开始调试,请添加以下行

    System.Diagnostics.Debugger.Launch();
    System.Diagnostics.Debugger.Break();
    
  3. 然后你可以启动Ctrl + F5,然后当它到达代码中的那个点时会被提示附加调试器。

答案 1 :(得分:0)

编辑:主要编辑以消除我早晨的脑损伤。

为我的观点提供一些额外的信息,尝试显示可用于减少此数量异常的启动时间的步骤。此代码允许我使用或分析N个调用而不抛出异常:

void Run(int n, bool doThrow, bool doExcept)
{
    for (int i = 0; i < n; i++)
    {
        if (doExcept)
        {
            try
            {
                if (doThrow)
                    throw new NotImplementedException();
            }
            catch (NotImplementedException)
            {
            }
        }
    }
}

如果在“异常”对话框中没有设置任何复选标记,则在使用VS主机进程的“调试”模式下,测试方案会给出以下数字。

1; 4.000 msec
1: 0.000 msec (no throw)
1: 0.000 msec (no throw, no except)
10; 32.000 msec
10: 0.000 msec (no throw)
10: 0.000 msec (no throw, no except)
100; 780.000 msec
100: 0.000 msec (no throw)
100: 0.000 msec (no throw, no except)
1000; 7251.000 msec
1000: 0.000 msec (no throw)
1000: 0.000 msec (no throw, no except)
10000; 35694.000 msec
10000: 0.000 msec (no throw)
10000: 0.000 msec (no throw, no except)

很明显,例外的数量就像你期望的那样重要。我将在一分钟内编辑来自不同场景的更多数字。

在使用VS主机进程进行调试时,异常大约需要3.5-7毫秒。在调试模式下禁用VS主机进程(仍允许调试)会将时间减少到每个例外1.9毫秒:

1; 3.000 msec
10; 21.000 msec
100; 198.000 msec
1000; 1917.000 msec
10000; 19065.000 msec

没有VS主机进程的发布模式大约需要1.8毫秒(插入笔记本电脑后编辑):

1; 3.000 msec
10; 17.000 msec
100; 184.000 msec
1000; 1823.000 msec
10000; 18248.000 msec

在调试器外部以释放模式运行每个异常大约0.016毫秒:

1; 1.000 msec
10; 1.000 msec
100; 3.000 msec
1000; 19.000 msec
10000; 138.000 msec

因此,在我的测试设置中,它仍然无法立即加载&#34;来自调试器,发布时有10k例外。但是,这可能与我在2010年安装之前遇到的问题有关(我已经重新安装了)。它在调试器外部加载速度非常快。

这是我的完整测试平台:

static void Main(string[] args)
{
    Stopwatch sw = new Stopwatch();
    var p = new Program();

    int[] tests = new int[] { 1, 10, 100, 1000, 10000 };
    foreach (int n in tests) {
        sw.Start();
        p.Run( n, true, true);
        sw.Stop();
        Console.WriteLine(string.Format("{0}; {1:0.000} msec", n, sw.ElapsedMilliseconds));

        sw.Start();
        p.Run(n, false, true);
        sw.Stop();
        Console.WriteLine(string.Format("{0}: {1:0.000} msec (no throw)", n, sw.ElapsedMilliseconds));

        sw.Start();
        p.Run(n, false, false);
        sw.Stop();
        Console.WriteLine(string.Format("{0}: {1:0.000} msec (no throw, no except)", n, sw.ElapsedMilliseconds));
    }

    Console.WriteLine("Any key to exit...");
    Console.ReadKey();
}