Pregunta

Hace poco comenzó a usar las hormigas herramientas de perfilado para el trabajo de producción. Aparte de ser sorprendido por su genialidad, no podía dejar de preguntarse cómo funcionan. Por ejemplo, una de las características más útiles le permite visualizar las raíces globales de un completo programa que se ejecuta con el número de referencias a valores de diferentes tipos.

¿Cómo funciona esta herramienta hacerse con esa información?

¿Fue útil?

Solución

(La revelación completa: estoy en el equipo de Visual Studio Profiler, pero el siguiente información es pública)

Se puede hacer esto escribiendo un generador de perfiles CLR que se ejecuta dentro del proceso de orientación. perfiladores CLR son C ++ COM objetos que consiguen instanciados por el tiempo de ejecución cuando se establecen las variables COR_PROFILER y medio ambiente COR_PROFILING_ENABLED (ver aquí ). Hay dos principales CLR perfiles interfaces de , específicamente, ICorProfilerCallback y ICorProfilerInfo . ICorProfilerCallback es lo que los usos CLR para notificarle sobre eventos específicos que se suscriba a (cargas del módulo, la función compliation JIT, la creación del hilo, eventos GC), mientras que ICorProfilerInfo puede ser utilizado por el generador de perfiles para obtener información adicional sobre hilos, módulos, tipos, métodos, y los metadatos para los conjuntos de cargado. Esta interfaz es lo que podría uso para obtener información de símbolos sobre los tipos asignados.

Con los perfiles en proceso, que puede obligar a un GC a través ICorProfilerInfo::ForceGC . Después de que se complete la GC, el perfilador recibirá una notificación a través de ICorProfilerCallback2::GarbageCollectionFinished , y obtendrá las referencias de raíz a través de ICorProfilerCallback2::RootReferences2 . Cuando se combina la información de referencia de la raíz con ICorProfilerCallback::ObjectReferences , se puede obtener el gráfico de referencia de objeto completo para su aplicación .NET.

Se puede obtener más información en tiempo real mediante el uso de la ICorProfilerCallback::ObjectAllocated devolución de llamada para determinar cuando se crean objetos CLR individuales. Esto puede ser costoso, sin embargo, ya que usted está incurriendo en al menos una llamada a una función adicional para cada objeto asignado. Puede realizar un seguimiento de objetos individuales mediante la asignación de la ObjectID CLR-asignado a su propia ID interno. Un ObjectID para un objeto dado es un puntero efímero ya que puede cambiar a medida que ocurren las colecciones de basura, que puede hacer que los objetos a moverse durante la compactación. Este proceso se ilustra aquí . Puede utilizar la información de ICorProfilerCallback::MovedReferences para rastrear objetos en movimiento.

Con el fin de activar las devoluciones de llamada se mencionó anteriormente, es necesario contar la API de perfiles de CLR que usted está interesado en ellos. Puede hacerlo especificando COR_PRF_MONITOR_GC y COR_PRF_MONITOR_OBJECT_ALLOCATED como parte de sus banderas de eventos al llamar ICorProfilingInfo::SetEventMask .

David Broman es el desarrollador en el generador de perfiles de CLR, y su blog tiene un montón de gran información sobre perfiles en general, incluyendo todas las trampas locos y los problemas que puede encontrar en.

Otros consejos

Los perfiladores como hormigas utilizan un "API de perfiles", presentado por el propio CLR, que simplemente le puede decir lo que pasa dentro del CLR. Por ejemplo, hay una devolución de llamada método de API que se producen cuando se asigna un objeto, bien llamado ObjectAllocated () . Del mismo modo hay eventos para cuando se introducen los métodos, cuando se crean los hilos, etc, etc.

La API de perfiles original se llama ICorProfilerCallback. Las versiones posteriores se llaman CoreProfilerCallback2 y CoreProfilerCallback3. Si google esos nombres encontrará exactamente las respuestas que está buscando. En CodeProject se puede ver un ejemplo práctico: Creación de un .NET Profiler

Una nota final: La API no se puede utilizar desde el código administrado como C # y VB.NET. Es sólo está disponible desde código no administrado como por ejemplo, C o C ++. Por lo que una aplicación de C # no puede utilizar esta API para examinar su propio comportamiento y objetos, por ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top