我希望能够在 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...
此示例是 sysinternals 应用程序 - DebugView。问题是我无法进行 Visual Studio 调试,并同时使用 DebugView 进行监听,并且我不习惯将时间戳手动添加到跟踪器中。
由于输出窗口文本一旦写入就是只读的,因此没有一种简单的方法可以准确地执行您想要执行的操作。然而,做类似的事情很容易:在新文本写入输出窗口之后添加时间戳行。这将使输出窗口变得更加混乱,但你会得到你的计时。 其工作原理如下:首先,创建一个 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");
}
也可以在每行前面添加一个时间戳,但这要困难得多。您无法更改“输出”窗口中已有的文本(它是只读的),但您可以清除该窗口并添加文本。因此,您可以使用上面相同的事件处理程序方法来检测文本更改,但您可以复制当前文本,将时间戳添加到任何还没有时间戳的行,清除窗口,然后重新添加 now,而不是附加- 带时间戳的文本。一旦输出窗口变大,就会出现性能问题。因此,您可能必须实现一种“惰性标记”,在后台进行清除和插入,以避免在短时间内发出 100 行调试输出(这是常见的)时杀死您的 IDE 。此外,当您清除并重新添加时,如果您当前正在输出窗口中选择文本,则您的选择将会丢失。
就我个人而言,我只会做简单的事情并附加时间戳行,而不是更困难的预挂起方法。由于如果不滚动就很难看到行末尾的内容,我可能会确保时间戳之前有一个换行符,因此用户会看到每批一个或多个输出行,后跟一个时间戳行。
可能有一种方法可以在显示文本之前挂钩输出窗口,但我在 VS Extensibility API 中找不到任何此类扩展点。
还有一个想法:您可以随时滚动自己的工具窗口,例如“Ivan 的调试输出”侦听来自真实输出窗口的事件,并将新行(带有时间戳)回显到您自己的工具窗口。这可能是最难的选择,但应该完全符合您的要求。
问题添加新答案,生产力强大工具 2013 扩展 和 生产力强大工具 2015 扩展 中有一项功能,可以向输出窗口添加时间戳余量,无需任何代码。