繁体   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