9

我希望能夠在Visual Studio的調試窗口中的每條軌跡的開始處看到一個時間戳記。Visual Studio 2008調試窗口顯示時間戳?

[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進行偵聽,而且我不習慣將時間戳手動添加到我的跟蹤器。

回答

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

它也可以預先掛起一個時間戳的每一行,但它是一個困難得多。您不能在輸出窗口中更改文本(它是隻讀的),但您可以清除該窗口並添加文本。因此,您可以使用上述相同的事件處理方法來檢測文本更改,但不是追加您可以複製當前文本,而是將時間戳添加到任何沒有時間戳的行,清除窗口並重新添加現在-with-timestamps文本。一旦你的輸出窗口變大,這個問題就是性能問題。所以你可能不得不實現一種在後臺進行清除和插入的「懶惰衝壓」,以免在常見的情況下在100秒內調試輸出線短時間內發光。另外,當您清除並重新添加時,如果您當前正在輸出窗口中選擇文本,則您的選擇將丟失。個人而言,我只是做簡單的事情,並附加時間戳行,而不是更難的預先的方法。由於在行尾很難看到沒有滾動的東西,我可能會確保在時間戳之前有一個換行符,所以用戶會看到每個批次的一個或多個輸出行,後面跟着一個時間戳行。

可能有一種方法可以在顯示文本之前掛鉤輸出窗口,但我無法在VS Extensibility API中找到任何這樣的可擴展性點。

還有一個想法:您可以隨時推出自己的工具窗口,例如「Ivan的調試輸出」監聽來自真實輸出窗口的事件,並將新行(帶時間戳)回顯給您自己的工具窗口。這可能是最難的選擇,但應該按照你的意願去做。

+0

@Justin我也在看可擴展性。線條的結尾不是很好,因爲線條有不同的長度,而且很難閱讀。窗戶的重新粉刷是一個殺手,正如你所說的......感謝你的回答,但我真的正在研究如何做到這一點,即使它的黑客。 – 2009-11-09 22:27:26

+0

是的,而不是行尾,如果你只用一個附加的解決方案,我建議在一個新行上植入時間戳 - 這使輸出窗口的行數加倍,但更好(恕我直言)比在行末埋下時間戳。另外,如果在獲得控制權之前換行符已經發送到文檔中,則可能無法在文檔的末尾放置文本。 – 2009-11-09 23:18:48

+0

還有一個想法:您可以隨時推出自己的工具窗口,例如「Ivan的調試輸出」監聽來自真實輸出窗口的事件,並將新行(帶時間戳)回顯給您自己的工具窗口。這可能是最難的選擇,但應該按照你的意願去做。 – 2009-11-09 23:20:14

相關問題