適用対象: .NET Core 2.1、.NET Core 3.1、.NET 5
この記事では、Linux 用 Windows サブシステム (WSL) バージョン 2 を使用して、別の仮想マシン (VM) でコア ダンプ ファイルを開く方法について説明します。
前提条件
このセクションを進んで完了するには、次のものが必要です。
- Linux 用 Windows サブシステムを有効にする Windows 10 ベースのコンピューター。
- 任意のフォルダー内の Windows ベースのコンピューターにコピーされた少なくとも 1 つのコア ダンプ ファイル。
このラボの目標
WSL バージョン 2 を使用して、別の VM でコア ダンプ ファイルを開く方法について説明します。
Linux 用 Windows サブシステムを使用する
WSL を使用すると、開発者は、従来の VM またはデュアルブートセットアップのオーバーヘッドなしで、GNU/Linux 環境を Windows 上で直接実行できます。
WSL を有効にするには、 Windows Server インストール ガイドに移動し、WSL2 にアップグレードします。 このラボでは、Linux オペレーティング システムと同じ Ubuntu 18.04 LTS を選択していることを前提としています。 システムは WSL2 を使用して実行されます。
WSL2 をインストールした後、 sudo apt update
コマンドと sudo apt upgrade
コマンドを使用してパッケージ マネージャーを更新します。 Linux VM を初めてインストールしたときは、このシリーズの前のセクションのこれらのコマンドをよく理解している必要があります。
sudo apt update
sudo apt upgrade
Windows から Linux にファイルをコピーする
これで、Windows ベースのコンピューター内で WSL2 が実行されているはずです。 前のセクションでは、Windows ベースのコンピューター上の D:\Learn\Linux\Dumps フォルダーからコア ダンプ ファイルをコピーしました。ファイル名は coredumps.tar.gzと見なされていました。 目標は、 D:\Learn\Linux\Dumps\coredumps.tar.gz を WSL2 内で実行されている Linux VM にコピーすることです。
WSL2 のコマンド ラインの次のスクリーンショットを見ると、Windows の C ドライブが WSL2 Linux マシンで /mnt/c としてマップされていることに注意してください。 そのため、 D:\Learn\Linux\Dumps フォルダーの内容を一覧表示するには、 ll mnt/d/Learn/Linux/Dumps/
を実行します。
次に、 coredumps.tar.gz ファイルをコピーして、Linux ホーム ディレクトリ内のダンプ ファイル フォルダーに抽出します。 手順は簡単です。
cd ~
コマンドを使用して、ディレクトリをホーム ディレクトリに変更します。mkdir dumps
を実行してダンプ ファイル フォルダーを作成します。tar -xf /mnt/d/Learn/Linux/Dumps/coredumps.tar.gz -C dumps/
を実行して、coredumps.tar.gz ファイルを抽出します。
次のスクリーンショットは、これらのコマンドの動作を示しています。
dotnet-dump を使用してコア ダンプ ファイルを開く
手順の残りの部分は、.NET Core と .NET SDK をインストールした以前のトラブルシューティング ラボと似ています。 このセクションでは、これらの手順をもう一度説明します。
dotnet-dump ツールには .NET SDK が必要です。 そのため、dotnet-dump をインストールする前に、.NET SDK をインストールする必要があります。 前に説明したように、.NET SDK をインストールする前に、Microsoft パッケージ署名キーを信頼済みキーの一覧に追加してから、パッケージ リポジトリを追加する必要があります( SDK のインストール。 次のスクリーンショットのアクションの手順を参照してください。
これで、 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 VM にインストールされていないために発生します。 Debug Linux ダンプで説明されているように.NET Core ダンプを分析するには、LLDB と SOS の両方で、ダンプ ファイルが作成された環境の次の .NET Core バイナリが必要です。
- libmscordaccore.so
- libcoreclr.so
- dotnet (アプリを起動するために使用されるホスト)
以前のトラブルシューティング ラボでは、アプリケーションがホストされ、実行されているのと同じ VM 上のダンプ ファイルを分析していたため、これは問題ではありませんでした。 したがって、ファイルは既に存在していました。 ここで、これらのファイルの正しいバージョンをどこか (コア ダンプ ファイルが取得された VM など) からコピーするか、WSL2 Linux VM に同じ .NET ランタイムをインストールする必要があります。
ターゲットの .NET Core ランタイムを決定するには、いくつかの方法があります。 最も簡単な方法は、アプリケーションの所有者に問い合わせすることです。 または、所有者である場合は、アプリケーションのターゲット .NET Core ランタイムがわかっているでしょう。 その情報がまったくない場合はどうしますか? その場合は、プロセスに読み込まれるネイティブ モジュールを一覧表示する SOS 拡張コマンド ( lm
または modules
) を使用できます。 このコマンドを実行して、.NET インストールのバージョンを確認します。
このスクリーンショットに示すように、.NET Core ランタイム バージョンは 3.1.10 でした。 libmscordaccore.so、libcoreclr.so、および .NET の正しいバージョンが必要です。 コア ダンプ ファイルが生成された VM からこれらのファイルをコピーできます。
同じ結果を得る別の方法はありますか? たとえば、.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 プロセス用であるため、これは機能しません。 必要なファイルのバージョンが一致している必要があります。
さいわい、コア ダンプ ファイルのデバッグに必要なファイル (シンボル、DAC、モジュールなど) をダウンロードできる dotnet シンボル ツール があります。 このツールは、前のセクションで取り上げたことを思い出してください。 このツールをインストールするには、 dotnet tool install -g dotnet-symbol
コマンドを実行します。
次に、コア ダンプ ファイルを対象とする必要なファイルをダウンロードするように dotnet-symbol ツールに依頼する必要があります。 これにより、コア ダンプ ファイル名とその他の必要なパラメーター ( dotnet-symbol --host-only --debugging ~/dumps/coredump.manual.1.11724
) が渡されます。
リスト内の最後の 2 つのエラーは無視できます。 必要なファイルは、 ~/dumps フォルダーにダウンロードされます。
dotnet-dump を使用してコア ダンプ ファイルを開き、同じ clrthreads
コマンドを実行してみてください。
これで、WSL2 を使用して、Windows VM 上のコア ダンプ ファイルを開くことができるようになります。
lldb でダンプ ファイルを開く
これらの手順は、前のトラブルシューティング ラボと同じです。 dotnet-dump を使用してコア ダンプ ファイルをデバッグするために必要なファイルを取得するために、前に重要な部分について既に説明しておく必要があります。 プロシージャは LLDB でも同じです。 デバッグに lldb をインストールして使用する場合は、前のラボを確認します。
dotnet-symbol で必要なファイルが見つからない場合
Dotnet シンボルは、ほとんどのコア ダンプ ファイルで機能します。 何らかの理由で必要なファイルをダウンロードできない場合は、ブロックを回避する方法があります。 バイナリは、Microsoft の公式 Web ページからダウンロードして抽出できます。 次に、必要なファイルを、コア ダンプ ファイルを含む同じフォルダーに手動でコピーします。
たとえば、.NET Core 3.1.10 x64 のファイルが必要な場合は、この ASP.NET Core 3.1 Runtime (v3.1.10) - Linux x64 Binaryes ダウンロード ページからバイナリをダウンロードしファイルを手動でコピーできます。
- .\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 VM からこれらのファイルをコピーする必要があります。