4

我继承了一个项目,当开始调试时,它会在 8-10kNotImplementedException秒的范围内抛出某个地方。正因为如此,应用程序在调试时需要一分钟多的时间才能启动......每个。单身的。时间。

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

显然,我知道任何应用程序都不应该以 10,000 个异常开始,但在我开始修复之前,我必须能够调试程序。

我想抑制或跳过第一次机会异常,就像在没有附加调试器的情况下启动一样。我查看了这个线程并将该[DebuggerNonUserCode]属性应用于相关方法,但它只阻止了将异常写入输出窗口。该程序仍然需要一分钟多的时间才能启动。这可能吗?

编辑:

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

4

2 回答 2

4
  1. 检查 Debug -> Exceptions -> Common Language Runtime Exceptions -> System -> System.NotImplementedException 下的 Visual Studio 设置,并确保未选中 Thrown。(默认情况下不应该检查它,但这会导致它停止,即使要处理异常)。
  2. 糟糕的解决方法:在所有异常之后的代码部分中,您要开始调试,输入以下行

    System.Diagnostics.Debugger.Launch();
    System.Diagnostics.Debugger.Break();
    

然后,您可以启动 Ctrl+F5,然后当调试器到达代码中的那个点时,系统会提示您附加调试器。

于 2014-03-10T17:09:52.050 回答
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)
            {
            }
        }
    }
}

当在 Exceptions 对话框中未设置复选标记时,测试场景给出以下数字,在 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

因此,在我的测试设置中,它仍然不会从调试器“立即”加载,发布中有 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();
}
于 2014-03-10T16:17:57.887 回答