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

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

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

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

Я использую и Eclipse CDT и спокойного Создателя в соответствии с Windows. Я не попробовал в соответствии с Linux (который не является опцией прямо сейчас).

14
задан demonplus 24 October 2015 в 16:32
поделиться

5 ответов

Хотя это и не полный ответ, вы можете установить 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 и т. д. в файл журнала.

12
ответ дан 1 December 2019 в 12:26
поделиться

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

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

7
ответ дан 1 December 2019 в 12:26
поделиться

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

OUTPUT + = Console

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

1
ответ дан 1 December 2019 в 12:26
поделиться

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

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

./a.out |& tee log

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

в 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
ответ дан 1 December 2019 в 12:26
поделиться

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

Похожие вопросы: