Generación de perfiles en paralelo y en proceso
A partir de .NET Framework 4 se pueden ejecutar varias versiones de .NET Framework en paralelo en un mismo proceso. Los generadores de perfiles deben poder funcionar en paralelo para ejecutarse en este entorno. Los generadores de perfiles que están diseñados para .NET Framework versión 2.0, .NET Framework 2.0 SP1, .NET Framework 3.0, .NET Framework 3.5 o .NET Framework 3.5 SP1 se pueden usar en .NET Framework versión 4 si el proceso cuyo perfil se está generando no hospeda varias versiones de .NET Framework. Para obtener más información sobre cómo generar perfiles en proceso en paralelo, vea Configuración de compatibilidad del generador de perfiles.
Capacidad de funcionar en paralelo
Un generador de perfiles está preparado para funcionar en paralelo si garantiza que las aplicaciones que cargan varios runtimes no harán que el generador de perfiles se enfrente a interrupciones inesperadas, como infracciones de acceso. La capacidad de funcionar en paralelo incluye los siguientes niveles de compatibilidad:
Perfilar la primera versión. Se genera el perfil de la primera versión de Common Language Runtime (CLR) que se carga en un proceso, pero no de las siguientes versiones de CLR. El generador de perfiles debe estar preparado para que se realicen varias llamadas CreateInstance en su objeto generador de clases COM, pero no tiene que admitir el uso simultáneo y activo de devoluciones de llamada en varias instancias de su objeto COM. El generador de perfiles simplemente acepta la primera llamada CreateInstance del generador de clases y la llamada de devolución de llamada Initialize, y genera un error para las demás llamadas.
Perfilar una versión. Similar al nivel de perfilar la primera versión, solo que el generador de perfiles permite al usuario elegir la versión de CLR de la que se generarán perfiles, en lugar de simplemente generar perfiles de la primera versión del CLR cargada.
Perfilar muchas versiones. El usuario elige una o varias versiones de CLR (posiblemente todas) para generar perfiles. El generador de perfiles utiliza las devoluciones de llamada de esas versiones de CLR y llama a las funciones Info desde la versión adecuada. Esto requiere que el generador de perfiles haga el seguimiento de qué elementos del runtime (funciones, dominios de aplicación, clases, objetos, etc.) pertenecen a cada CLR.
Nota |
---|
Un generador de perfiles diseñado para .NET Framework 4 debe poder trabajar en paralelo.Es decir, si un generador de perfiles implementa la interfaz ICorProfilerCallback3, debe implementar uno de estos esquemas (perfilar la primera versión, perfilar una versión o perfilar muchas versiones) para asegurarse de que el uso de varios runtimes no haga que el generador de perfiles encuentre interrupciones inesperadas. |
Requisitos de compatibilidad para generar perfiles de muchas versiones
Para admitir la opción de generar perfiles de muchas versiones, un generador de perfiles debe poder hacer lo siguiente:
Asociar llamadas a funciones globales con el runtime correcto.
Asociar los distintos identificadores (por ejemplo, ObjectID, FunctionID, ClassID, ModuleID, AssemblyID, AppDomainID, etc.) al runtime correcto y asegurarse de que nunca se pase un identificador de un runtime a la interfaz ICorProfilerCallback(2,3) de otro runtime. Sin embargo, es aceptable pasar cualquier puntero de instrucción de cualquier runtime o código nativo a la implementación de cualquier runtime del método ICorProfilerInfo::GetFunctionFromIP.
Controlar las interacciones entre distintos runtimes, como las pilas de llamadas que pasan de un runtime a otro.
Controlar varias instancias de su clase que implementa ICorProfilerCallback(2,3) que están activas en el mismo proceso.
El generador de perfiles debería proporcionar un objeto de administrador de generador de perfiles único, responsable de administrar las implementaciones de función globales y los datos que abarcan varios runtimes. Por ejemplo:
Devoluciones de llamadas enter/leave/tailcall/FunctionIDMapperFunctionIDMapper (Función) de todos los runtimes. El objeto administrador del generador de perfiles utilizará normalmente el parámetro clientData de FunctionIDMapper2 o ICorProfilerInfo3::SetFunctionIDMapper2 para determinar el runtime correspondiente.
Recorridos de pila y pilas sombra entre runtimes.
Coordinar los registros entre runtimes.
El generador de perfiles también debe proporcionar un objeto generador de perfiles que implemente las interfaces ICorProfilerCallback. El CLR crea una instancia de este objeto generador de perfiles por cada runtime activo. El único objeto global al que el generador de perfiles debería tener acceso es el administrador del generador de perfiles. El generador de perfiles no debería mantener una referencia global a su implementación de ICorProfilerCallback, ya que puede haber muchas instancias activas de la implementación ICorProfilerCallback cuando el proceso contiene varios runtimes.
Activar los generadores de perfiles
La principal tarea de activación es la asociación de los generadores de perfiles con las versiones del runtime.
Iniciar los generadores de perfiles
Si desea iniciar un generador de perfiles en todos los runtimes de un proceso determinado, establezca las variables de entorno COR_ENABLE_PROFILING y COR_PROFILER. (Es el mismo procedimiento que en .NET Framework 3.5 y versiones anteriores).
Si desea iniciar un generador de perfiles únicamente en algunos runtimes, establezca las variables de entorno COR_ENABLE_PROFILING y COR_PROFILER, y siga uno de estos pasos:
Generar un error para todas las llamadas salvo la primera llamada CreateInstance al objeto generador de clases (perfilar la primera versión).
O bien
Permitir todas las llamadas CreateInstance al objeto generador de clases y, en la llamada a Initialize, determinar la versión del runtime que llama. Para ello, debe realizar los pasos que se detallan a continuación:
Ejecute el método QueryInterface en el CLR para la interfaz ICorProfilerInfo3. Si da error, la versión del runtime es la 1 o la 2.0. Ejecutar QueryInterface para la interfaz ICorProfilerInfo2 revelará si la versión del runtime es la 2.0 o la 1.
Si se admite ICorProfilerInfo3, llame al método GetRuntimeInformation para obtener más información sobre el runtime que se está perfilando.
Una vez determinada la versión del runtime, el generador de perfiles puede decidir si debe generar perfiles de ese runtime. En ese caso, debe continuar con la inicialización de costumbre. De lo contrario, debe devolver un error de Initialize. A partir de .NET Framework 4, el generador de perfiles puede devolver CORPROF_E_PROFILER_CANCEL_ACTIVATIONHRESULT para evitar que se registre un error en el registro de eventos de la aplicación Windows.
Adjuntar generadores de perfiles
Un proceso de asociación de desencadenador hace lo siguiente:
Utiliza el método ICLRMetaHost::EnumerateLoadedRuntimes para enumerar runtimes que se cargan en el proceso de destino y encontrar el de interés.
Recupera una interfaz ICLRRuntimeInfo de la interfaz IEnumUnknown que se devuelve del método ICLRMetaHost::EnumerateLoadedRuntimes.
Obtiene una interfaz ICLRProfiling llamando a GetInterface en la interfaz ICLRRuntimeInfo con CLSID_CLRProfiling e IID_ICLRProfiling.
Llama al método AttachProfiler a través de la interfaz ICLRProfiling.
Para obtener más información acerca de cómo adjuntar generadores de perfiles, vea Asociar y desasociar un generador de perfiles.
Vea también
Conceptos
Información general sobre la generación de perfiles