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

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监听,而且我不想手动添加时间戳到我的跟踪器中。

5个回答

7
由于输出窗口文本一旦写入就是只读的,所以没有简单的方法可以做到完全符合您的要求。但是,有一种类似的方法:在向输出窗口写入新文本后追加时间戳行。这将使输出窗口变得更加混乱,但您将获得时间记录。
以下是实现方法:首先,创建一个Visual Studio插件或宏,钩取Outlook窗口的活动窗格的PaneUpdated事件。(有关如何使用宏方法执行此操作,请参见this thread)。在事件处理程序中确保检查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");
}

也可以在每行前面添加时间戳,但这很困难。您无法更改输出窗口中已有的文本(它是只读的),但是您可以清除窗口并添加文本。因此,您可以使用上述相同的事件处理程序方法来检测文本更改,但是不是追加,而是复制当前文本,在没有时间戳的任何行之前添加时间戳,清除窗口,然后重新添加现在带有时间戳的文本。问题在于,一旦输出窗口变大,性能就会下降。因此,您可能需要实现一种“懒惰盖章”类型,在后台执行清除和插入,以避免在短时间内发出数百行调试输出时使IDE崩溃。此外,当您清除并重新添加时,如果您当前正在选择输出窗口中的文本,则选择将丢失。
个人而言,我会选择简单的追加时间戳行,而不是更困难的前置方法。由于行末的内容很难看到,除非滚动,所以我可能会确保时间戳之前有一个换行符,这样用户就会看到一批或多批输出行,后跟一行时间戳。

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

还有一个想法:你可以自己编写工具窗口,例如“Ivan的调试输出”,它侦听来自实际输出窗口的事件,并将新行(带有时间戳)回显到您自己的工具窗口。这可能是最困难的选择,但应该完全符合您的要求。


@Justin,我也在看这个可扩展性。行末不太好看,因为每行长度不同,很难阅读。重绘窗口就像你说的一样是致命的。谢谢你的回答,但我真的想找到如何做到这一点,即使它有些hackish。 - Ivan Zlatanov
是的,如果您选择使用追加方式而不是行末方式,我建议在新行上放置时间戳--这会使输出窗口的行数翻倍,但比将时间戳埋在行末更好(在我看来)。此外,如果在获取控制之前已经将换行符发出到文档中,则可能无法将文本放置在行末。 - Justin Grant
还有一个想法:你可以自己创建一个工具窗口,比如“伊万的调试输出”,它监听来自真实输出窗口的事件,并将新行(带时间戳)回显到你自己的工具窗口。这可能是最困难的选择,但应该能够完全满足你的需求。 - Justin Grant
@Justin 好主意。我会尝试看看能得到什么结果。 - Ivan Zlatanov
@Justin 在我接受你的答案之前,我想简单说明一下。你是正确的,处理这个问题的唯一可能方法就是创建另一个窗口来监视输出面板中的变化。我已经这样做了,虽然我不喜欢这个解决方案,但目前这是我唯一能做的事情。感谢你的建议和信息。 - Ivan Zlatanov

3

2
现在有一个更轻量级的独立扩展适用于VS2017。 - user1007074
2017年的扩展是一个不错的补充。不幸的是,它在编译时没有显示时间戳,这正是我所期望的。在我的设置上编译UWP代码很痛苦。 - Randall Deetz

2
我正在寻找相同的功能。我的同事在消息字段中使用了$TICK宏,打印出“当前”的CPU时钟周期。
也请参考Simon Chapman的这些提示

2

0

我也想要这个功能,所以最终我写了一个扩展来实现它(就像Justin Grant在被接受的答案中建议的那样)。使用一段时间后,我发现相对时间戳在调试时对我更有用。如果大家想要绝对时间戳,我肯定可以重新添加该功能。无论如何,如果您感兴趣,可以在niahtextfilter.com上查看。

为了在Visual Studio调试会话中展示相对时间戳: Niah Text Filter debug output


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接