Подтвердить что ты не робот

Как я могу видеть сообщения qDebug при отладке в QtCreator

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

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

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

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

4b9b3361

Ответ 1

Пока не полный ответ, вы можете установить 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 support team for more information.

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

Ответ 2

Вам не нужно закрывать приложение, чтобы видеть сообщения 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, я предполагаю, что к нему может подключиться отладчик, и, следовательно, он правильно отображает вывод Debugging.

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

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

Ответ 3

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

OUTPUT + = Консоль

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

Ответ 4

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

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

./a.out |& tee log

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

в стандартном выводе

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:: для отладки, так как вы можете остановить screan и прочитать значение в очень полезных местах, которые с отладчиком вы не можете (я имею в виду, что вы можете, но вы не можете видеть текущее состояние из вашего приложения GUI, поскольку отладчик взял контроль).

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

Ответ 5

Чтобы добавить к приведенным выше ответам.

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

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

Ответ 6

Это обходной путь, но вы, вероятно, можете установить свой собственный обработчик сообщений. Взгляните на 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

Ответ 7

Ни один из этих ответов не был прав для меня (пользователь 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