9

我希望能够在 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 进行侦听,而且我不喜欢手动将时间戳添加到我的跟踪器中。

4

4 回答 4

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");
}

也可以为每一行预先添加时间戳,但这要困难得多。您无法更改“输出”窗口中的文本(它是只读的),但您可以清除窗口并添加文本。因此,您可以使用上面相同的事件处理程序方法来检测文本更改,但您可以复制当前文本,而不是附加,将时间戳添加到任何还没有时间戳的行,清除窗口,然后重新添加现在- 带有时间戳的文本。一旦输出窗口变大,问题就是性能。因此,您可能必须实现一种“延迟标记”,它会在后台清除并插入,以避免在(通常)100 行调试输出在短时间内发出时杀死您的 IDE . 此外,当您清除并重新添加时,如果您

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

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

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

于 2009-11-09T18:42:11.533 回答
3

要为ANCIENT问题添加新答案,生产力电动工具 2013 扩展生产力电动工具 2015 扩展中有一个功能,可在输出窗口中添加时间戳边距,无需代码。

于 2016-02-25T23:46:13.703 回答
2

我一直在寻找相同的功能。我的同事$TICK在消息字段中提出了宏,打印出“当前”cpu 滴答声。

看看西蒙查普曼的这些技巧,也是。

于 2009-11-25T10:04:30.270 回答
0

我也想要这个功能,所以最终我写了一个扩展来做到这一点(就像贾斯汀格兰特在接受的答案中建议的那样)。在使用了一段时间后,我认为相对时间戳在调试时对我更有用。如果人们想要绝对时间戳,我相信我可以重新添加该功能。无论如何,如果您有兴趣,可以在niahtextfilter.com上查看。

并在 Visual Studio 调试会话中显示相对时间戳: Niah 文本过滤器调试输出

于 2019-08-21T15:10:28.573 回答