侦探故事:“Heisenbug,AccessViolationException,”服务器忙,Swith到“”

时间:2013-08-13 07:06:33

标签: c# access-violation

我开发了CAD / CAE系统的插件。我在C#.NET 4.0上编写它。我在这个CAD系统中使用.dll-s而我无法访问系统的源代码。

当我第一次执行插件时 - 效果很好。当插件第二次完成工作时 - 系统没有响应(“服务器忙,切换到”对话框)。

我检测到以下代码抛出了AccessViolationException(清单1):

public class TestClass : IDisposable
{
    private Session theSession;
    private static readonly UI theUI = UI.GetUI();
    private BlockDialog theDialog;
    ...

    public TestClass()
    {
        theSession = Session.GetSession();
        theDialog = theUI.CreateDialog(theDlxFileName); // throws exception in this line!
        theDialog.AddApplyHandler(ApplyCb);
        theDialog.AddOkHandler(OkCb);
        theDialog.AddUpdateHandler(UpdateCb);
        theDialog.AddInitializeHandler(InitializeCb);
        theDialog.AddDialogShownHandler(DialogShownCb);
    }

    public DialogResponse Show()
    {
        theDialog.Show();

        ...
    }

    public void Dispose()
    {
        ...
        theDialog.Dispose();
        ...
    }

    public SomeOtherFunction(...)
    {
        ...
        theSession...
        ...
    }

    ...
}

调试器(在VS 2010 sp1中)向我显示清单1中的第二行引发异常。实际上,第一行(theSession.ActiveSketch)抛出了AccessViolationException。

当我第一次启动插件时,theSession.ActiveSketch == null,但是第二次抛出异常......但我从不使用ActiveSketch!

下一步...当我逐步调试代码中的每一行时 - theSession.ActiveSketch == null!结果 - 插件工作。

下一步......当我在第3次,第4次,第5次执行插件时... - 插件工作,而theSession.ActiveSketch总是等于null!在他第3,第4,...时,我禁用了所有断点......

谁是杀手?问题出在哪里?

0 个答案:

没有答案