Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: .NET Core 2.1, .NET Core 3.1, .NET 5
В этой статье описывается, как использовать подсистема Windows для Linux (WSL) версии 2 для открытия файла дампа ядра на другой виртуальной машине.
Предварительные требования
Чтобы иметь возможность следовать и завершить этот раздел, у вас должно быть следующее:
- Компьютер под управлением Windows 10 для включения подсистема Windows для Linux.
- По крайней мере один основной файл дампа, скопированный на компьютер под управлением Windows в любой папке.
Цель этой лаборатории
Вы узнаете, как открыть файл дампа ядра на другой виртуальной машине с помощью WSL версии 2.
Использование подсистема Windows для Linux
WSL позволяет разработчикам запускать среду GNU/Linux непосредственно в Windows без затрат на традиционную виртуальную машину или двойную загрузку.
Чтобы включить WSL, перейдите к руководству по установке Windows Server, а затем обновите до WSL2. В этой лаборатории предполагается, что вы выбрали тот же Ubuntu 18.04 LTS, что и операционная система Linux. Система будет выполняться с помощью WSL2.
После установки WSL2 обновите диспетчер пакетов с помощью sudo apt update
команд и sudo apt upgrade
команд. Эти команды следует ознакомиться с предыдущими разделами этой серии при первом установке виртуальной машины Linux.
sudo apt update
sudo apt upgrade
Копирование файлов из Windows в Linux
Теперь на компьютере под управлением Windows должна работать WSL2. В предыдущем разделе вы скопировали файлы основного дампа из папки D:\Learn\Linux\Dumps на компьютере под управлением Windows, и предполагается, что имя файла будет coredumps.tar.gz. Теперь ваша цель — скопировать D:\Learn\Linux\Dumps\coredumps.tar.gz на виртуальную машину Linux, которая работает в WSL2.
На следующем снимке экрана командной строки в WSL2 обратите внимание, что диск C в Windows сопоставляется как /mnt/c на компьютере Linux WSL2. Поэтому для перечисления содержимого папки D:\Learn\Linux\Dumps можно запустить ll mnt/d/Learn/Linux/Dumps/
.
Теперь скопируйте и извлеките файл coredumps.tar.gz в папку файлов дампа в домашнем каталоге Linux. Действия просты:
- Измените каталог на домашний
cd ~
каталог с помощью команды. - Создайте папку файлов дампа, выполнив команду
mkdir dumps
. - Извлеките файл coredumps.tar.gz, выполнив команду
tar -xf /mnt/d/Learn/Linux/Dumps/coredumps.tar.gz -C dumps/
.
На следующем снимке экрана показаны эти команды в действии.
Открытие файла дампа ядра с помощью dotnet-dump
Остальная часть процедуры аналогична более ранним лабораториям устранения неполадок, в которых установлен пакет SDK для .NET Core и .NET. В этом разделе описаны эти действия снова.
Для средства dotnet-dump требуется пакет SDK для .NET. Поэтому перед установкой dotnet-dump необходимо установить пакет SDK для .NET. Как упоминалось ранее, перед установкой пакета SDK для .NET необходимо добавить ключ подписи пакета Майкрософт в список доверенных ключей, а затем добавить репозиторий пакетов, как описано в разделе "Установка пакета". См. действия на следующем снимке экрана.
Теперь вы готовы установить последний пакет SDK, как описано в статье "Установка пакета SDK". На следующем снимках экрана показана Терминал Windows, отображающая результат команд.
Вы откроете основной файл дампа с помощью dotnet-dump. Поэтому сначала необходимо установить средство. Как упоминалось ранее, команда для установки dotnet-dump в качестве глобального инструмента dotnet tool install -g dotnet-dump
.
После установки вы можете начать изучение основных файлов дампа. Откройте файл основного дампа с помощью dotnet-dump. Как вы сделали в предыдущей лаборатории, выполните следующую команду:
dotnet-dump analyze ~/dumps/coredump.manual.1.11724
Попробуйте запустить clrthreads
, чтобы отобразить управляемые потоки. Ожидается, что эта команда завершится ошибкой и создаст следующее сообщение об ошибке.
Сообщение об ошибке выглядит следующим образом:
Не удается загрузить или инициализировать mscordaccore.dll. Целевая среда выполнения может не инициализироваться.
Эта ошибка возникает, так как требуемая среда выполнения .NET Core не установлена на виртуальной машине Linux. Как описано в дампах Отладки Linux, для анализа дампов .NET Core и LLDB и SOS требуются следующие двоичные файлы .NET Core из среды, в которой был создан файл дампа:
- libmscordaccore.so
- libcoreclr.so
- dotnet (узел, используемый для запуска приложения)
Это не проблема в предыдущих лабораториях устранения неполадок, так как вы проанализировали файлы дампа на той же виртуальной машине, на которой размещено и запущено приложение. Поэтому файлы уже присутствуют. Теперь необходимо скопировать правильную версию этих файлов (например, из виртуальной машины, на которой были взяты файлы дампа) или установить ту же среду выполнения .NET на виртуальной машине Linux WSL2.
Существует несколько методов определения целевой среды выполнения .NET Core. Проще всего попросить владельца приложения. Или, если вы являетесь владельцем, вы будете знать целевую среду выполнения .NET Core приложения. Что делать, если у вас нет этой информации вообще? В этом случае можно использовать команду lm
расширения SOS или modules
перечислить собственные модули, загруженные в процессе. Выполните эту команду, чтобы определить версию установки .NET.
Как показано на этом снимке экрана, версия среды выполнения .NET Core была 3.1.10. Вам нужна правильная версия libmscordaccore.so, libcoreclr.so и .NET. Эти файлы можно скопировать с виртуальной машины, на которой были созданы основные файлы дампа.
Есть ли еще один способ достичь того же результата? Например, можно установить среду выполнения .NET Core версии 3.1.10, чтобы иметь эти файлы? Короткий ответ да, вы можете. Но его невозможно установить с помощью sudo apt install dotnet-runtime-3.1.10
команды.
Вместо этого можно установить среду выполнения .NET Core 3.1. Однако эта версия установит последнюю версию .NET Core 3.1 (.NET Core 3.1.15 на момент написания этой статьи).
Это не будет работать, так как основной файл дампа предназначен для процесса .NET Core 3.1.10. У вас должна быть соответствующая версия этих необходимых файлов.
К счастью, существует инструмент dotnet-symbol, который может скачать файлы (символы, DAC, модули и т. д.), необходимые для отладки основных файлов дампа. Вы можете вспомнить это средство из предыдущих разделов. Чтобы установить это средство, выполните dotnet tool install -g dotnet-symbol
команду.
Теперь необходимо попросить средство dotnet-symbol скачать необходимые файлы, предназначенные для файла дампа ядра. Это передает имя файла дампа ядра и другие необходимые параметры: dotnet-symbol --host-only --debugging ~/dumps/coredump.manual.1.11724
В списке можно игнорировать последние две ошибки. Необходимые файлы загружаются в папку ~/dumps .
Откройте основной файл дампа с помощью dotnet-dump и попробуйте выполнить те же clrthreads
команды.
Теперь вы сможете открыть основной файл дампа на виртуальной машине Windows с помощью WSL2.
Открытие файлов дампа в lldb
Эти действия совпадают с предыдущими лабораториями устранения неполадок. Вы уже должны были охватить важные части, чтобы получить необходимые файлы для отладки основных файлов дампа с помощью dotnet-dump. Процедура одинакова для LLDB. Если вы хотите установить и использовать lldb для отладки, проверьте предыдущие лаборатории.
Если dotnet-symbol не удается найти необходимые файлы
Dotnet-symbol будет работать для большинства основных файлов дампа. Если по какой-то причине не удается скачать необходимые файлы, существуют способы обойти блокировку. Вы можете скачать и извлечь двоичные файлы с официальной веб-страницы Майкрософт. Затем вручную скопируйте необходимые файлы в ту же папку, которая содержит основной файл дампа.
Например, если вам нужны файлы для .NET Core 3.1.10 x64, вы можете скачать двоичные файлы из этого ASP.NET Core 3.1 Runtime (версия 3.1.10) — страница скачивания двоичных файлов Linux x64 и скопировать файлы вручную:
- .\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
Если целевая версия среды выполнения является частной (помните, что .NET Core открытый код, и вы можете создать и использовать собственную частную версию), необходимо скопировать эти файлы с виртуальной машины Linux, на которой был создан файл дампа ядра.