Отладка и удаление объектов в Visual Studio

#.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 конструкторе объектов, а затем получать доступ к информации во время выполнения