簡體   English   中英

如何從Visual Studio調試輸出窗口中讀取文本

[英]How to read in text from the visual studio debug output window

我已經閱讀了幾篇文章,這些文章告訴您如何從附加組件(特別是Visual Studio 2008集成包,通過visual Studio 2008 SDK 1.1)中將文本添加到Visual Studio的輸出窗口中,但是沒有有關如何從輸出窗口讀取文本。 我的目標是在調試某個應用程序(TRACE輸出以及可能的stdin / stdout)時,從調試輸出窗口中解析文本。 IVsOutputWindowPane接口沒有用於從輸出窗口讀取文本的方法。 該文檔似乎暗示有可能,但沒有提供示例:

http://msdn.microsoft.com/zh-cn/library/bb166236(VS.80).aspx

Quote:另外,OutputWindow和OutputWindowPane對象添加了一些更高級別的功能,以使枚舉Output窗口窗格以及從窗格中檢索文本變得更加容易。

最好是,我希望能夠訂閱一個事件,該事件在一行新文本到達時觸發,類似於StreamReader的異步讀取。

可能這是一條漫長的曲折道路:

ServiceProvider-> IVsOutputWindow-> GetPane(debugwindow)-> IVsUserData-> GetData(wpftextviewhost)-> IWpfTextViewHost-> IWpfTextView-> TextBuffer->更改的事件。

假設您從其他地方(vsix擴展/無論是什么,全局服務提供者)那里都有一個VS IServiceProvider ,並且沒有任何錯誤檢查,它看起來像這樣:

IVsOutputWindow outWindow = ServiceProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow;
Guid debugPaneGuid = VSConstants.GUID_OutWindowDebugPane;
IVsOutputWindowPane pane;
outWindow.GetPane(ref debugPaneGuid, out pane);
// from here up you'll find in lots of other stackoverflow answers, 

// the stuff from here down is interesting to this question
IVsUserData userData = (IVsUserData)pane;
object o;
Guid guidViewHost = DefGuidList.guidIWpfTextViewHost;
userData.GetData(ref guidViewHost, out o);

IWpfTextViewHost viewHost = (IWpfTextViewHost)o;
IWpfTextView textView = viewHost.TextView;
textView.TextBuffer.Changed += YourTextChangedHandlerHere;

每當輸出窗口獲取更多數據時,將調用您的文本更改處理程序。 您不一定會逐行獲得它,但您很有可能會獲得不需要獨自處理的大塊。

很有可能在2010年VS中甚至不存在上述某些內容。但是現在已經存在了!

VS的默認行為(當您未顯式設置偵聽器時)是在調試器輸出窗口中顯示跟蹤消息,如果您想要一個簡單的解決方案並且對消息不執行其他任何操作,則不勝感激。

不幸的是,這不是您的情況。 因此,您必須定義一個跟蹤偵聽器,以發送(並存儲)您的跟蹤消息,然后才能在其中讀取它們。 跟蹤偵聽器可以是一個文件(例如XML),也可以通過從基類TraceListener派生一個類來創建自定義偵聽器,如果您不想麻煩其他文件。

我不知道你問的是可能的。 但是,您可以將外接程序注冊為應用程序的調試器,以便獲得跟蹤消息的輸出。 這些通常路由到OutputDebugString,並且可以按照本文中的描述進行捕獲: http : //www.drdobbs.com/showArticle.jhtml ?articleID=184410719。 它不提供正常的輸出,僅提供調試,但不取決於調試的應用程序的技術。

此頁面上的解決方案選擇文本以便閱讀。 我希望有更好的方法。 自動停止Visual C ++ 2008年生成第一次編譯錯誤?

Private Sub OutputWindowEvents_OnPaneUpdated(ByVal pPane As OutputWindowPane) Handles OutputWindowEvents.PaneUpdated
    pPane.TextDocument.Selection.SelectAll()
    Dim Context As String = pPane.TextDocument.Selection.Text
    pPane.TextDocument.Selection.EndOfDocument()
End Sub

暫無
暫無

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

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