Как отлаживать внутрипроцессные приложения ASP.Net Core с WinDBG и SOS? - PullRequest
0 голосов
/ 03 января 2019

У меня есть приложение ASP.Net Core 2.2, предназначенное для .Net Core 2.2. Я размещаю его в службе приложений Azure, используя новую модель внутрипроцессного хостинга . Затем я создаю дамп памяти с помощью инструментов диагностики службы приложений. Откройте его с помощью Visual Studio, и я вижу две версии CLR: 4.7.3190.0; 4.6.27110.4. Могу сказать, что 4.7.3190.0 - для .Net Framework, а 4.6.27110.4 - для .Net Core. enter image description here Если я открываю дамп в WinDBG, он продолжает загружать библиотеку mscordacwks для 4.7.3190.0. У меня нет никакого способа заставить это загрузить DLL mscordaccore для 4.6.27110.4. И, таким образом, простая команда SOS, такая как !Threads, приводит к ошибке Failed to request ThreadStore.

Как я могу отлаживать мой управляемый код (часть .Net Core), используя WinDBG и SOS?

Вы можете получить образец дампа памяти здесь .

Обновление

Спасибо за БОЛЬШУЮ помощь от Томас Веллер ! Решение в этом случае - запустить .cordll -u -I coreclr -l -lp "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\". Я должен выгрузить (-u) ЦАП ЦАП и загрузить (-l) Core ЦАП ЦАП одной командой.

Успешные команды и журналы: здесь .

1 Ответ

0 голосов
/ 03 января 2019

В общем, я бы сказал, взгляните на команду .cordll.В частности,

0:000> .cordll -u
CLR DLL status: No load attempts

для выгрузки ЦАП CLR и

0:000> .cordll -I coreclr -l -lp "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\"
CLR DLL status: Loaded DLL f:\debug\symbols\mscordaccore_AMD64_AMD64_4.6.27110.04.dll\5BE756335c6000\mscordaccore_AMD64_AMD64_4.6.27110.04.dll

для загрузки ЦАП .NET Core по определенному пути.


В вашем сбоеdump, существует 2 версии CLR:

0:000> lm m *clr
start             end                 module name
00007ffc`ac990000 00007ffc`acf56000   coreclr    (deferred)             
00007ffc`c2130000 00007ffc`c2b1d000   clr        (deferred)

Подробности

0:000> lmvm clr
[...]
    File version:     4.7.3190.0
0:000> lmvm coreclr
[...]
    File version:     4.6.27110.4

Как показано в Visual Studio.

Если вы делаете обычные .loadby sos clr, он загрузит SOS для версии 4.7, откуда clr.К сожалению, .loadby sos coreclr не будет работать так же, потому что поддержка отладки не предоставляется для .NET Core так же, как для .NET.

0:000> .loadby sos coreclr
The call to LoadLibrary(D:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\sos) failed
Win32 error 0n126 "The specified module could not be found."

Если вы установили соответствующий .NETБазовый пакет, в пути есть несколько версий SOS, например C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\.Затем вы можете явно загрузить расширение из этого пути:

0:000> .load C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\sos.dll

Убедитесь, что вы выгружаете SOS из CLR:

0:000> .unload C:\...\sos.dll

И проверяете с помощью .chain, что загружена только одна SOS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...