2010-07-21 24 views
13

我正在轉變,從Eclipse CDT的(使用Qt整合插件)到QtCreator 2.0調試,但仍然有一件事困擾我用QtCreator:我怎麼能看到qDebug的消息,而在QtCreator

當我調試在QtCreator中,我在Application output tab裏面看不到我的qDebug消息,直到我停止正在調試的應用程序...然後它們全部顯示出來,這不是很有用。

使用Eclipse,我沒有這個問題:qDebug消息在單步執行源代碼時遇到正確顯示。

我在Windows下使用Eclipse CDT和Qt Creator。我沒有嘗試在Linux下(這不是現在的選擇)。

+0

您創建了什麼樣的應用程序? GUI還是控制檯? – liaK 2010-07-24 04:42:16

+0

這是一個GUI應用程序。 – 2010-07-25 06:16:18

+0

通過任何方式你定義QT_NO_DEBUG_OUTPUT? – liaK 2010-07-28 07:10:13

回答

12

雖然不是一個完整的答案,但您可以安裝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等發送到日誌文件。

+0

我在應用程序中已經這樣做了。這是爲什麼我在調試器中看不到消息? 我的DebugView,但是,如果我能做到在Qt Creator的調試,而不來回切換兩個應用程序之間,它是一個更好的解決方案。 – 2010-08-03 09:58:02

+0

我的錯誤,我使用fprintf(錯誤......,不是的std :: CERR。現在工作得很好,謝謝。 – 2010-10-03 10:41:01

6

不必關閉應用程序看到qDebug()消息。

在Qt Creator的底部有一個名爲3 - Application output的標籤。 單擊該窗口將顯示Qt Creator底部的應用程序輸出窗口。

當應用程序仍在運行時,該特定窗口將在消息被調用後立即顯示qDebug()消息。

希望它有幫助。

編輯:

我不知道這是否是一個答案,但它可能是一個很好的有效的原因。

qDebug()文檔,

Qt的實現這些功能 打印文本到 stderr輸出在Unix/X11和Mac OS X.在Windows中,如果它是一個控制檯應用程序 ,文本發送到 控制檯;否則,它被髮送到 調試器

現在Qt Creator沒有附加它自己的調試器。我們不得不手動安裝調試器。由於您使用的是Windows,你需要安裝Windows調試工具手動..更多的文檔可以發現here ......

雖然不習慣Eclipse CDT的,我認爲有可能是附加調試它因此它顯示的調試輸出正確..

由於沒有連接到Qt Creator的調試器,它可能是行爲異常..

只要給它一個嘗試..

+0

感謝您的回答,但我沒有看到任何內部的應用程序輸出選項卡,除非我停止調試器。我已經更新了我的問題,以便更準確。 – 2010-07-23 02:18:33

+0

@esavard,既然你是進入Windows,你有你的機器上安裝了CDB(微軟控制檯調試器)? – liaK 2010-07-30 06:03:41

+0

我使用MinGW而不是Microsoft編譯器。 MinGW捆綁了Qt 4.6和調試器(gdb)。所以,我不需要安裝任何東西。但我必須爲Qt Creator構建調試助手庫。 – 2010-08-02 06:10:47

1

您是否嘗試將以下行添加到您的.pro?

OUTPUT + =控制檯

然後你可以在性病::法院輸出。

+1

我在Qt Creator Application輸出選項卡中看到std :: cout輸出,但沒有看到qDebug消息。如果我能找到一種能夠看到兩者的方式,那將會很棒。 – 2010-07-27 04:31:44

0

這是一個解決辦法,但你也許可以安裝自己的消息處理程序。如果您還沒有這樣做,請查看文檔中的qInstallMsgHandler。

我在Ubuntu 9.10類似的問題與Qt Creator的2.0和Qt 4.7.0,雖然我沒有看到標準輸出輸出,直到應用程序被關閉。就好像緩衝區沒有被刷新一樣。 儘管打印到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 
1

讓我告訴你一件事:

一次,我已經在Linux上開發一個C++控制檯應用程序。在運行應用程序期間,它正在讀取文件並通過打印出一些狀態消息開始處理某些邏輯。當我運行該應用程序的輸出是確定的。因此,對於調試方便,我決定像這樣運行的應用程序:

./a.out |& tee log 

此命令將標準輸出重定向(也可以是標準的錯誤,我不記得了)到名爲「日誌」文件。所以,當我有這個選項我看到它寫在日誌文件完全一樣,性病用完僅存在一些位移這樣的:

性病出來 - 所需的輸出

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

要添加上述答案..

始終確保在debug模式,而不是在release模式打造.. 作爲qDebug(),只有調試版本的作品。

這是愚蠢的錯誤我做,我的搜索之前,使我在這裏,我想添加這個不錯,但很重要的一點,對其他答案的列表。

+0

其實qDebug效果很好的釋放,太!至少這些消息出現在造物主(雖然似乎有成爲刷新輸出的問題,截至Creator 3.0.0)。 – mlvljr 2014-03-29 22:14:56

0

以上答案都不是正確的,我(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 
相關問題