2011-11-14 15 views
21

Estoy pensando en agregar una compilación del modo de diagnóstico en una aplicación que estoy escribiendo para contar el uso del método y el tiempo de ejecución, similar a lo que hacen muchos perfiladores de código como dotTrace.¿Cómo funcionan los perfiladores .NET?

Tengo algunos problemas para encontrar recursos a través de google sobre cómo lograr esto; obviamente es posible, pero ¿alguien puede indicarme algunos recursos sobre cómo puedo implementar algo así como conteos de llamadas de método en .NET?

+8

http://www.codeproject.com/KB/dotnet/dotnetprofiler.aspx – Oded

+0

para lograr que va a tener que ir muy bajo nivel e incluso el uso de C++ (nativo) ya que lo necesitará para enganchar la .NET runtime en sí mismo (ver el enlace de Oded, por ejemplo) ... otra opción es usar algún producto (por ejemplo, SmartAssembly se puede configurar para crear informes de uso en la aplicación) para ese tipo de cosas ... – Yahia

+0

Creo que Desmontar básicamente el código en IL, luego inyectar varios marcadores después de cada instrucción. Definitivamente no es trivial para escribir, pero supongo que es por eso que las cosas de ANTS son muy caras, je. –

Respuesta

7

El artículo de Code Project Creating a Custom .NET Profiler describe el proceso de creación de un perfilador utilizando los ganchos del perfilador CLR.

Esto implica la creación de un objeto COM que implementa la interfaz ICorProfilerCallback2 y luego utilizando las variables de entorno para indicar al CLR que deseamos perfil mediante el uso de esta clase:

Cuando el CLR se inicia un proceso, lo que parece por dos variables de entorno:

  • COR_ENABLE_PROFILING: Esta variable de entorno se establece en 1 o 0. 1 indica que el CLR debe utilizar un perfilador. 0 (o la inexistencia de esta variable de entorno) indica que no debe usar un generador de perfiles.
  • COR_PROFILER: Ahora que le hemos contado al CLR que queremos crear un perfil, tenemos que decirle qué perfilador usar. Como los perfiladores se implementan como objetos COM, esta variable de entorno se establecerá en el GUID del coclass que implementa la interfaz ICorProfilerCallback2.
+0

¿Es posible configurar 2 perfiladores simultáneamente? cómo establecer la variable de env COR_PROFILER para usar dos DLL de Profiler al mismo tiempo – Kira

+0

Lo dudo. En particular, como la descripción se refiere a un perfilador único. Supongo que podrías crear un proxy de perfil al que otros perfiladores podrían suscribirse, pero eso es solo una idea. – Oded

1

Quizás estoy siendo demasiado simple aquí, pero mi solución a esto sería iniciar sesión. Utilizando entlib o log4net y mensajes de nivel de depuración de registro. Luego puede escribir un pequeño script/programa para analizar el archivo de registro y darle el recuento de métodos. Incluso podría haber otras herramientas de diagnóstico de registro.

A menos que necesite una visualización rica o un mapeo complejo de relaciones en tiempo real, etc. ¿Necesitaría un generador de perfiles? Para el recuento de métodos y el tiempo de ejecución, ¿no bastaría un archivo de registro? Una vez que está en producción o no le importa la instrumentación, suba su nivel de registro y olvide los mensajes de depuración.

+1

El problema con el registro es tener que ensuciar mi código con las llamadas de registro. Especialmente si deseo hacer algo así como el tiempo de ejecución, necesito agregar 3 líneas a cada método (configuración/inicio del temporizador, parada del cronómetro, llamada a un mensaje de registro) como mínimo. Eso es bastante complicado. – Amasuriel

+0

De acuerdo. Es por eso que sugeriría un marco de AOP como Spring.Net o PostSharp. AOP es maravilloso en sí mismo, no solo para iniciar sesión. Es cierto que no agregaría un componente completamente nuevo a un proyecto solo para instrumentar un método o guardar 3 líneas de código en un solo lugar, pero si lo está utilizando regularmente, entonces AOP de distancia. El ROI para AOP es bastante alto y el punto de inflexión en el que deben introducirse es bastante bajo, en otras palabras, cualquier proyecto que sea levemente complejo/profesional. De hecho, si estás pensando en iniciar sesión, realmente también deberías pensar en AOP. Mis 2 centavos :-) – Chaitanya

+0

No estaba al tanto de PostSharp, gracias por el enlace. Estaba planeando usar Enterprise Library 5 para iniciar sesión, pero ya me estaba avergonzando de la cantidad de llamadas a métodos que saturaban mi código. – Amasuriel

Cuestiones relacionadas