2009-04-21 97 views
1

今天我遇到了一个非常奇怪的错误。我在窗体上有一个按钮,单击它会导致我的窗体上的网格填充数据。如果您单击该按钮两次,它会崩溃,并且“对象引用未设置为对象的实例”。何时可以断点改变代码的执行方式?

我最终在处理该网格的人口的Sub的开始处放置了一个断点,并且我发现...它不再崩溃。我会点击按钮,在Visual Studio中按'F5',它不会崩溃。我做了这个,至少10次,它是固定的。

然后,我删除了断点,F5'ed,点击按钮,它崩溃。重新添加断点允许它工作。

有人可以解释这里发生了什么吗?我使用的网格是第三方控件(Infragistics),应用程序是WinForms应用程序。我没有做任何线程 - 我唯一的想法是,它是某种'竞赛条件'?但即使这样对我来说也没有什么意义。

编辑:这是一个VB.Net应用程序/ Visual Studio 2008的

回答

5

有可能是数据会在这里的一些异步加载。添加断点使异步部分的时间结束。当你点击它太快,它仍然在等待数据完成加载或某事,因此错误。你可能没有实现这一点,但第三方控制可能有。

4

这听起来像是一个计时问题&必须有一些线程在后台进行 - 也许在第三方控制。

你能从异常中获得调用堆栈吗?

在发布模式下(或没有中断点时),您可以在第一次点击完全处理之前再次点击该按钮。

设置中断点后,调试器将获得焦点并允许应用程序再次同步。

您可以在按钮被点击后立即禁用按钮,然后在处理完成后重新启用按钮。如果您无法解决潜在的问题(例如,它在第三方控制中),那么这将停止发生问题。

1

我想这与手动进行调试所花费的时间有关。也许你有很重的东西的工作(也许是与数据库的连接),当你调试它的时间来完成,但是当没有调试崩溃应用程序的其他

1

一种可能性......

通常情况下,可以断点如果您在断点处查看代码,请更改进程的运行时行为。例如,如果您将鼠标悬停在某个属性上,或者打开本地窗口,则会在继续执行其他代码之前对属性进行实时评估。

由于属性的getter实际上只是一种方法,写得很差的类实际上可以在属性中执行“额外”工作,以防止代码崩溃。

这不是特别有可能,但是我确实在一个第三方库中看到了这一点,该库对属性进行了惰性初始化,但未在其中一个方法之前正确初始化它。如果你从来没有看过代码中的属性,它会抛出一个异常 - 但只是访问属性清理它。

相关问题