如何从 Visual Studio 调试输出窗口中读取文本

Posted

技术标签:

【中文标题】如何从 Visual Studio 调试输出窗口中读取文本【英文标题】:How to read in text from the visual studio debug output window 【发布时间】:2010-03-07 09:56:42 【问题描述】:

我已经阅读了几篇文章,这些文章告诉您如何从附加组件(特别是 Visual Studio 2008 集成包,通过 Visual Studio 2008 SDK 1.1)中将文本添加到 Visual Studio 的输出窗口,但没有如何从输出窗口读取文本的示例。我的目标是在调试某个应用程序(TRACE 输出和可能的标准输入/标准输出)时从调试输出窗口解析文本。 IVsOutputWindowPane 接口没有用于从输出窗口读取文本的方法。该文档似乎暗示这是可能的,但它没有提供示例:

http://msdn.microsoft.com/en-us/library/bb166236(VS.80).aspx

引用:此外,OutputWindow 和 OutputWindowPane 对象添加了一些更高级别的功能,以便更轻松地枚举输出窗口窗格并从窗格中检索文本。

最好我希望能够订阅一个在新的文本行到达时触发的事件,类似于 StreamReader 的异步读取。

【问题讨论】:

【参考方案1】:

有可能,要走的路很长:

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

假设你有一个来自其他地方的 VS IServiceProvider(vsix 扩展/不管,全球服务提供商),并且没有任何错误检查,它看起来像这样:

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 *** 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 中都不存在。但它现在存在!

【讨论】:

【参考方案2】:

VS 的默认行为(当您未显式设置侦听器时)是在调试器输出窗口中显示跟踪消息,如果您想要一个简单的解决方案并且不对消息执行其他操作,您将不胜感激。

很遗憾,这不是您的情况。因此,您必须定义一个跟踪侦听器来发送(和存储)您的跟踪消息,然后您就可以在其中读取它们。跟踪侦听器可以是一个文件(例如 XML),或者如果您不想为其他文件而烦恼,您可以通过从基类 TraceListener 派生一个类来创建自定义侦听器。

【讨论】:

跟踪侦听器如何捕获输出窗口的内容? 不错的编辑,但是,跟踪侦听器仍然只能捕获跟踪消息。这还不是“输出”窗口的全部内容。 好的,没错。如果这对用户来说足够了,他可以使用这个解决方案,但我承认这不是获取输出窗口中写入的所有内容的方式。 我会满足于能够捕获跟踪输出 - 但似乎文档暗示可以直接访问输出窗口窗格文本(请参阅对我原始帖子的编辑)。如果确实可行,那将是更可取的解决方案。文档是否完全不正确/具有误导性?这不会让我感到惊讶。 仅仅晚了 4 年,我确实找到了一种无需线程使用 IWpfTextView 的方法,这在 2010 年甚至可能不存在 :)【参考方案3】:

我不知道你问的是可能的。但是,您可以将加载项注册为应用程序的调试器,以便获得跟踪消息的输出。这些通常路由到 OutputDebugString,并且可以按照本文所述进行捕获:http://www.drdobbs.com/showArticle.jhtml?articleID=184410719。它不会给你正常的输出,只是调试,但它不依赖于被调试应用程序的技术。

【讨论】:

【参考方案4】:

此页面上的解决方案选择文本以便阅读。我希望有更好的方法。 Automatically stop Visual C++ 2008 build at first compile error?

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

【讨论】:

以上是关于如何从 Visual Studio 调试输出窗口中读取文本的主要内容,如果未能解决你的问题,请参考以下文章

非调试模式时在 Visual Studio 的输出窗口中显示消息?

非调试模式时在 Visual Studio 的输出窗口中显示消息?

Visual Studio调试技巧---Output窗口输出定位

web项目 在visual studio 输出窗口显示调试信息

有没有办法阻止Visual Studio将Thread启动和完成的语句打印到输出窗口?

如何将日志写入 Visual Studio 输出窗口?