9

Quiero poder ver una marca de tiempo al comienzo de cada traza en la ventana de depuración en Visual Studio.Visual Studio 2008 Debug ¿Ventana para mostrar la marca de tiempo?

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

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

ejemplo de esto es la aplicación sysinternals - DebugView. El problema es que no puedo tener la depuración de Visual Studio y escuchar con DebugView al mismo tiempo, y no me siento cómodo con agregar la marca de tiempo manualmente a mis trazadores.

Respuesta

7

Dado que el texto de la ventana de salida es de solo lectura una vez que se escribe, no hay una manera fácil de hacer exactamente lo que quiere hacer. Sin embargo, es fácil hacer algo similar: agregar una línea de marca de tiempo después de se escribe texto nuevo en la ventana de resultados. Esto hará que la ventana de salida sea mucho más desordenada, pero obtendrá sus tiempos.

Así es como funcionaría esto: Primero, cree un Complemento de Visual Studio o Macro que enganche el evento PaneUpdated del panel activo de la Ventana de Outlook. (Consulte this thread para saber cómo hacer esto con un enfoque Macro). Asegúrese de verificar, en el controlador de eventos, pane.Name == "Debug" e ignorar otros paneles. En segundo lugar, cuando se detecta un nuevo texto en el panel de resultados de depuración, añadir una línea de marca de tiempo, así:

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

También es posible pre-pend una marca de tiempo a cada línea, pero es mucho más difícil. No puede cambiar el texto ya en la ventana Salida (es de solo lectura), pero puede borrar la ventana y agregar texto. Por lo tanto, podría usar el mismo enfoque de controlador de eventos anterior para detectar cambios de texto, pero en lugar de agregar podría copiar el texto actual, anteponer marcas de tiempo a cualquier línea que no tenga marcas de tiempo, borrar la ventana y volver a agregar el ahora -with-timestamps texto. El problema con esto es el rendimiento una vez que su ventana de salida se vuelve grande. Por lo tanto, es probable que deba implementar un tipo de "estampación diferida" que borre e inserte en segundo plano, para evitar matar a su IDE cuando (como es habitual) se emitan 100 líneas de salida de depuración en poco tiempo. . Además, cuando borra y vuelve a agregar, si actualmente está seleccionando texto en la ventana de salida, su selección se pierde.

Personalmente, me gustaría hacer las cosas fáciles y anexar las líneas de marca de tiempo en lugar del enfoque de pre-pend más difícil. Como las cosas al final de la línea son difíciles de ver sin desplazarse, probablemente me asegure de que haya una nueva línea antes de la marca de tiempo, de modo que el usuario vea cada lote de una o más líneas de salida seguidas de una línea de marca de tiempo.

Es posible que haya una manera de enganchar la ventana de salida antes de que se muestre el texto, pero no pude encontrar ningún punto de extensibilidad en las API de extensibilidad VS.

Una idea más: siempre puede hacer rodar su propia ventana de herramientas, p. "Salida de depuración de Ivan" que escucha eventos provenientes de la ventana de salida real, y hace eco de nuevas líneas (con marcas de tiempo) en su propia ventana de herramientas. Esta es probablemente la opción más difícil, pero debería hacer exactamente lo que desea.

+0

@Justin Estaba buscando esa extensibilidad también. El final de la línea no es muy agradable, ya que las líneas tienen diferentes longitudes y es muy difícil de leer. El repintado de la ventana es un asesino como dices ... Gracias por tu respuesta, pero realmente estoy buscando encontrar cómo hacerlo, incluso si es hackish. –

+0

Sí, en lugar de al final de la línea, si utiliza una solución de solo agregar, le sugiero que coloque la marca de tiempo en una nueva línea; esto duplica el recuento de líneas de la ventana de salida, pero es mejor (en mi humilde opinión) que tener marcas de tiempo enterradas al final de la línea. Además, es posible que ni siquiera sea posible colocar el texto al final de la línea, si las nuevas líneas ya se han emitido en el documento antes de obtener el control. –

+0

Una idea más: siempre puedes pasar la ventana de tu propia herramienta, p. "Salida de depuración de Ivan" que escucha eventos provenientes de la ventana de salida real, y hace eco de nuevas líneas (con marcas de tiempo) en su propia ventana de herramientas. Esta es probablemente la opción más difícil, pero debería hacer exactamente lo que desea. –

2

Estaba buscando la misma funcionalidad. Un colega mío creó la macro $TICK en el campo de mensaje, imprimiendo los ticks de la CPU 'actual'.

Echa un vistazo a these tips from Simon Chapman, también.

Cuestiones relacionadas