ひとりAdvent Calendar 11日目です。
ClrMDと呼ばれているMicrosoft.Diagnostics.Runtime.dll
が.NET Coreに対応したと聞いて試してみました。プロセスへのアタッチやダンプファイルの解析で、SOS and PSSCORといったツールを使ってやっていることをC#で記述できるようになります。.NET Core版はgitのブランチがcoreになっているので注意してください。
NuGetライブラリとしてもリリースされています。
ただ、Linux上での動作はまだ対応中らしくうまく動きませんでした。最後に簡単にまとめてあります。
使い方はGetting Startedのページから続く一連のページに詳細に書かれています。
clrmd/GettingStarted.md at core · Microsoft/clrmd · GitHub
解析対象となるプロセスにアタッチするか、プロセスから出力されたダンプファイルを読み込んで行います。ダンプファイルを生成する場合はタスクマネージャーでプロセスのコンテキストメニューから作成します。
あとは、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がつくられていて実際にできませんでした。
ダンプファイルからの読み込みについては、少なくとも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などがないようなのでもう少し調べてみる予定です。