Error when analyzing memory dump of ASP.NET Core of azure web apps with dotMemory “DAC file was not found”

arichika.taniguchi
Dec 26, 2018 · 5 min read

課題の概要

Azure Web App (Windows) で動作している ASP.NET Core の Memory Dump を取得し、その Dump File を JetBrains の dotMemory で解析する際に、ファイルを開く時点で、以下のエラーが発生することがあります。

---------------------------
dotMemory
---------------------------
Unable to import the dump: The matching DAC file (mscordaccore.dll, v4.6.27110.04, x86) was not found neither on local machine nor on public Microsoft servers. Please find the file manully and copy it to the same folder with the dump.
---------------------------
OK
---------------------------

検索すると、

  • そのファイルをローカルに配置しなさい
  • または、ダンプを取得した環境でファイルを開きなさい
  • dotMemory の libs がツールからZIPファイルで提供されるのでそれを配置しなさい

といった回答にぶつかるのですが、相手は Azure App Service なので、そこで実行するわけにはいきません。

解決方法

このエラーは Azure Web Apps でプロセスが動作している環境には存在したファイルが、dotMemory の実行環境で見えてない状況で発生します。

今回の場合、ASP.NET Core アプリケーションが Microsoft.NETCore.App で動作していて、依存する mscordaccore.dll のバージョンがローカルにないよ、という状況ですので、以下の方法で解決することが出来ます。

.NET Core SDK からファイルを取得する

最新の .NET Core SDK をどこかの端末にインストールした上で、当該ファイル mscordaccore.dll を取得し、Dump ファイルが配置されているフォルダに配置します。この際、Azure Web Apps で x86 で動作している場合、x86 向けのファイルを取得する必要があります。

例えば先のエラーメッセージの場合だと、

$\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\2.2.0

にファイルがあるので、それをコピーしてあげれば、開けます。

mscordaccore.dll が存在するのは、Microsoft.NETCore.App だけなので、間違えることもありません。

Azure Web Apps から取得する

端末に導入してファイルを取得することが出来ない場合には、Azure 環境からも取得することが出来ます。

Azure Portal の Advanced Tools (Kudu) を利用して、実際に稼働している環境から当該ファイルを取得するのが簡単です。 Azure Web Apps 環境は D: にシステムが存在するので、具体的には以下の場所になります。

D:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\2.2.0

xcopy で D:\home\LogFiles あたりにファイルをコピーした上で、Portal からダウンロードしましょう。あとは同じです。

課題が発生した要因・原因

私の環境では、以下の環境要因により課題が発生していました。

  • 開発環境にインストールしていた .NET Core SDK が x64 版のみだった
  • Azure Web Apps 環境でマイナーバージョンが先行しており、仮に x86 版を入れていたとしても、適切に読み込めていなかった可能性が高い

ランタイムはまめに最新にするのが吉と出る時代。私は好みです。

参考リンク

Azure App Service diagnostics overview

既定で利用可能な診断ツールはとても便利です。Windows 慣れしてる方であれば、あ、あの設定がWebで出来るのか、といった類の機能が、フレンドリーUIで設定可能です。ガンガン使いましょう。

Azure App Service で full memory dump を取る

Sysinternals のコマンドが叩けます。

余談

mscordaccore_{arch}_{arch}_4.6.27110.04.dll

の、4.6 っていうバージョンが分かりづらい…

arichika.taniguchi

Written by

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade