Как я могу увидеть сообщения qDebug при отладке в QtCreator - PullRequest
14 голосов
/ 21 июля 2010

Я делаю переход с Eclipse CDT (с плагином интеграции Qt) на QtCreator 2.0, но есть еще одна вещь, которая беспокоит меня с QtCreator:

Когда я отлаживаю в QtCreator, я не вижумои сообщения qDebug внутри Application output tab до тех пор, пока я не остановлю отлаживаемое приложение ... Затем все они отображаются сразу, что не очень полезно.

С Eclipse у меня нет этой проблемы:сообщения qDebug отображаются правильно, когда они встречаются при пошаговом выполнении исходного кода.

Я использую как Eclipse CDT, так и Qt Creator под Windows.Я не пробовал под Linux (сейчас это не вариант).

Ответы [ 7 ]

12 голосов
/ 03 августа 2010

Хотя это и не полный ответ, вы можете установить DebugView (если вы работаете на компьютере с XP), чтобы просмотреть вывод qDebug при попытке выяснить это.

Другое решениеможет считаться хаком, но работает довольно хорошо, просто взломать отладочные сообщения самостоятельно:

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <iostream>

void msgHandler( QtMsgType type, const char* msg )
{
    const char symbols[] = { 'I', 'E', '!', 'X' };
    QString output = QString("[%1] %2").arg( symbols[type] ).arg( msg );
    std::cerr << output.toStdString() << std::endl;
    if( type == QtFatalMsg ) abort();
}

int main(int argc, char *argv[])
{
    qInstallMsgHandler( msgHandler );
    QCoreApplication a(argc, argv);

    qDebug() << "Hello world.";
    qWarning() << "Uh, oh...";
    qCritical() << "Oh, noes!";
    qFatal( "AAAAAAAAAH!" );

    return a.exec();
}

Что бы вывести:

[I] Hello world. 
[E] Uh, oh... 
[!] Oh, noes! 
[X] AAAAAAAAAH!

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Это на самом деле модификация некоторого кода, которыйЯ использую себя для отправки qDebug, qWarning и т. Д. В файл журнала.

7 голосов
/ 22 июля 2010

Вам не нужно закрывать приложение, чтобы увидеть qDebug() сообщения.

В самом низу Qt Creator есть вкладка с именем 3 - Application output. Нажатие на это окно покажет вам окно вывода приложения в нижней части Qt Creator.

В этом конкретном окне будут отображаться сообщения qDebug(), как только они будут вызваны, пока приложение еще работает.

Надеюсь, это поможет.

Edit:

Я не уверен, является ли это ответом, но это может быть хорошей уважительной причиной.

Из qDebug () документация,

Реализация этих Qt функции печатает текст в вывод stderr под Unix / X11 и Mac OS X. С Windows, если это консоль приложение, текст отправляется на приставка; в противном случае отправляется отладчик .

Теперь Qt Creator не имеет своего собственного отладчика.

Из документации Qt Creator мы должны вручную установить отладчик. Поскольку вы используете Windows, вам необходимо установить Средства отладки для Windows вручную. Дополнительную документацию можно найти здесь ...

Хотя он не используется для Eclipse CDT, Я предполагаю , возможно, к нему подключен отладчик, и, следовательно, он правильно отображает выходные данные отладки.

Поскольку к Qt Creator не подключен отладчик, он может вести себя странно ..

Просто попробуй ..

2 голосов
/ 20 июня 2013

Добавить к ответам выше.

Всегда устанавливайте в режиме debug, а не в режиме release. Как qDebug(), работает только с отладочной сборкой.

Это была глупая ошибка, которую я допустил до того, как мой поиск привел меня сюда, и я хотел добавить этот прекрасный, но важный момент в список других ответов.

1 голос
/ 27 июля 2010

Позвольте мне сказать вам кое-что:

Однажды я разработал консольное приложение c ++ для Linux. Во время работы приложения оно считывало файл и начинало обрабатывать некоторую логику, распечатывая некоторые сообщения о состоянии. Когда я запустил это приложение, вывод был в порядке. Поэтому для удобной отладки я решил запустить приложение так:

./a.out |& tee log

Эта команда перенаправляет стандартный вывод (может быть и стандартную ошибку, которую я не помню) в файл с именем "log". Поэтому, когда я запустил эту опцию, я увидел, что она записывает в файл журнала точно так же, как в std out, только есть некоторые смещения, подобные этому:

в стандартный вывод - желаемый выход

A
operation 1 success
B
operation 2 success
C
operation 3 success
D
operation 4 success

в файле журнала - вывод со смещением (это не правильно)

A
B
C
D
operation 1 success
operation 2 success
operation 3 success
operation 4 success

Полагаю, ваша проблема в этом ... Я посмотрел на QDebug и не видел ни одной функции, освобождающей буфер (что-то вроде операции, называемой flush). Поэтому я рекомендую вам не тратить время на решение этой небольшой проблемы (я также считаю, что Qt Creator 2.0 выпущен как бета-версия и может показаться ошибкой) и использовать один из следующих вариантов:

qFatal()
qCritical()
qWarning()
QMessageBox

Я лично использую QMessageBox :: about для отладки, так как вы можете остановить просмотр и прочитать значение в очень полезных местах, которые с отладчиком вы не можете (я имею в виду, что вы можете, но вы не можете видеть текущее состояние Ваше приложение GUI как отладчик взяло под свой контроль).

Надежда помогает.

1 голос
/ 27 июля 2010

Вы пытались добавить следующую строку в ваш .pro?

ВЫХОД + = Консоль

Затем вы можете вывести на std :: cout.

0 голосов
/ 11 августа 2016

Ни один из этих ответов не был для меня правильным (пользователь Arch linux). Вместо того, чтобы пытаться объяснить мои проблемы, вот файл .pro, который работал. Я не использую цикл потока QT, просто простой main (), который делает вещи и существует. Для вывода я использую cout:

QT += core
QT -= gui

CONFIG += c++14

TARGET = evo
#CONFIG += console
CONFIG -= app_bundle
#CONFIG += qt

#OUTPUT += console

TEMPLATE = app

SOURCES += main.cpp \
    individual.cpp \
    node.cpp \
    tree.cpp

HEADERS += \
    individual.h \
    node.h \
    tree.h
0 голосов
/ 27 июля 2010

Это обходной путь, но вы можете установить собственный обработчик сообщений.Посмотрите на qInstallMsgHandler в документации, если вы еще этого не сделали.

У меня похожая проблема в Ubuntu 9.10 с Qt Creator 2.0 и Qt 4.7.0, хотя я не вижу вывод stdout доПриложение закрыто.Это как если бы буфер не очищался.При печати в stderr вывод в окне вывода приложения сразу отображается.

fprintf(stderr, "Test1 \n"); // Prints immediately
fprintf(stderr, "Test2 \n\r"); // Prints immediately
fprintf(stdout, "Test3 \n"); // Delayed until app termination
fprintf(stdout, "Test4 \n\r"); // Delayed until app termination
qDebug() << "Test6 \n\r"; // Does not print at all
...