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.
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
- SDK de .NET 5 o versiones posteriores
- Herramienta
dotnet-trace
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-traceredirige sus entradas y salidas, y no podrá interactuar con él en la consola por defecto. Use el modificador--show-child-iopara interactuar con sustdinystdout. - La salida de la herramienta por medio de Ctrl+C o
SIGTERMfinaliza 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
Vaya al directorio con el ejemplo descargado. Compile la aplicación con:
dotnet buildInicie 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 defaultBusque el identificador de proceso de la aplicación.
dotnet-trace psLa salida enumerará los procesos disponibles. Por ejemplo:
35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exeAdjunte
dotnet-tracea la aplicación en ejecución.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832En 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.
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.
| 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.
| 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.
| 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.
| 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.
| 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.
| 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.