Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Actualización: noviembre 2007
En temas anteriores, describimos lo que ocurre cuando se están ejecutando la aplicación y el generador de perfiles. Pero, ¿cómo están conectados cuando se inicia una aplicación? Common Language Runtime (CLR) realiza la conexión durante su inicialización en cada proceso. Decide si conectar con un generador de perfiles. Si decide conectar, busca el generador de perfiles consultando el valor de dos variables de entorno en el orden siguiente:
COR_ENABLE_PROFILING: CLR solamente se conecta a un generador de perfiles si esta variable de entorno existe y está establecida en 1.
COR_PROFILER: si la comprobación de COR_ENABLE_PROFILING es correcta, CLR conecta con el generador de perfiles que tiene este CLSID o ProgID, que se debe haber almacenado previamente en el Registro. La variable de entorno COR_PROFILER se define como una cadena, como se muestra en los dos ejemplos siguientes.
set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A} set COR_PROFILER="MyProfiler"
Por consiguiente, para generar el perfil de una aplicación CLR, debe establecer las variables de entorno COR_PROFILER y COR_ENABLE_PROFILING antes de ejecutar la aplicación. Además, debe asegurarse de que se haya registrado la DLL del generador de perfiles.
Ámbito de la variable de entorno
La forma de establecer las variables de entorno COR_PROFILER y COR_ENABLE_PROFILING determina su ámbito de influencia. Puede establecer estas variables una de las siguientes maneras:
Si establece las variables en una llamada a ICorDebug::CreateProcess, sólo se aplicarán a la aplicación que se esté ejecutando en el momento. (También se aplicarán a otras aplicaciones iniciadas por esa aplicación que hereden el entorno.)
Si establece las variables en una ventana del símbolo del sistema, se aplicarán a todas las aplicaciones iniciadas desde esa ventana.
Si establece las variables en el nivel de usuario, se aplicarán a todas las aplicaciones que inicie con el Explorador de Windows. Una ventana del símbolo del sistema que abra después de establecer las variables tendrá esta configuración de entorno, y también la tendrán todas las aplicaciones que inicie desde esa ventana. Para establecer variables de entorno en el nivel de usuario, haga clic con el botón secundario en Mi PC, haga clic en Propiedades, haga clic en la ficha Avanzadas, haga clic en Variables de entorno y agregue las variables a la lista Variables de usuario.
Si establece las variables en el nivel de equipo, se aplicarán a todas las aplicaciones que se inicien en ese equipo. Una ventana del símbolo del sistema que abra en ese equipo tendrá esta configuración de entorno, y también la tendrán todas las aplicaciones que inicie desde esa ventana. Esto significa que todos los procesos administrados de ese equipo se iniciarán con el generador de perfiles. Para establecer variables de entorno en el nivel de equipo, haga clic con el botón secundario en Mi PC, haga clic en Propiedades, haga clic en la ficha Avanzadas, haga clic en Variables de entorno, agregue las variables a la lista Variables del sistema y, a continuación, reinicie el equipo. Después de reiniciar, las variables estarán disponibles para todo el sistema.
Si está generando perfiles para un servicio de Windows, debe reiniciar el equipo después de establecer las variables de entorno y registrar la DLL del generador de perfiles. Para obtener más información sobre estas consideraciones, vea Generar perfiles en un servicio de Windows.
Consideraciones adicionales
La clase del generador de perfiles implementa las interfaces ICorProfilerCallback y ICorProfilerCallback2. En la versión 2.0 de .NET Framework, un generador de perfiles debe implementar ICorProfilerCallback2. Si no lo hace, no se cargará ICorProfilerCallback2.
Solamente un generador de perfiles puede generar un perfil en cada momento en un entorno determinado. Puede registrar dos generadores de perfiles diferentes en entornos diferentes, pero cada uno debe generar perfiles para procesos independientes. El generador de perfiles se debe implementar como una DLL de servidor COM en proceso, que se asigne al mismo espacio de direcciones que el proceso para el que se está generando perfiles. Esto significa que el generador de perfiles se ejecuta en proceso. .NET Framework no es compatible con ningún otro tipo de servidor COM. Por ejemplo, si un generador de perfiles desea supervisar aplicaciones desde un equipo remoto, debe implementar agentes recolectores en cada PC. Estos agentes generarán resultados por lotes y los comunicarán al equipo central de recolección de datos.
Dado que el generador de perfiles es un objeto COM del que se crean instancias en proceso, cada aplicación para la que se generen perfiles tendrá su propia copia del generador de perfiles. Por consiguiente, una instancia única del generador de perfiles no tiene que administrar datos de varias aplicaciones. Sin embargo, tendrá que agregar lógica al código de registro del generador de perfiles para evitar que el archivo de registro sobrescriba otras aplicaciones para las que se haya generado perfiles.
Inicializar el generador de perfiles
Cuando ambas comprobaciones de variables de entorno se realizan correctamente, CLR crea una instancia del generador de perfiles de una manera similar a la función COM CoCreateInstance. El generador de perfiles no se carga mediante una llamada directa a CoCreateInstance. Por consiguiente, se evita una llamada a CoInitialize, que requiere la configuración del modelo de subprocesos. CLR llama a continuación al método ICorProfilerCallback::Initialize en el generador de perfiles. La firma de este método es como sigue.
HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)
El generador de perfiles debe consultar pICorProfilerInfoUnk para obtener un puntero de interfaz ICorProfilerInfo o ICorProfilerInfo2 y guardarlo de modo que pueda solicitar más información más tarde, durante la generación de perfiles.
Establecer notificaciones de eventos
El generador de perfiles llama a continuación al método ICorProfilerInfo::SetEventMask para especificar en qué categorías de notificaciones está interesado. Por ejemplo, si el generador de perfiles solamente está interesado en notificaciones de entrada y salida de funciones y notificaciones de recolección de elementos no utilizados, especifica lo siguiente.
ICorProfilerInfo* pInfo;
pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (void**)&pInfo);
pInfo->SetEventMask(COR_PRF_MONITOR_ENTERLEAVE | COR_PRF_MONITOR_GC)
Estableciendo la máscara de notificaciones de esta manera, el generador de perfiles puede limitar qué notificaciones recibe. Este enfoque ayuda al usuario a generar un generador de perfiles simple o de propósito especial. También reduce tiempo de CPU que se gastaría enviando notificaciones que el generador de perfiles simplemente omitiría.
Ciertos eventos del generador de perfiles son inmutables. Esto significa que, tan pronto como se establezcan estos eventos en la devolución de llamada ICorProfilerCallback::Initialize, no se pueden desactivar y no es posible activar nuevos eventos. Los intentos de modificar un evento inmutable provocarán que ICorProfilerInfo::SetEventMask devuelva un HRESULT fallido.