最近,我遇到了一个经典的Heisenbug。情况是这样的:
该错误很容易重现,并且在“发布”和“调试”构建配置中都会发生。但是:只要我在事件处理程序中设置了断点(用于“添加新节点”菜单项)并启用它,一切都会正常工作,=>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提供的窗口消息。(已删除消息的长列表)
发布于 2011-08-08 15:59:14
我第一次看到支持SO的视频:)
我认为右侧窗格,或控制组,需要调用Invalidate()
-我认为断点是触发的,因为它切换到VS,覆盖窗口。然后,当您再次切换回来时,它会强制所有内容重新绘制,从而使其正常工作。
发布于 2011-08-08 17:24:49
当你有一个"heisenbug“的时候,你需要看到发生了什么,但要轻描淡写,不要中断程序的流程。
我建议你对你的问题所在形成一个假设。然后,我将编辑代码,使其包含对Debug类的各种方法的调用,这些方法用于测试假设或仅提供用于诊断的运行时信息。然后在调试模式下运行您的代码,看看您在输出中得到了什么。
如果你有一个更难以捉摸的"hiesenbug“,它只在发布模式下发生,你需要使用你自己的日志记录机制来收集证据。
发布于 2011-08-08 15:56:01
在另一个窗口的更新例程中放置一个System.Diagnostics.Debugger.Break()。然后,当bug出现时,运行时断点将被触发,您可以查看堆栈。
https://stackoverflow.com/questions/6979132
复制相似问题