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

Multithreading 如何调试Qt命令行应用程序?救命啊!,multithreading,qt,debugging,qt-creator,Multithreading,Qt,Debugging,Qt Creator,我的Qt应用程序有一些相当奇怪的问题 应用程序被编写为在终端/命令提示符下工作,它由两个线程组成(+主线程只启动另外两个线程并执行事件循环)。这两个线程不共享任何资源(它们都有自己版本的QNetworkAccessManager、QSqlDatabase等…),因此我不使用QMutex或任何其他类似机制。问题是,有时我的应用程序在启动几秒钟后就崩溃了。我不知道问题出在哪里,也无法使用QtCreator的内置调试器获得有用的答案(或者我不知道如何做)。 有趣的是,这些错误(使我的应用程序崩溃)是随

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

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

这里有一些截图,我不明白为什么堆栈跟踪中只有Qt框架函数(我没有编写过一个函数——就像错误发生在代码执行之前,但这不是真的)

这是我最常看到的:

这两个我只是偶尔得到的:


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


否则,使用调试器查找是极其困难的。这就是多线程编程很难正确实现的部分原因。我建议研究从多个线程使用这些Qt对象时的行为。检查您的体系结构,而不是试图用调试器找到答案。

有趣的是,这些错误(使我的应用程序崩溃)是随机发生的(…)这在使用线程的错误代码中经常发生,一点也不好笑。@Piotr:,这要么很有趣,要么我会发疯:D我知道这是因为我写了一些东西,但我不知道如何找到那一行(而Qt对堆栈跟踪或其他任何东西都没有帮助…)有什么建议吗?谢谢你的回复:)我已经检查了我的代码并修复了其中一些(例如,我的线程现在有事件循环和其他东西),目前它可以工作;)(直到我打破它,或者发现一个bug:P)