首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >.NET/C#调试:如何调试一个经典的heisenbug?

.NET/C#调试:如何调试一个经典的heisenbug?
EN

Stack Overflow用户
提问于 2011-08-08 15:51:20
回答 4查看 702关注 0票数 16

最近,我遇到了一个经典的Heisenbug。情况是这样的:

  • I在一个面板中有一个树列表,即主视图,在右侧的另一个面板中有一个详细视图,其中显示有关当前所选树节点的信息。(与Windows非常类似,我在树中添加一个新节点(想想在Windows资源管理器中右击一个文件夹并说“新建->文件夹”),新创建的节点将被选中。
  • 和这里的bug:右边的细节视图应该更新以显示新节点。但是,它不会。我必须切换到另一个树节点一次,然后才能在详细信息视图中看到有关新节点的信息。

该错误很容易重现,并且在“发布”和“调试”构建配置中都会发生。但是:只要我在事件处理程序中设置了断点(用于“添加新节点”菜单项)并启用它,一切都会正常工作,=>Heisenbug!我不需要做任何真正的调试。在命中断点后单击"continue“就足够了。

为了更好地理解,我制作了a video,它应该说明发生了什么。

我能想到的解决这个问题的所有方法都是让线程(应用程序是单线程的)休眠几秒钟,但这不起作用。

我非常感谢任何关于我可以尝试确定问题原因的建议。或者也许有人猜到了原因?

我的目标是3.5框架,并使用x86作为解决方案平台。树形列表控件来自DevExpress' WinForms控件;Visual Studio版本为2010。

谢谢

更新3:解决了的问题。问题是对详细视图的Focus()方法的调用没有触发GotFocus事件,该事件对于更新详细视图至关重要。(我不知道为什么,可能它已经有了焦点。)然而,这个方法并没有失败,它只是什么也没做。

现在,我只需在聚焦细节视图之前聚焦另一个控件,就是这样。调试期间一切正常的原因是,从Visual Studio切换回我的应用程序正确地将焦点设置在细节视图上。

解决这个问题的一个主要障碍是,在GotFocus事件处理程序中设置断点是无用的:每当您尝试从Visual Studio切换回应用程序时,GotFocus事件都会被重新触发,并且您会陷入无限循环。欢迎就如何解决这一问题发表意见。

不管怎样,我的具体问题已经解决了。

非常感谢所有回复或评论的人。这对我帮助很大。

更新2:在我的代码中,我选择了树中新创建的节点。这会触发FocusedNodeChangedEvent。在相应的事件处理程序中,我更新了详细信息视图并调用了它的Focus()方法。

当没有设置断点时,这似乎失败了。我认为在调试期间触发正确更新的原因是细节视图自动获得焦点。

窗口消息

更新1:以下是Eddy's answer提供的窗口消息。(已删除消息的长列表)

EN

回答 4

Stack Overflow用户

发布于 2011-08-08 15:59:14

我第一次看到支持SO的视频:)

我认为右侧窗格,或控制组,需要调用Invalidate() -我认为断点是触发的,因为它切换到VS,覆盖窗口。然后,当您再次切换回来时,它会强制所有内容重新绘制,从而使其正常工作。

票数 3
EN

Stack Overflow用户

发布于 2011-08-08 17:24:49

当你有一个"heisenbug“的时候,你需要看到发生了什么,但要轻描淡写,不要中断程序的流程。

我建议你对你的问题所在形成一个假设。然后,我将编辑代码,使其包含对Debug类的各种方法的调用,这些方法用于测试假设或仅提供用于诊断的运行时信息。然后在调试模式下运行您的代码,看看您在输出中得到了什么。

如果你有一个更难以捉摸的"hiesenbug“,它只在发布模式下发生,你需要使用你自己的日志记录机制来收集证据。

票数 3
EN

Stack Overflow用户

发布于 2011-08-08 15:56:01

在另一个窗口的更新例程中放置一个System.Diagnostics.Debugger.Break()。然后,当bug出现时,运行时断点将被触发,您可以查看堆栈。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6979132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档