銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

.NET Coreでダンプファイルを解析できる ClrMD を試してみた

ひとりAdvent Calendar 11日目です。

adventar.org

ClrMDと呼ばれているMicrosoft.Diagnostics.Runtime.dllが.NET Coreに対応したと聞いて試してみました。プロセスへのアタッチやダンプファイルの解析で、SOS and PSSCORといったツールを使ってやっていることをC#で記述できるようになります。.NET Core版はgitのブランチがcoreになっているので注意してください。

github.com

NuGetライブラリとしてもリリースされています。

www.nuget.org

ただ、Linux上での動作はまだ対応中らしくうまく動きませんでした。最後に簡単にまとめてあります。

使い方はGetting Startedのページから続く一連のページに詳細に書かれています。

clrmd/GettingStarted.md at core · Microsoft/clrmd · GitHub

解析対象となるプロセスにアタッチするか、プロセスから出力されたダンプファイルを読み込んで行います。ダンプファイルを生成する場合はタスクマネージャーでプロセスのコンテキストメニューから作成します。

f:id:tanaka733:20181209185727p:plain

あとは、DataTarget.LoadCrashDumpにダンプファイルのパスを指定するか、DataTarget.AttachToProcessにアタッチ対象のPIDとタイムアウト値(msec)を指定して解析を始めます。

using System;
using System.Linq;
using Microsoft.Diagnostics.Runtime;

namespace ClrMDExample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var target = DataTarget.LoadCrashDump(@"C:\Users\TanakaTakayoshi\AppData\Local\Temp\dotnet.DMP"))
            //using (var target = DataTarget.AttachToProcess(20612, 5000))
            {
                foreach (var version in target.ClrVersions)
                {
                    Console.WriteLine("Found CLR Version:" + version.Version.ToString());
...

解析できる内容は、先ほどの一連のドキュメントにサンプルコード付きでのっているのですが、ところどころメソッド名が変わっていたりしてそのままだと使えなかったので、実行できるように書き直したコードを載せておきます。

ClrMD example for .NET Core on Windows · GitHub

さて、Linuxで動かない件ですが、Processにアタッチできないというのはissueがつくられていて実際にできませんでした。

github.com

ダンプファイルからの読み込みについては、少なくともFedora 28では.NET Core 2.2、.NET Core 3.0 previewではWindowsで生成したダンプファイルの読み込みに失敗しました。Linux環境でのダンプファイル生成についてはこちらにドキュメントがあります。

coreclr/xplat-minidump-generation.md at master · dotnet/coreclr · GitHub

createdumpという実行ファイルがLinuxやmacOS向けに.NET Core SDKと一緒に配布されています。標準のインストール方法の場合、/usr/share/dotnet/shared/Microsoft.NETCore.App/*/createdumpに配置されていると思います。が、これもFedora28 だとPIDを指定して実行するとsegmentation faultというメッセージが出てなにも生成されませんでした。こちらについては既存のissueなどがないようなのでもう少し調べてみる予定です。