Visual Studio 2008调试窗口显示时间戳?

Iva*_*nov 9 debugging timestamp visual-studio-2008 visual-studio output-window

我希望能够在Visual Studio的调试窗口中的每个跟踪的开头看到时间戳.

 [Time stamp here] The thread 'Win32 Thread' (0xcd0) has exited with code 0 (0x0).

 [Time stamp here] => CLR ProvideAssembly: AppDomainId: 1, Ref: 'msvcm90d...
Run Code Online (Sandbox Code Playgroud)

示例是sysinternals应用程序 - DebugView.问题是我无法进行Visual Studio调试,同时使用DebugView进行侦听,而且我不习惯手动将时间戳添加到我的跟踪器中.

Jus*_*ant 7

由于输出窗口文本在写入后是只读的,因此没有一种简单的方法可以完全按照您的要求进行操作.但是,执行类似操作很容易:在将新文本写入输出窗口附加时间戳行.这会使输出窗口变得更加混乱,但是你会得到你的时间.

以下是这将如何工作:首先,创建一个Visual Studio加载项或宏,它挂钩Outlook窗口活动窗格的PaneUpdated事件.(有关如何使用宏方法执行此操作,请参阅此主题).确保在事件处理程序中检查pane.Name == "Debug"并忽略其他窗格.其次,当您在调试输出窗格中检测到新文本时,请附加时间戳行,如下所示:

public void AddTimestamp(DTE2 dte)
{
    // Retrieve and show the Output window.
    OutputWindow outWin = dte.ToolWindows.OutputWindow;

    pane = outWin.OutputWindowPanes.Item("Debug");
    }
    catch
    {
        pane = outWin.OutputWindowPanes.Add("Debug");
    }

    pane.OutputString("[timestamp: " + DateTime.Now.ToString() + "]\n");
}
Run Code Online (Sandbox Code Playgroud)

也可以预先为每一行添加一个时间戳,但这要困难得多.您无法在"输出"窗口中更改文本(它是只读的),但您可以清除窗口并添加文本.因此,您可以使用上面相同的事件处理程序方法来检测文本更改,但不是追加您可以复制当前文本,将时间戳预先添加到任何没有时间戳的行,清除窗口,然后重新添加 - 带时间戳文本.一旦输出窗口变大,问题就在于性能.所以你可能不得不实现一种"懒惰的标记",它可以清除并在后台插入,以避免在(如常见的话)100次调试输出行在短时间内发出时杀死你的IDE .此外,当您清除并重新添加时,如果您当前正在输出窗口中选择文本,则您的选择将丢失.

就个人而言,我只是做简单的事情,并附加时间戳行,而不是更难的预先挂起的方法.由于在没有滚动的情况下难以看到行尾的内容,我可能会确保在时间戳之前有换行符,因此用户会看到每批一个或多个输出行后跟一个时间戳行.

可能有一种方法可以在显示文本之前挂钩输出窗口,但我在VS Extensibility API中找不到任何这样的可扩展性点.

还有一个想法:您可以随时滚动自己的工具窗口,例如"Ivan的调试输出",它可以监听来自实际输出窗口的事件,并将新行(带有时间戳)回显到您自己的工具窗口.这可能是最难的选择,但应该完全按照你的意愿行事.