[英]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.