如何调试Qt命令行应用程序?救命!

时间:2011-03-12 18:08:54

标签: multithreading qt debugging qt-creator

我的Qt应用程序有一些相当奇怪的问题...

应用程序被编写为在终端/命令提示符下工作,它由两个线程组成(+ main主线程仅启动另外两个线程并执行事件循环)。这两个线程不共享任何资源(它们都有自己版本的QNetworkAccessManager,QSqlDatabase等等),所以我不使用QMutex或任何其他类似的机制。问题是,有时我的应用程序在启动后几秒钟就崩溃了。我不知道是什么问题,我无法通过QtCreator的内置调试器得到有用的答案(或者我不知道该怎么做)。 有趣的是,这些错误(崩溃我的应用程序)是随机发生的(至少我找不到一个模式),当我没有启动其中一个线程时,一切正常。但同样,他们不使用任何共同资源......

这里有几个截图,我不明白为什么堆栈跟踪中只有Qt框架函数(我写的不是一个函数 - 就像错误发生在我的代码执行之前,但那不是真的)... < / p>

这是我最常见的一个:

http://img859.imageshack.us/f/75996377.png/

这两个我有时会得到:

http://img690.imageshack.us/f/23373599.png/

http://img687.imageshack.us/f/25248518.png/

1 个答案:

答案 0 :(得分:1)

您只能在堆栈跟踪中看到Qt代码,因为错误发生在事件循环中(即QCoreApplication :: exec)。我在堆栈跟踪中看到与thread local storage相关的Win32调用。您是在使用它们的每个线程的上下文中创建QNetworkAccessManager,QSqlDatabase等实例,还是在其他线程启动之前在主线程中创建? Qt在幕后做了一些工作,需要在拥有所有权的线程的上下文中实例化它们。如果全局数据在线程本地存储中,并且尝试访问数据的线程没有范围,那么您将遇到问题!

否则,使用调试器查找race conditions非常困难。这就是使多线程编程变得如此困难的部分原因。我建议研究这些Qt对象在从多个线程使用时的行为方式。检查您的体系结构,而不是尝试使用调试器找到答案。