代码之家  ›  专栏  ›  技术社区  ›  yan bellavance

我可以总是用gdb调试同一对象的多个thread类型的实例吗?

  •  2
  • yan bellavance  · 技术社区  · 16 年前

    程序运行正常。当我放置一个断点时,会生成一个分段错误。是我还是GDB?在运行时不会发生这种情况,如果我只实例化一个对象,那么就没有问题。

    我在ubuntu x86_64 karmic koala上使用qtcreator。

    更新1:

    我已经做了一个小程序,包含了这个类的简化版本。您可以在以下网址下载:

    example program

    只需在函数的第一行设置一个断点,名为drawchart(),然后进入以查看segfault是否发生

    update2:这是另一个小程序,但它实际上与mandlebrot示例相同,并且仍在发生。你可以把它和曼陀罗区别一下,看看有什么区别。

    almost the same as mandlebrot example program

    2 回复  |  直到 16 年前
        1
  •  2
  •   Adam Holmberg    16 年前

    要回答您的问题:是的,您应该能够使用gdb调试多个线程。这取决于并行设计是否合理。

    您的线程访问的数据可能存在竞争条件。正常运行程序时可能不会显示问题,但附加调试器会更改计时和调度。即使如此,当segfault发生时,您也应该能够使用调试器来中断。了解发生这种情况的地方可以告诉你种族状况或腐败,无论是什么情况。

    这是值得研究的,因为即使它在大多数“运行时”条件下不会发生,它也可能在不同的系统负载条件下出现。

        2
  •  0
  •   Spudd86    16 年前

    您是从多个线程调用qt的绘图代码吗?(特别是小部件方法)

    http://doc.qt.nokia.com/4.3/threads.html#reentrancy-and-thread-safety

    看起来qt就像gtk+,您应该只从一个线程(特别是主线程)中接触gui内容。

    我对qt还不太熟悉,无法给您提供如何更改代码的建议,但我建议将其更改为基于事件的(即呈现开始于对事件的响应,完成后在主线程中触发事件,每个线程都有自己的主循环),这样您就可以完全避免互斥和同步。