Как перейти от дампа процесса ASP.NET к стеку управляемых вызовов?
У нас есть большое приложение ASP.NET, которое иногда падает из-за StackruException
s. Поскольку они не очень элегантно обрабатываются.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
Вы должны получить довольно далеко с этим подходом:
Убедитесь, что у вас есть правильные символы
.symfix d:\symbols
Загрузите расширение.NET в WinDbg
.loadby sos clr
.loadby sos mscorwks
Выберите тему с исключением
~#s
Распечатать исключение
!pe
и стеки вызовов
!clrstack
!dumpstack
Если у вас возникли проблемы с версией SOS или mscordacwks, поскольку дамп не с той же машины, получите правильную версию с сервера с помощью Mscordacwks Collector.
Также обратите внимание, что всегда предварительно выделяется одно StackruException, но не обязательно выбрасывается. Вывод команды типа
!dumpheap -stat -type StackruException
может вводить в заблуждение.