首页
学习
活动
专区
工具
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
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6979132

复制
相关文章

相似问题

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