JIT调试隐藏C#app中的bug

时间:2013-06-06 15:24:25

标签: debugging .net-4.0

我有一个在visual studio下运行良好的应用程序。

但是,当我独立运行它时,不会处理抛出异常的某个操作。 (预期异常,但在VS下正确处理。)

我在machine.config中添加了一行以启用JIT调试,尝试找到问题,但我无法重新创建错误(异常处理正确)。删除该行会导致错误返回。

我该如何开始寻找原因?

我的代码的相关部分(我相信)(已编辑以删除无关的详细信息)位于http://pastebin.com/i2zLCTn5

2 个答案:

答案 0 :(得分:0)

可能会影响代码在Visual Studio的不同环境中的行为方式的一些建议:

  • 在Visual Studio下运行程序时,停止Visual Studio关闭JIT Optimizer。

    有一个名为"禁止模块加载JIT优化的选项"。 ..你想尝试改变它不被勾选。

    有关该选项的详细信息,请参阅此处:

    http://msdn.microsoft.com/en-us/library/ms241594.aspx

enter image description here

  • 关闭"托管流程" ... http://msdn.microsoft.com/en-us/library/ms185330(v=vs.80).aspx

  • 运行程序,然后"附加到流程" (然后它不会进入托管过程,模块将被加载并进行JIT优化)。

  • 在“例外”对话框中,勾选“#Th; Thrown"正在处理/处理的异常的复选框....这样您就可以找到处理它的人以及原因。如果在那里处理异常,您将需要安装.NET Framework源代码,以便您可以看到详细信息。

  • 你可以尝试在WinDBG下运行它(它可能表现不同,因为你赢了并且在托管进程下运行,即.vshost)....确保你有扩展名DLL PSSCOR4(如果使用.NET 4),以便您可以理解事物。

答案 1 :(得分:0)

所以,我发现 - 或者更确切地说,一位朋友解释了 - 这个问题的原因:

禁用JIT调试时,即使执行似乎正确流动,也无法捕获跨线程的异常。

异常被抛出在Form.Closing事件处理程序中:

form.Closing += new delegate
{
    switch(form.DialogResult)
    {
        case DialogResult.OK:
            // do stuff;
            break;
        case DialogResult.Cancel:
            throw new AbortOperationException();
    }
}

// ...

try
{
    mainForm.Invoke(new Function<Form, DialogResult>(form.ShowDialog), mainWindow);
}
catch (AbortOperationException)
{
    // handle abort
}

解决方案是稍微重构以消除throw

form.Closing += new delegate
{
    if (form.DialogResult == DialogResult.OK)
    {
        // do stuff
    }
}

// ...

var result = (DialogResult)mainForm.Invoke(new Function<Form, DialogResult>
if (result == DialogResult.Cancel)
{
    // handle abort
}