簡體   English   中英

如何在Visual Studio 2013中寫入輸出窗口?

[英]how to write to output window in Visual Studio 2013?

我能夠編譯並運行我的可視c ++程序。 它不是控制台應用程序。 我正在修改現有的MFC應用程序。 我正在嘗試對程序進行故障排除。 我無法在調試中運行並獲取所需的跟蹤信息,因為我的程序還會讀取鼠標光標。 我也嘗試使用消息框輸出此字符串,但是同樣,消息框會干擾鼠標。

在輸出窗口中,右鍵單擊並確保已啟用“程序輸出”。

cout << "something" << endl;

但是,在輸出窗口中,我什么都看不到。

看着SO帖子,我嘗試

std::string stro = "something ";
OutputDebugString(stro);

錯誤C2664:'無效OutputDebugStringW(LPCWSTR)':無法將參數1從'std :: string'轉換為'LPCWSTR'

因此更改為std :: wstring stro

OutputDebugString(stro.c_str());

附加一個整數,我不得不

std::wostringstream wso;    
wso << i;   
stro = stro + wso.str();
OutputDebugString(stro.c_str());

但是,如果不在DEBUG中運行,則無法在窗口中看到輸出。 有沒有辦法查看非DEBUG中的輸出? 這令人驚訝地令人沮喪。

在評論中,建議編寫一個單獨的重載類。 這似乎太過分了。 Java即使在GUI程序中也具有System.out.println。 Android具有Log.v()。 遺憾的是,此處沒有等效項。

控制台應用程序具有控制台輸出,這是cout發送到的內容。 由於這不是控制台應用程序,因此您將嘗試另一種方法。 奇怪的是,您反對“當我不在調試狀態時,我看不到調試輸出”,這就是重點-不要使用OutputDebugString並期望它用於調試輸出以外的其他目的。

我認為,了解您的應用程序正在執行的,而不與它在調試器下進行交互的最佳方法(我知道嘗試調試不斷被調試活動重新觸發的事件處理程序的挫敗感)是嘗試跟蹤點。 早在2006年,我就在博客上發布了有關它們的信息 ,但它們仍然是一項很棒的技術。 讀取鼠標光標不會干擾跟蹤點,您可以打開或關閉它們,而無需重建應用程序或更改任何代碼。

設置一個斷點,然后右鍵單擊紅點並選擇“命中時”。 您可以調整輸出窗口中顯示的默認消息,以顯示您感興趣的任何值-您甚至可以在跟蹤消息中調用函數,就像您在博客條目中看到的那樣,其中我調用了a的size()方法采集。 如有必要,您甚至可以調試發行版。

實際上,只要您從調試器運行應用程序,OutputDebugStrng就應該在發行版中工作。 但是,cout無法將輸出路由到VS輸出窗格。

如果您已經有很多'cout'風格的調試代碼,最簡單的方法可能是將其替換為自定義的ostream重載,該重載確實會打印到輸出窗格中。 這是一個這是另一個

如果您可以完全重寫調試代碼,則一些圍繞OutputDebugString的宏包裝程序可能更適合您。

具有用於調試的stdout / stderr控制台窗口非常有用,在基於WinMain的應用程序上工作時,我總是會錯過它。 我使用此代碼片段為Windows應用程序創建一個控制台(並將其與現有的記錄器等鏈接在一起)。運行此代碼后,您的cout / cerr應該可以正常工作。 使用DebugView應用程序可以在DevStudio外部看到OutputDebugString輸出,但是我更喜歡這樣:

#include <io.h>
#include <fcntl.h>
...

//  DOS box console for stdin/stdout/stderr
void makeConsole()
{
    AllocConsole();

    HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
    int hCrt = _open_osfhandle((long)handle_out, _O_TEXT);
    FILE* hf_out = _fdopen(hCrt, "w");
    setvbuf(hf_out, NULL, _IONBF, 2);
    *stdout = *hf_out;

    HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
    hCrt = _open_osfhandle((long)handle_in, _O_TEXT);
    FILE* hf_in = _fdopen(hCrt, "r");
    setvbuf(hf_in, NULL, _IONBF, 2);
    *stdin = *hf_in;

    HANDLE handle_err = GetStdHandle(STD_ERROR_HANDLE);
    hCrt = _open_osfhandle((long)handle_err, _O_TEXT);
    FILE* hf_err = _fdopen(hCrt, "w");
    setvbuf(hf_err, NULL, _IONBF, 2);
    *stderr = *hf_err;

    ios::sync_with_stdio();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM