Как отлаживать приложение командной строки Qt?Помогите! - PullRequest
0 голосов
/ 12 марта 2011

У меня довольно странные проблемы с моим приложением Qt ...

Приложение написано для работы в терминале / командной строке и состоит из двух потоков (+ основной, который запускает только два другихи выполняет цикл обработки событий).Эти два потока не разделяют какие-либо ресурсы (у них обоих есть своя собственная версия QNetworkAccessManager, QSqlDatabase и т. Д.), Поэтому я не использую QMutex или любой другой подобный механизм.Проблема в том, что иногда мое приложение просто падает через несколько секунд после его запуска.Я не знаю, в чем проблема, и я не могу получить полезный ответ со встроенным отладчиком QtCreator (или я не знаю, как это сделать).Самое смешное, что эти ошибки (которые приводят к сбою моего приложения) происходят случайно (по крайней мере, я не могу найти шаблон), и когда я не запускаю один из двух потоков, все работает нормально.Но опять же, они не используют какие-либо общие ресурсы ...

Вот несколько скриншотов, я не понимаю, почему в трассировке стека есть только каркасные функции Qt (ни одна из написанных мной функций - например,ошибка происходит до того, как мой код исполняется, но это не так) ...

Это наиболее часто встречаемое:

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

И эти два я получаюпросто когда-нибудь:

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

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

1 Ответ

1 голос
/ 13 марта 2011

Вы видите только код Qt в трассировке стека, потому что ошибки происходят в цикле событий (т.е. QCoreApplication :: exec). Я вижу вызовы Win32, связанные с локальным хранилищем потока в ваших следах стека. Вы создаете экземпляры QNetworkAccessManager, QSqlDatabase и т. Д. В контексте каждого потока, который их использует, или в основном потоке до запуска других? Qt выполняет некоторую работу за кулисами, которая требует, чтобы они были созданы в контексте потока, который владеет. Если глобальные данные находятся в локальном хранилище потока, а поток, пытающийся получить доступ к данным, не имеет к ним доступа, то у вас возникнут проблемы!

В противном случае использование отладчика для поиска условий гонки крайне затруднительно. Это часть, которая делает многопоточное программирование таким трудным для понимания. Я бы посоветовал исследовать, как ведут себя эти объекты Qt при использовании из нескольких потоков. Изучите свою архитектуру, а не пытайтесь найти ответ с помощью отладчика.

...