Как перейти от дампа процесса ASP.NET к стеку управляемых вызовов?

У нас есть большое приложение ASP.NET, которое иногда падает из-за StackruExceptions. Поскольку они не очень элегантно обрабатываются.NET, мы сводимся к посмертной отладке без каких-либо обычных журналов исключений и трассировки стека. Как только мы выясним, где возникает проблема, ее, как правило, довольно легко исправить; трудная часть указывает булавку, где в кодовой базе происходит ошибка.

Похоже, что файл дампа процесса, который мы получаем после сбоя, очень поможет в этом, но до сих пор мы не могли понять, как его лучше всего использовать. Вы можете (очень, очень, медленно) "отладить" процесс с помощью Visual Studio, но это в основном требует постоянной загрузки символов MSFT, а затем не загружает символы для наших DLL-библиотек приложений (поэтому вы не можете видеть интересные части стек вызовов).

Похоже, что должен быть прямой путь от:

  • Файл аварийного дампа
  • Набор управляемых приложений DLL /PDB

в полный стек управляемых вызовов; Может кто-нибудь может описать (или указать учебник) для этого (с помощью VS, WinDbg или любого другого инструмента)?

2 ответа

Да, есть способ получить управляемый стек и многое другое..

Что вы ищете, так это расширение отладчика SOS.dll для WinDbg. Расширение отладчика SOS.dll находится в той же папке, где установлена ​​платформа.NET (например, C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll).

После загрузки SOS.dll в WinDbg вы можете запросить:

  • стек управляемых вызовов :! clrstack
  • управляемые темы :! темы
  • стековые (локальные) переменные !clrstack –l
  • аргументы вызова функции !clrstack -p
  • информация об объекте ! сделать адрес
  • потребление памяти ! dumpheap
  • объект, содержащий ссылку на адрес памяти ! адрес gcroot
  • управляемые замки ! syncblk

Вот шпаргалка с командами, чтобы обойти, используя sos.dll.

Вы должны получить довольно далеко с этим подходом:

Убедитесь, что у вас есть правильные символы

.symfix d:\symbols

Загрузите расширение.NET в WinDbg

.loadby sos clr
.loadby sos mscorwks

Выберите тему с исключением

~#s

Распечатать исключение

!pe

и стеки вызовов

!clrstack
!dumpstack

Если у вас возникли проблемы с версией SOS или mscordacwks, поскольку дамп не с той же машины, получите правильную версию с сервера с помощью Mscordacwks Collector.

Также обратите внимание, что всегда предварительно выделяется одно StackruException, но не обязательно выбрасывается. Вывод команды типа

!dumpheap -stat -type StackruException

может вводить в заблуждение.

Другие вопросы по тегам