web-dev-qa-db-ja.com

QtCreatorでデバッグ中にqDebugメッセージを表示するにはどうすればよいですか?

Eclipse CDT(Qt統合プラグイン付き)からQtCreator 2.0に移行していますが、QtCreatorで気になることが1つあります。

QtCreatorでデバッグすると、デバッグしているアプリケーションを停止するまで、Application output tab内にqDebugメッセージが表示されません...その後、すべてが一度に表示されるため、あまり役に立ちません。

Eclipseでは、この問題は発生しません。ソースコードのステップ実行中に発生すると、qDebugメッセージが正しく表示されます。

WindowsでEclipseCDTとQtCreatorの両方を使用しています。 Linuxでは試していません(現在はオプションではありません)。

14
Etienne Savard

完全な答えではありませんが、 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
kurige

あなた閉じる必要はありませんqDebug()メッセージを表示するためにアプリケーション。

Qt Creatorの一番下に_3 - Application output_という名前のタブがあります。 そのウィンドウをクリックすると、QtCreatorの下部にアプリケーション出力ウィンドウが表示されます。

その特定のウィンドウには、アプリケーションの実行中に呼び出されるとすぐにqDebug()メッセージが表示されます。

それが役に立てば幸い。

編集:

これが答えかどうかはわかりませんが、正当な原因である可能性があります。

qDebug() ドキュメントから、

これらの関数のQt実装は、Unix/X11およびMacOS Xでテキストをstderr出力に出力します。Windowsでは、コンソールアプリケーションの場合、テキストはコンソールに送信されます。それ以外の場合デバッガーに送信されます

現在、QtCreatorには独自のデバッガーがアタッチされていません。

Qt Creator ドキュメントから、デバッガーを手動でインストールする必要があります。 Windowsを使用しているので、インストールする必要がありますWindows用のデバッグツール手動で..その他のドキュメントは ここ ...

Eclipse CDTには慣れていませんが、デバッガーが接続されている可能性があるため、デバッグ出力が正しく表示されると思います。

Qt Creatorにデバッガーが接続されていないため、動作がおかしい可能性があります。

試してみてください。

7
liaK

上記の回答に追加するには..

必ずdebugモードではなくreleaseモードでビルドしてください。qDebug()として、デバッグビルドでのみ機能します。

これは私がここで私を導く前に私が犯したばかげた間違いでした、そして私はこの素晴らしいが重要な点を他の答えのリストに加えたかったのです。

2
CodeCrusader

次の行を.proに追加しようとしましたか?

出力+ =コンソール

次に、std :: coutに出力できます。

1
Live

私はあなたに何かを話させてください:

Linuxでc ++コンソールアプリケーションを開発したら。アプリケーションの実行中、ファイルを読み取り、ステータスメッセージを出力してロジックの処理を開始していました。そのアプリケーションを実行すると、出力はOKでした。したがって、デバッグを便利にするために、次のようにアプリケーションを実行することにしました。

./a.out |& tee log

このコマンドは、標準出力(私が覚えていない標準エラーの可能性もあります)を「log」という名前のファイルにリダイレクトします。したがって、このオプションを使用して実行すると、std outとまったく同じようにログファイルに書き込まれることがわかりましたが、次のような変位がいくつかあります。

in 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を使用してデバッグします。これは、screanを停止して、デバッガーではできない非常に便利な場所で値を読み取ることができるためです(つまり、GUIの現在の状態は表示できますが、表示できません)。デバッガーとしてのアプリケーションが制御を取得しました)。

希望が役立ちます。

1
Narek

これは回避策ですが、おそらく独自のメッセージハンドラーをインストールすることもできます。まだ行っていない場合は、ドキュメントのqInstallMsgHandlerを参照してください。

Qt Creator2.0とQt4.7.0を使用したUbuntu9.10でも同様の問題が発生しますが、アプリケーションを閉じるまで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
fejd

これらの答えはどれも私(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
Luke Dupin