1

我今天遇到了一个非常奇怪的错误。我在表单上有一个按钮,单击它会导致表单上的网格填充数据。如果您单击该按钮两次,它会崩溃并显示“对象引用未设置为对象的实例”。

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

然后,我删除了断点,F5'ed,单击按钮并崩溃。重新添加断点,使其工作。

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

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

4

4 回答 4

5

这里可能会进行一些异步数据加载。添加断点使异步部分有时间完成。当您单击它太快时,它仍在等待数据完成加载或其他东西,因此出现错误。您可能没有实现这一点,但第 3 方控件可能已经实现。

于 2009-04-21T16:22:39.520 回答
4

这听起来像是一个时间问题,并且一定有一些线程在后台进行 - 也许在第 3 方控制中。

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

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

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

您可以在单击按钮后立即禁用它,然后在处理完成后重新启用它。如果您无法解决根本问题(例如,它在第 3 方控制中),这将阻止问题的发生。

于 2009-04-21T16:24:49.017 回答
1

我猜这与手动进行调试所需的时间有关。也许您有一些繁重的工作(可能是与数据库的连接),当您调试时它有时间完成,但在不调试时它会使应用程序崩溃

于 2009-04-21T16:24:55.503 回答
1

另一种可能...

通常,如果您正在查看断点处的代码,断点可以改变进程的运行时行为。例如,如果您将鼠标悬停在某个属性上,或者打开本地窗口,则在继续执行进一步代码之前,将动态评估属性。

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

这不太可能,但我确实在一个对属性进行延迟初始化的第三方库中看到了这一点,但在其中一个方法之前没有正确初始化它。如果您从未在代码中查看过该属性,它会引发异常 - 但只需访问该属性即可清除它。

于 2009-04-21T16:34:49.130 回答