9

Chcę móc zobaczyć znacznik czasu na początku każdego śledzenia w oknie debugowania w Visual Studio.Okno debugowania Visual Studio 2008, aby wyświetlić znacznik czasu?

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

[Time stamp here] => CLR ProvideAssembly: AppDomainId: 1, Ref: 'msvcm90d... 

Przykładem tego jest zastosowanie sysinternals - DebugView. Problem polega na tym, że nie mogę debugować Visual Studio i słuchać z DebugView w tym samym czasie, i nie mam ochoty ręcznie dodawać znacznik czasu do moich znaczników.

Odpowiedz

7

Ponieważ tekst okna wyjściowego jest tylko do odczytu, raz napisany, nie ma łatwego sposobu wykonania dokładnie tego, co chcesz zrobić. Łatwo jest jednak zrobić coś podobnego: dopisz linię czasową po nowy tekst zostanie zapisany w oknie wyjściowym. To sprawi, że okno wyjściowe będzie dużo bardziej nieporządne, ale dostaniesz czas.

Oto, jak to działałoby: Najpierw utwórz program Visual Studio Add-in lub Macro, który przechwytuje zdarzenie PaneUpdated w aktywnym okienku okna Outlook. (Patrz: this thread, aby dowiedzieć się, jak to zrobić, stosując metodę Macro). Upewnij się, że w module obsługi zdarzeń jest to, że pane.Name == "Debug" i ignorujesz inne panele. Po drugie, gdy wykryje nowy tekst w okienku debugowania, dołącz linię datownika, tak:

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

Możliwe jest również dokonywanie pre-PEND znacznik czasu dla każdej linii, ale jest to o wiele trudniejsze. Nie można zmienić tekstu już w oknie Output (jest to tylko do odczytu), ale można wyczyścić okno i można dodać tekst. Więc możesz użyć tego samego podejścia do obsługi zdarzeń powyżej, aby wykryć zmiany tekstu, ale zamiast dołączania możesz skopiować bieżący tekst, wstawić znaczniki czasu do dowolnych linii, które nie mają już znaczników czasu, wyczyścić okno i ponownie dodać teraz -z tekstem znacznika czasu. Problem z tym jest wydajność, gdy okno wyjściowe staje się duże. Więc prawdopodobnie musisz zaimplementować rodzaj "leniwego wytłaczania", który jest wyraźny i wstawiany w tle, aby uniknąć zabicia twojego IDE, gdy (jak to często bywa) 100 linii linii wyjściowych debugowania jest emitowanych w krótkim czasie . Ponadto po wyczyszczeniu i ponownym dodaniu, jeśli aktualnie wybierasz tekst w oknie wyjściowym, Twój wybór zostanie utracony.

Osobiście po prostu zrobiłbym prostą rzecz i dodawałem linie znaczników czasowych zamiast trudniejszego podejścia przed wprowadzeniem. Ponieważ rzeczy na końcu linii są trudne do obejrzenia bez przewijania, prawdopodobnie zapewniłbym, że był nowy znak przed znacznikiem czasu, więc użytkownik zobaczyłby każdą partię jednej lub więcej linii wyjściowych, po których następowałaby linia czasowa.

Możliwe, że istnieje sposób na przechwycenie okna wyjściowego przed wyświetleniem tekstu, ale nie mogłem znaleźć takiego punktu rozszerzalności w interfejsach API rozszerzalności VS.

Jeszcze jeden pomysł: zawsze można otworzyć własne okno narzędziowe, np. "Wyjście debugowania Ivana", które nasłuchuje zdarzeń pochodzących z rzeczywistego okna wyjściowego i wyświetla nowe linie (z sygnaturami czasowymi) do własnego okna narzędziowego. Jest to prawdopodobnie najtrudniejsza opcja, ale powinna zrobić dokładnie to, co chcesz.

+0

@Justin Patrzyłem również na tę rozszerzalność. Koniec linii jest niezbyt przyjemny, ponieważ linie mają różną długość i są bardzo trudne do odczytania. Odmalowywanie okna jest zabójcze, jak mówisz ... Dzięki za odpowiedź, ale naprawdę szukam sposobu, aby to zrobić, nawet jeśli jest to hack. –

+0

Tak, zamiast końca linii, jeśli używasz rozwiązania tylko do dodania, sugerowałbym umieszczenie znacznika czasu w nowej linii - to podwaja liczbę linii okna wyjściowego, ale jest lepsze (IMHO) niż posiadanie znaczników czasu na końcu linii. Poza tym może nie być nawet możliwe umieszczenie tekstu na końcu wiersza, jeśli nowe linie są już emitowane do dokumentu przed uzyskaniem kontroli. –

+0

Jeszcze jeden pomysł: zawsze możesz otworzyć własne okno narzędziowe, np. "Wyjście debugowania Ivana", które nasłuchuje zdarzeń pochodzących z rzeczywistego okna wyjściowego i wyświetla nowe linie (z sygnaturami czasowymi) do własnego okna narzędziowego. Jest to prawdopodobnie najtrudniejsza opcja, ale powinna zrobić dokładnie to, co chcesz. –

Powiązane problemy