使用应用程序的奇怪崩溃

时间:2014-03-01 21:48:32

标签: c# winforms visual-studio-2010 debugging

我开发了一个应用程序。它一直工作到最近,但有时它给出了以下错误,它崩溃了。错误发生时没有行号或其他信息,因此我不确定要查找的内容:

 See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Windows.Forms.ListView.OnHandleCreated(EventArgs e)
   at System.Windows.Forms.Control.WmCreate(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ListView.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

任何线索或想法可能是什么?基本上它是一个刮刀和海报有时它会超过80k并且工作得很好并且完成一段时间它会产生上述错误吗?

让我知道是否有任何人遇到类似的问题,因为我显然无法找到原因!

更新

我能想到的一个原因是该工具在表单上有大约10 Listview控件,它存储信息并显示大约所有这些超过50 k。但有时它会超过80k,有时它可能会在1k上弹出错误。这工作得很好,我从未见过这个错误超过5-6个月。这刚刚开始发生。

更新

我刚才注意到的另一个奇怪的事情就是当我在任何地方点击机器人时:此错误会在随机时间后弹出。所以不确定它有什么问题。假设我有一个Listview,当我进入那里看到URL时,我看到如下错误,其他人工作正常,之后点击任何地方都会出现此错误。

在搜索时我也找到了Article。这完全符合Listview中我的方案tabcontrol,它在此处声明这是一个错误。

这是我插入ListView的方式:

           ListViewItem item1 = new ListViewItem(url, 0);
              if (listView1.InvokeRequired)
                 {
                   listView1.Invoke(new MethodInvoker(
                      () =>
                   listView1.Items.AddRange(new ListViewItem[] { item1 })
                                        ));
                 }
              else
                {
                  listView1.Items.AddRange(new ListViewItem[] { item1 });
                }

谢谢。

3 个答案:

答案 0 :(得分:2)

根据您提供的信息,我可以说,您正在尝试访问可能已被处理或删除的对象,无论是有意还是无意,通常在Visual Studio内部调试时很容易查找NullReferenceExceptions。查找试图从特定情况下可能为NULL的对象读取/写入的任何代码。

答案 1 :(得分:1)

查看堆栈跟踪:

System.Windows.Forms.ListView.OnHandleCreated(EventArgs e)

这是框架代码。这是您的代码。从栈根到崩溃的所有内容都在框架中。这几乎没有说明原因,对不起。

根据我的经验,在OnHandleCreated中遇到崩溃并不容易。我已经看过几次了,通常是因为:

  • 在完全不同的代码部分中的其他一些线程竞赛
  • 某些eventhandler尝试在Form的Close或Dispose
  • 期间重新加载/构建UI
  • 一些eventhandler尝试在Form正常启动之前重新加载/构建UI
  • 写得错误的P / Invoke代码(试图“破解”控件以实现某些非标准的外观或行为)

我在反编译器中查看了ListView.OnHandleCreated,我没有注意到在那里获得NullReference的任何简单方法。例如,在null.Items中有.columnHeadersmyFormConstructor() { InitializeComponent(); var foo = myListView.Handle; onlyNowStartTheThreads(); } 可以,但是在那里有一个null并不容易,因为ListView在内部管理这些集合。但是,我没有看到任何锁定,所以如果发生了一个线程争用,它可能就是它。

它是一个普通的ListView,还是你将它子类化并重写一些东西?

编辑:

OnHandleCreated很奇怪..默认情况下,Handle是在控件可见时第一次创建的。如果您有任何显示/隐藏行为,并且在线程启动时,如果在窗体启动时看不到ListView,则问题可能非常微妙。

OnHandleCreated是来自控件实现的本机部分的回调。我没有在代码中看到任何锁/同步。如果ListView的实际初始化被延迟,并且线程开始抽取数据,那么我猜测 可能本机回调与您的工作线程推进竞争一个新的数据项到项目中。

尝试强制更早地创建ListView的句柄。找到你的InitializeComponent函数,然后在它之后添加一个虚拟行,并在之前添加线程的开头:

{{1}}

它将导致应用程序立即开始创建Handle并等待直到它完成。我不确定确切的比赛点,但它至少会排除那个比赛的可能性。

答案 2 :(得分:0)

要找出错误发生的位置,您可以(通常)使用“Break on exception”让调试器停在发生错误的代码行。 (使调试变得更容易,但如果你正确地处理了很多错误,那么也会很烦人。)

  1. 要打开它,打开“调试”菜单,点击“例外...”(按Ctrl + D + E作为快捷方式)
  2. 在“Thrown”列中激活“公共语言运行时例外”。
  3. 单击“确定”并再次启动应用程序并发生错误。现在调试器将停在它找到的代码行(可能)。