#.net #visual-studio #debugging
#.net #visual-studio #отладка
Вопрос:
Есть ли способ отслеживать нераспределенные объекты во время отладки? Например, после достижения точки останова я бы посмотрел, что разработчики забыли убрать.
Комментарии:
1. Спасибо за ваши ответы. Жаль, что для этого требуется больше ручной работы.
Ответ №1:
Не напрямую.
Однако вы можете добавить финализаторы к вашим одноразовым классам и заставить финализаторы вызывать метод, приписываемый [Conditional("DEBUG"]
, который регистрирует / выдает / уведомляет вас при попадании в них. Это позволяет отслеживать, когда метод Dispose () не был вызван для объекта во время отладки, но при развертывании просто завершится в обычном режиме.
Ответ №2:
Хорошего способа сделать это нет. Хотя я согласен, что это было бы действительно неплохо, в Visual Studio отсутствуют какие-либо функции отладки для отслеживания IDisposable
значений, которые еще не удалены.
В прошлом, когда я хотел сценарий такого типа и не хотел использовать WinDbg SOS, я использовал форму отслеживания вручную. По сути, это выглядело так
static class Util {
private static List<WeakReference> _list = new List<WeakReference>();
public static IEnumerable<IDisposable> Active {
get { return _list
.Select(x => x.Target)
.Where(x => x != null)
.Cast<IDisposable>(); }
}
[Conditional("DEBUG")]
public static void Track(IDisposable value) {
_list.Add(new WeakReference(value));
if (_list.Count % 100 == 0)) {
_list.RemoveAll(x => x.Target == null);
}
}
}
Теперь я могу просто добавлять вызовы к Util.Track
в моем IDisposable
конструкторе объектов, а затем получать доступ к информации во время выполнения