Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否可以始终使用GDB调试同一对象的多个线程类型实例?_C++_C_Qt_Gdb - Fatal编程技术网

C++ 我是否可以始终使用GDB调试同一对象的多个线程类型实例?

C++ 我是否可以始终使用GDB调试同一对象的多个线程类型实例?,c++,c,qt,gdb,C++,C,Qt,Gdb,程序运行良好。当我放置断点时,会生成分段错误。是我还是GDB?在运行时,这永远不会发生,如果我只实例化一个对象,那么就不会有问题 我在ubuntu x86_64 karmic koala上使用QtCreator 更新1: 我制作了一个小程序,其中包含该类的简化版本。您可以从以下网址下载: 只需在名为drawChart()的函数的第一行上放置一个断点,然后单步执行,即可看到故障发生 更新2:这是另一个小程序,但它实际上与mandlebrot示例相同,并且仍然在运行。你可以将其与曼德勒腐菌区分开来

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

我在ubuntu x86_64 karmic koala上使用QtCreator

更新1:

我制作了一个小程序,其中包含该类的简化版本。您可以从以下网址下载:

只需在名为drawChart()的函数的第一行上放置一个断点,然后单步执行,即可看到故障发生

更新2:这是另一个小程序,但它实际上与mandlebrot示例相同,并且仍然在运行。你可以将其与曼德勒腐菌区分开来,看看细微的区别


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

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


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

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

看起来Qt就像GTK+一样,您应该只从一个线程(特别是主线程)接触GUI内容


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

但这是同一对象的不同实例。所以应该有三个都在使用的数据吗?我是根据你对这个问题的描述笼统地说的。要回答这个问题,我们需要更多关于您正在使用的类以及如何使用多个实例的背景知识。你能分享一些示例代码吗?@Adam:如果你感兴趣,你可以通过查看他/她之前的两个问题来了解更多关于这个问题的信息,这两个问题都是关于这个问题稍微不同的方面。@yan bellavance:我快速查看了Qt中的mandelbrot示例,没有发现任何明显的陷阱。当然,gdb可能有问题。。。但可能性很小。如果没有看到您的代码,除了Adam最初的答案之外,几乎不可能正确回答,即GDB处理同一对象的多个实例,即使这些对象是线程。@yan bellavance:如果我正确理解您上面的评论,您将这三个实例设置为唯一的类,问题就消失了。这加强了这是线程同步问题的情况。查看leaf类以获取静态变量或单例变量的访问。了解类定义中存在的任何宏的内容。还要考虑渲染实例可能共享的资源。遗憾的是,我现在还不能自己来模拟这一点。我看了这两个示例程序。第一个展示了你描述的行为,第二个没有(在我的测试中)。首先,在drawChart函数中,我在多个线程中得到非常奇怪的arraySize值和堆栈损坏。这使我怀疑程序中存在内存错误,但我没有做任何尝试和跟踪它。另一件事要考虑的是:每个线程需要绘制多少内存?我看到了一些相当大的配置,但没有追踪到它们可以得到多大的配置。如果它们很大,并且您最终同时分配了多个线程(因为您要进入每个线程),那么您可能会耗尽内存。另外,复制源代码以将不同的源代码分配给每个线程可以解决这个问题。我的代码已经是基于事件的了。从主线程外部绘制QImage是安全的,事实上我使用了一个qt示例来基于它。就我编写的代码而言,这个问题甚至不涉及可重入性和线程安全性。我不知道qt本身,我明白了。。。您对示例做了哪些更改?(示例中也可能有bug…)Qt示例代码也做同样的事情吗?