Laboratorio 4.2 Analizar archivos de volcado de memoria en otra máquina: uso de WSL para abrir archivos de volcado de datos principales
Se aplica a: .NET Core 2.1, .NET Core 3.1, .NET 5
En este artículo se describe cómo usar Subsistema de Windows para Linux (WSL) versión 2 para abrir un archivo de volcado de memoria en otra máquina virtual (VM).
Requisitos previos
Para poder seguir y completar esta sección, debe tener lo siguiente:
- Un equipo Windows 10 para habilitarSubsistema de Windows para Linux .
- Al menos un archivo de volcado de memoria que se copia en el equipo basado Windows en cualquier carpeta.
Objetivo de este laboratorio
Aprenderá a abrir un archivo de volcado de memoria en otra máquina virtual mediante WSL versión 2.
Use Subsistema de Windows para Linux
WSL permite a los desarrolladores ejecutar un entorno de LINUX/LINUX directamente en Windows sin la sobrecarga de una máquina virtual tradicional o una configuración de arranque dual.
Para habilitar WSL, vaya a Windows guíade instalación del servidor y, a continuación, actualice a WSL2. Este laboratorio supone que ha elegido el mismo Ubuntu 18.04 LTS que anteriormente que el sistema operativo Linux. El sistema se ejecutará mediante WSL2.
Después de instalar WSL2, actualice el administrador de paquetes mediante los sudo apt update sudo apt upgrade comandos and. Debe estar familiarizado con estos comandos de las secciones anteriores de esta serie cuando instaló la vm de Linux por primera vez.
sudo apt update
sudo apt upgrade
Copiar archivos de Windows a Linux
Ahora debería tener WSL2 ejecutándose dentro de su Windows basado en el equipo. En la sección anterior, copió los archivos de volcado de datos principales de la carpeta D:\Learn\Linux\Dumps del equipo basado en Windows y se supuso que el nombre del archivo era coredumps.tar.gz. El objetivo ahora es copiar D:\Learn\Linux\Dumps\coredumps.tar.gz en la vm de Linux que se ejecuta dentro de WSL2.
En la siguiente captura de pantalla de la línea de comandos de WSL2, observe que la unidad C de Windows se asigna como /mnt/c en el equipo linux de WSL2. Por lo tanto, para enumerar el contenido de la carpeta D:\Learn\Linux\Dumps, puede ejecutar ll mnt/d/Learn/Linux/Dumps/ .
Ahora, copie y extraiga el archivo coredumps.tar.gz en una carpeta de archivos de volcado dentro del directorio principal de Linux. Los pasos son fáciles:
- Cambie el directorio al directorio principal mediante el
cd ~comando. - Cree una carpeta de archivos de volcado ejecutando
mkdir dumps. - Extraiga el archivo coredumps.tar.gz ejecutando
tar -xf /mnt/d/Learn/Linux/Dumps/coredumps.tar.gz -C dumps/.
La siguiente captura de pantalla muestra estos comandos en acción.
Abrir archivo de volcado de memoria mediante dotnet-dump
El resto del procedimiento es similar a los laboratorios de solución de problemas anteriores en los que instaló .NET Core y EL SDK de .NET. Esta sección le llevará a través de esos pasos de nuevo.
La herramienta dotnet-dump requiere EL SDK de .NET. Por lo tanto, antes de instalar dotnet-dump, debe instalar el SDK de .NET. Como se mencionó anteriormente, antes de instalar el SDK de .NET, debe agregar la clave de firma de paquetes de Microsoft a la lista de claves de confianza y, a continuación, agregar el repositorio de paquetes, como se explica en Instalar el SDK. Consulta los pasos en acción en la siguiente captura de pantalla.
Ahora, ya está listo para volver a instalar el SDK más reciente, como se explica en Instalar el SDK. La siguiente captura de pantalla muestra Terminal Windows muestra el resultado de los comandos.
Se abrirá el archivo de volcado de memoria mediante dotnet-dump. Por lo tanto, primero debe instalar la herramienta. Como se mencionó anteriormente, el comando para instalar dotnet-dump como una herramienta global es dotnet tool install -g dotnet-dump .
Después de la instalación, está listo para empezar a explorar los archivos de volcado de datos principales. Abra el archivo de volcado de memoria mediante dotnet-dump. Como hizo en el laboratorio anterior, ejecute el siguiente comando:
dotnet-dump analyze ~/dumps/coredump.manual.1.11724
Intente ejecutar para clrthreads mostrar los subprocesos administrados. Se espera que este comando genere un error y genere el siguiente mensaje de error.
El mensaje de error es el siguiente:
No se puede cargar ni inicializar mscordaccore.dll. Es posible que el tiempo de ejecución de destino no se inicialice.
Este error se produce porque el tiempo de ejecución de .NET Core requerido no está instalado en la máquina virtual linux. Como se explica en Depurar volcadosde Linux , para analizar los volcados de .NET Core, LLDB y SOS requieren los siguientes archivos binarios de .NET Core del entorno en el que se creó el archivo de volcado:
- libmscordaccore.so
- libcoreclr.so
- dotnet (el host usado para iniciar la aplicación)
Esto no era un problema en los laboratorios de solución de problemas anteriores porque había analizado los archivos de volcado en la misma máquina virtual en la que se hospedaba y ejecutaba la aplicación. Por lo tanto, los archivos ya estaban presentes. Ahora, debe copiar la versión correcta de estos archivos desde algún lugar (por ejemplo, desde la máquina virtual en la que se tomaron los archivos de volcado principales) o bien, debe instalar el mismo tiempo de ejecución de .NET en la vm de Linux de WSL2.
Existen varios métodos para determinar el tiempo de ejecución de .NET Core de destino. Lo más fácil es preguntar al propietario de la aplicación. O bien, si es el propietario, conocerá el tiempo de ejecución de .NET Core de destino de la aplicación. ¿Qué ocurre si no tiene esa información en absoluto? En ese caso, puede usar un comando de extensión SOS o , que enumera los módulos nativos que lm modules se cargan en el proceso. Ejecute este comando para determinar la versión de la instalación de .NET.
Como se muestra en esta captura de pantalla, la versión en tiempo de ejecución de .NET Core era 3.1.10. Necesita la versión correcta de libmscordaccore.so, libcoreclr.so y .NET. Puede copiar esos archivos de la máquina virtual en la que se generaron los archivos de volcado de datos principales.
¿Hay otra forma de lograr el mismo resultado? Por ejemplo, ¿puede instalar .NET Core runtime versión 3.1.10 para tener esos archivos? La respuesta corta es sí, puede. Pero no se puede instalar mediante el sudo apt install dotnet-runtime-3.1.10 comando.
En su lugar, puede instalar el tiempo de ejecución de .NET Core 3.1. Sin embargo, esa versión instalará la versión más reciente de .NET Core 3.1 (.NET Core 3.1.15 en el momento en que se escribió este artículo).
Esto no funcionará porque el archivo de volcado principal es para un proceso de .NET Core 3.1.10. Debe tener la versión correspondiente de los archivos necesarios.
Afortunadamente, hay una herramienta de dotnet-symbol que puede descargar los archivos (símbolos, DAC, módulos, entre otros) necesarios para depurar archivos de volcado de memoria. Es posible que recuerde esta herramienta de nuestras secciones anteriores. Para instalar esta herramienta, ejecute el dotnet tool install -g dotnet-symbol comando.
Ahora, tiene que pedir a la herramienta dotnet-symbol que descargue los archivos necesarios destinados a nuestro archivo de volcado de datos principal. Esto pasa el nombre del archivo de volcado principal y otros parámetros necesarios: dotnet-symbol --host-only --debugging ~/dumps/coredump.manual.1.11724 .
Puede omitir los dos últimos errores de la lista. Los archivos necesarios se descargan en la carpeta ~/dumps.
Abra el archivo de volcado principal con dotnet-dump e intente ejecutar los mismos clrthreads comandos.
Ahora debería poder abrir el archivo de volcado principal en la máquina virtual Windows mediante WSL2.
Abrir archivos de volcado en lldb
Estos pasos son los mismos que en laboratorios de solución de problemas anteriores. Ya debería haber cubierto las partes importantes anteriormente para obtener los archivos necesarios para depurar los archivos de volcado de datos principales mediante dotnet-dump. El procedimiento es el mismo para LLDB. Si desea instalar y usar lldb para la depuración, compruebe los laboratorios anteriores.
Si dotnet-symbol no puede encontrar los archivos necesarios
Dotnet-symbol funcionará para la mayoría de los archivos de volcado de datos principales. Si, por algún motivo, no se descargan los archivos necesarios, hay formas de evitar el bloqueo. Puede descargar y extraer los archivos binarios de la página web oficial de Microsoft. A continuación, copie manualmente los archivos necesarios en la misma carpeta que contiene el archivo de volcado principal.
Por ejemplo, si necesita los archivos para .NET Core 3.1.10 x64, puede descargar los archivos binarios de esta página de descarga de archivos binarios de ASP.NET Core 3.1 Runtime (v3.1.10) - Linux x64 Binariesy copiar los archivos manualmente:
- .\shared\Microsoft.NETCore.App\3.1.10\libcoreclr.so
- .\shared\Microsoft.NETCore.App\3.1.10\libmscordaccore.so
- .\shared\Microsoft.NETCore.App\3.1.10\libmscordbi.so
- .\shared\Microsoft.NETCore.App\3.1.10\
- .\dotnet
Si la versión de tiempo de ejecución de destino es privada (recuerde que .NET Core es de código abierto y puede crear y usar su propia versión privada), tendrá que copiar estos archivos de la máquina virtual linux en la que se generó el archivo de volcado principal.