Ошибка загрузки DAC: сбой CreateDacInstance при загрузке файла дампа с помощью ClrMD

Я пробую новую библиотеку от Microsoft, ClrMD, для анализа аварийных дампов и живой процесс.

Я следовал образцу в .NET Framework сообщение в блоге (используя прикрепленный файл .cs).

Я попытался запустить образец для анализа файла .dmp, который был взят из программы, работающей на том же компьютере, что и образец.

При попытке создать объект времени выполнения с помощью следующего кода:

ClrRuntime runtime = target.CreateRuntime(dacLocation);

Это исключение выдается:

Message: Failure loading DAC: CreateDacInstance failed 0x80131c30
 
  at Microsoft.Diagnostics.Runtime.Desktop.DacLibrary.Init(String dll)
  at Microsoft.Diagnostics.Runtime.Desktop.DacLibrary..ctor(DbgEngTarget dataTarget, String dll)
  at Microsoft.Diagnostics.Runtime.DbgEngTarget.CreateRuntime(String dacFilename)
  at DumpFetch.App..ctor()

Есть идеи?


person avivr    schedule 25.06.2013    source источник


Ответы (2)


У меня были похожие проблемы с первоначальным выпуском ClrMD. Он не смог успешно загрузить MSCORDACWKS, который WinDbg с радостью принял, находился на пути, который я сделал доступным для ClrMD, и мог успешно использовать WinDbg для того же дампа. То же самое произошло с первоначальным выпуском DebugDiag v2, который, как я понимаю, основан на ClrMD. Я сделал тот же переименованный DAC, принятый WinDbg, доступным в пути символа DebugDiag, и DebugDiag прервал анализ; сообщение о том, что [предоставлено] «временная метка и размер mscordacwk.dlls не соответствуют тому, что в дампе»; даже несмотря на то, что попытка загрузки через ProcMon ясно показала, что он обращается к правильной DLL через имя, принятое WinDbg.

Однако, работая с нашей командой Microsoft над невозможностью DebugDiag v2 загрузить DAC, я смог заставить наш TAM также предоставить раннюю копию «исправленного» ClrMD, который был назван ClrMD 0.8.5, который решил эти проблемы для меня. Это альфа-сборка, и я не уполномочен распространять ее, но, по крайней мере, вы можете поискать эту версию или версию новее 0.8.5 в дикой природе.

И еще одно: при использовании соответствующего 32-битного или 64-битного WinDbg обычно можно обойтись всего двумя именованными вариантами MSCORDACWKS: одним для 64-битного и одним для 32-битного. Таким образом, для загрузки MSCORDACWKS для .Net 4.0.0319.1008 с другого компьютера, например, вы можете переименовать 64-разрядную версию целевого хоста дампа из C:\Windows\Microsoft.NET\Framework64 в mscordacwks_AMD64_AMD64_4.0.31319.1008.dll для 64-битное приложение и переименуйте 32-битную версию из C:\Windows\Microsoft.NET\Framework64 в mscordacwks_x86_x86_4.0.30319.1008.dll для 32-битного приложения и в значительной степени добьетесь успеха.

Однако есть еще одна проблема, связанная с ClrMD. Вы можете столкнуться с тем, что библиотека ClrMD попытается получить дополнительные именованные версии DAC в зависимости от разрядности, которую вы используете в качестве цели сборки для компиляции Visual Studio вашего приложения с использованием ClrMD.

Когда я по привычке создал свой первый тестовый комплект ClrMd для 64-битной целевой платформы, ClrMd искал библиотеку с именем mscordacwks_x86_amd64_4.0.30319.1008.dll вместо имени "...x86_x86...". Несмотря на то, что я запускал свою тестовую программу для 32-разрядного приложения, простое переименование ЦАП из одного из двух упомянутых выше переименований не сработало. (Я не говорю, что у меня не было чего-то не так, просто у меня это не сработало. У вас может быть другое мнение.)

Однако, как только я изменил цель сборки в VS2010 на 32-разрядную, «исправленная» версия 0.8.5 немедленно загрузила правильно переименованную DLL mscordacwks_x86_x86_4.0.30319.1008 без дальнейших проблем.

person Bob Riddle    schedule 08.01.2014
comment
Я предполагаю, что он пытается загрузить X86_Amd64 DAC, когда 32-битный дамп процесса был создан 64-битным инструментом. blogs.msdn.microsoft.com/tess/2010/09/29/ - person Der_Meister; 21.06.2017

В ClrVersion есть еще один метод, называемый TryDownloadDac(); который загрузит правильный, но вам нужно запустить процесс на той же архитектуре, что и тот, который вы отлаживаете (64-битное приложение для отладки 64-битного, 32-битное приложение для отладки 32). Это потому, что ему нужно загрузить библиотеку DAC в память.

person TheXenocide    schedule 28.02.2014