.NET / C#调试:如何调试经典heisenbug?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (50)

最近,我遇到了一个经典的Heisenbug。情况如下:

  • 我有一个树列表,主视图在一个面板中,在另一个面板的右侧有一个详细视图,显示有关当前选择的树节点的信息。(非常类似于Windows资源管理器。)
  • 当我向树中添加一个新节点时(想想在Windows资源管理器中右键单击一个文件夹并说“新建 - >文件夹”),新创建的节点将被选中。
  • 这里是错误:右侧的详细视图应该更新以显示新节点。但是,它没有。在我能看到有关详细视图中新节点的信息之前,我必须切换到另一个树节点。

该错误很容易重现,并在“发布”和“调试”版本配置中发生。但是:只要我在事件处理程序中设置了一个断点(对于“添加新节点”菜单项)并启用它,一切正常> = Heisenbug!我不必做任何真正的调试。点击断点后点击“继续”就足够了。

为了更好地理解,我制作了一个视频,以说明发生了什么。

我能想到的所有东西都是为了摆脱这个问题,让线程(应用程序是单线程的)休眠几秒钟,但那不行。

对于我可以尝试确定问题原因的任何建议,我将不胜感激。或者,也许有人猜测原因?

我将目标锁定在3.5框架并将x86用作解决方案平台。树列表控件来自DevExpress的 WinForms控件; Visual Studio版本是2010年。

提问于
用户回答回答于
用户回答回答于

我第一次看到一个视频支持这样的

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

扫码关注云+社区