Compartir a través de


Recopilación de información detallada de carga de ensamblados

A partir de .NET 5, el entorno de ejecución puede emitir eventos con información detallada a través de EventPipe sobre la carga de ensamblados administrados para ayudar a diagnosticar problemas de carga de ensamblados. El proveedor emite estos Microsoft-Windows-DotNETRuntime bajo la palabra clave AssemblyLoader (0x4).

Prerrequisitos

Nota:

El ámbito de las funcionalidades de dotnet-trace es mayor que la recopilación de información detallada de carga de ensamblados. Para obtener más información sobre el uso de dotnet-trace, vea dotnet-trace.

Recopilación de un seguimiento con eventos de carga de ensamblados

Puede usar dotnet-trace para realizar un seguimiento de un proceso existente o para iniciar un proceso secundario y realizar un seguimiento desde el inicio.

Rastrear un proceso existente

Para habilitar los eventos de carga de ensamblados en el tiempo de ejecución y recopilar un seguimiento de ellos, use dotnet-trace con el siguiente comando:

dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id <pid>

Este comando recopila un seguimiento del <pid> especificado, lo que habilita los eventos AssemblyLoader en el proveedor Microsoft-Windows-DotNETRuntime. El resultado es un .nettrace archivo.

Uso de dotnet-trace para iniciar un proceso secundario y realizar un seguimiento desde el inicio

A veces puede resultar útil recopilar un seguimiento de un proceso desde su inicio. Para hacerlo, en el caso de las aplicaciones que ejecutan .NET 5 o posterior, puede usar dotnet-trace.

El siguiente comando inicia hello.exe con arg1 y arg2 como argumentos de la línea de comandos y recopila un seguimiento de su inicio en tiempo de ejecución:

dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 -- hello.exe arg1 arg2

Para detener la recopilación del seguimiento, pulse Entrar o Ctrl + C. Esto también cierra hello.exe.

Nota:

  • Iniciar hello.exe a través de dotnet-trace redirige sus entradas y salidas, y no podrá interactuar con él en la consola por defecto. Use el modificador --show-child-io para interactuar con su stdin y stdout.
  • La salida de la herramienta por medio de Ctrl+C o SIGTERM finaliza de manera segura la herramienta y el proceso secundario.
  • Si el proceso secundario termina antes que la herramienta, la herramienta también se cierra y el seguimiento se debería poder ver de forma segura.

Visualización de un seguimiento

El archivo de seguimiento recopilado se puede ver en Windows mediante la vista Eventos de PerfView. Todos los eventos de carga de ensamblados tendrán como prefijo Microsoft-Windows-DotNETRuntime/AssemblyLoader.

Ejemplo (en Windows)

En este ejemplo se usa el ejemplo de puntos de extensión de la carga de ensamblados. La aplicación intenta cargar un ensamblado MyLibrary : un ensamblado al que no hace referencia la aplicación y, por tanto, requiere el control en un punto de extensión de carga de ensamblados para cargarse correctamente.

Recopilación del seguimiento

  1. Vaya al directorio con el ejemplo descargado. Compile la aplicación con:

    dotnet build
    
  2. Inicie la aplicación con argumentos que indican que debe pausarse, esperando una pulsación de tecla. Al reanudar, intentará cargar el ensamblado en el valor predeterminado AssemblyLoadContext , sin el control necesario para una carga correcta. Vaya al directorio de salida y ejecute:

    AssemblyLoading.exe /d default
    
  3. Busque el identificador de proceso de la aplicación.

    dotnet-trace ps
    

    La salida enumerará los procesos disponibles. Por ejemplo:

    35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exe
    
  4. Adjunte dotnet-trace a la aplicación en ejecución.

    dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
    
  5. En la ventana que ejecuta la aplicación, presione cualquier tecla para permitir que el programa continúe. El seguimiento se detendrá automáticamente una vez que se cierre la aplicación.

Visualización del seguimiento

Abra el seguimiento recopilado en PerfView y abra la vista Eventos. Filtre la lista de eventos para eventos Microsoft-Windows-DotNETRuntime/AssemblyLoader.

Imagen del filtro del cargador de ensamblados de PerfView

Se mostrarán todas las cargas de ensamblado que se produjeron en la aplicación después de iniciar el seguimiento. Para inspeccionar la operación de carga del ensamblaje relevante para este ejemplo: MyLibrary, podemos realizar un filtrado adicional.

Cargas de ensamblaje

Filtre la vista a los eventos Start y Stop bajo Microsoft-Windows-DotNETRuntime/AssemblyLoader usando la lista de eventos de la izquierda. Agregue las columnas AssemblyName, ActivityIDy Success a la vista. Filtre por eventos que contengan MyLibrary.

Imagen de eventos de inicio y parada de PerfView

Nombre del evento AssemblyName Identificador de actividad Éxito
AssemblyLoader/Start MyLibrary, Culture=neutral, PublicKeyToken=null //1/2/
AssemblyLoader/Stop MyLibrary, Culture=neutral, PublicKeyToken=null //1/2/ Falso

Debería ver una pareja Start/Stop con Success=False en el evento Stop, indicando que la operación de carga falló. Tenga en cuenta que los dos eventos tienen el mismo identificador de actividad. El identificador de actividad se puede usar para filtrar todos los demás eventos del cargador de ensamblados a solo los correspondientes a esta operación de carga.

Desglose del intento de carga

Para obtener un desglose más detallado de la operación de carga, filtre la vista a los ResolutionAttempted eventos en Microsoft-Windows-DotNETRuntime/AssemblyLoader mediante la lista de eventos de la izquierda. Agregue las columnas AssemblyName, Stagey Result a la vista. Filtre por eventos con el identificador de actividad del conjunto Start/Stop.

Imagen de eventos ResolutionAttempted de PerfView

Nombre del evento AssemblyName Etapa Resultado
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null FindInLoadContext AssemblyNotFound
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null ApplicationAssemblies AssemblyNotFound
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null AssemblyLoadContextResolvingEvent AssemblyNotFound
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null AppDomainAssemblyResolveEvent AssemblyNotFound

Los eventos anteriores indican que el cargador de ensamblados intentó resolver el ensamblado buscando en el contexto de carga actual, ejecutando la lógica de sondeo predeterminada para los ensamblados de aplicación administrados, invocando controladores para el AssemblyLoadContext.Resolving evento e invocando controladores para .AppDomain.AssemblyResolve En todos estos pasos, no se encontró el ensamblado.

Puntos de extensión

Para ver los puntos de extensión que se invocaron, filtre la vista a AssemblyLoadContextResolvingHandlerInvoked y AppDomainAssemblyResolveHandlerInvoked en Microsoft-Windows-DotNETRuntime/AssemblyLoader mediante la lista de eventos de la izquierda. Agregue las columnas AssemblyName y HandlerName a la vista. Filtre por eventos con el identificador de actividad del conjunto Start/Stop.

Imagen de eventos de punto de extensión de PerfView

Nombre del evento AssemblyName NombreDelControlador
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked MyLibrary, Culture=neutral, PublicKeyToken=null OnAssemblyLoadContextResolving
AssemblyLoader/AppDomainAssemblyResolveHandlerInvoked MyLibrary, Culture=neutral, PublicKeyToken=null OnAppDomainAssemblyResolve

Los eventos anteriores indican que se invocó un controlador denominado OnAssemblyLoadContextResolving para el AssemblyLoadContext.Resolving evento y se invocó un controlador denominado OnAppDomainAssemblyResolve para el AppDomain.AssemblyResolve evento.

Recoge otro rastro

Ejecute la aplicación con argumentos de manera que su manejador del AssemblyLoadContext.Resolving evento cargue el ensamblado MyLibrary.

AssemblyLoading /d default alc-resolving

Recopile y abra otro .nettrace archivo siguiendo los pasos anteriores.

Filtre de nuevo a los eventos Start y Stop de MyLibrary. Debería ver un par Start/Stop con otro Start/Stop entre ellos. La operación de carga interna representa la carga desencadenada por el controlador para AssemblyLoadContext.Resolving cuando llamó a AssemblyLoadContext.LoadFromAssemblyPath. Esta vez, debería ver Success=True en el Stop evento , lo que indica que la operación de carga se realizó correctamente. En el campo ResultAssemblyPath se muestra la ruta de acceso del ensamblado resultante.

Imagen de eventos de inicio y parada exitosos de PerfView

Nombre del evento AssemblyName Identificador de actividad Éxito ResultAssemblyPath
AssemblyLoader/Start MyLibrary, Culture=neutral, PublicKeyToken=null //1/2/
AssemblyLoader/Start MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null //1/2/1/
AssemblyLoader/Stop MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null //1/2/1/ Cierto C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll
AssemblyLoader/Stop MyLibrary, Culture=neutral, PublicKeyToken=null //1/2/ Cierto C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll

A continuación, podemos examinar los ResolutionAttempted eventos con el identificador de actividad de la carga externa para determinar el paso en el que el ensamblado se resolvió correctamente. Esta vez, los eventos mostrarán que la fase AssemblyLoadContextResolvingEvent se ha realizado correctamente. En el campo ResultAssemblyPath se muestra la ruta de acceso del ensamblado resultante.

Imagen de eventos ResolutionAttempted correctos de PerfView

Nombre del evento AssemblyName Etapa Resultado ResultAssemblyPath
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null FindInLoadContext AssemblyNotFound
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null ApplicationAssemblies AssemblyNotFound
AssemblyLoader/ResolutionAttempted MyLibrary, Culture=neutral, PublicKeyToken=null AssemblyLoadContextResolvingEvent Success C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll

Al examinar AssemblyLoadContextResolvingHandlerInvoked los eventos se mostrará que se invocó el controlador denominado OnAssemblyLoadContextResolving . El campo ResultAssemblyPath muestra la ruta de acceso del ensamblado devuelto por el controlador.

Imagen de eventos de punto de extensión correcto de PerfView

Nombre del evento AssemblyName NombreDelControlador ResultAssemblyPath
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked MyLibrary, Culture=neutral, PublicKeyToken=null OnAssemblyLoadContextResolving C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll

Tenga en cuenta que ya no hay un ResolutionAttempted evento con la AppDomainAssemblyResolveEvent fase ni ningún AppDomainAssemblyResolveHandlerInvoked evento, ya que el ensamblaje se cargó correctamente antes de alcanzar el paso del algoritmo de carga que genera el AppDomain.AssemblyResolve evento.

Consulte también