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

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

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

Похоже, должен быть простой способ уйти от:

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

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


person ChaseMedallion    schedule 06.05.2014    source источник
comment
Мне любопытно узнать, в каких областях вы обнаружите эти исключения. Я не припомню, чтобы когда-либо обнаруживал StackOverflowException в ASP.NET.   -  person John Saunders    schedule 07.05.2014
comment
@JohnSaunders: один из примеров, который мы видели, - это разработчик, объединяющий несколько списков с использованием Aggregate и Concat вместо SelectMany. Самый последний случай, похоже, связан с очень сложным запросом, заставляющим посетителя выражения EF переполнять стек (я подозреваю, что это большое предложение IN).   -  person ChaseMedallion    schedule 07.05.2014
comment
Вот это да. Спасибо за ответ. Их, вероятно, нельзя было бы обнаружить при модульном тестировании, и я уверен, что попытка / улов не поймала бы их.   -  person John Saunders    schedule 07.05.2014
comment
won't load the symbols for our application DLLs ‹- почему бы и нет? Откройте окно Debug -> Windows -> Modules в VS и посмотрите, почему ваши pdbs не обнаруживаются. (Щелкните правой кнопкой мыши свою dll и выберите «Информация о загрузке символов»). Я считаю, что вы делаете это хорошо (символы MSFT будут кэшироваться и загружаться быстрее после первый раз)   -  person wal    schedule 07.05.2014


Ответы (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 address
  • управляемые блокировки ! syncblk

Вот шпаргалка с командами для обхода использования sos.dll < / а>.

person Mike Dinescu    schedule 06.05.2014
comment
Звучит здорово. Поскольку я никогда не использовал WinDbg или SOS, не могли бы вы опубликовать образец последовательности команд для доступа к стеку вызовов? - person ChaseMedallion; 07.05.2014
comment
Я немного опаздываю, но если вы выполните поиск в Google, чтобы узнать, как отлаживать с помощью WinDbg и SOS.dll, я уверен, что вы найдете несколько руководств. некоторые трассировки стека, которые устранят необходимость использования WinDbg + SOS.dll, что, хотя и более мощное, может оказаться утомительным процессом. - person Mike Dinescu; 07.05.2014
comment
Как зафиксировать исключение и создать трассировку без WinDbg? - person ChaseMedallion; 07.05.2014
comment
@ChaseMedallion - вы правы ... пожалуйста, не обращайте внимания на комментарий о трассировках стека ... Я упустил из виду тот факт, что вы имели дело с StackOverFlowException. Но вы должны иметь возможность использовать расширение SOS.dll для устранения неполадок. - person Mike Dinescu; 07.05.2014

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

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

.symfix d:\symbols

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

.loadby sos clr
.loadby sos mscorwks

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

~#s

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

!pe

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

!clrstack
!dumpstack

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

Также обратите внимание, что всегда существует одно заранее выделенное StackOverflowException, но не обязательно выбрасываемое. Результат такой команды, как

!dumpheap -stat -type StackOverflowException

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

person Thomas Weller    schedule 07.05.2014