Есть ли возможность поставить breakpoint только когда метод (в котором находится breakpoint) исполняется для определенного объекта, а не всех остальных объектов того же типа?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re: VS2017 - breakpoint на метод только определенного объекта
Здравствуйте, CoderMonkey, Вы писали:
CM>Есть ли возможность поставить breakpoint только когда метод (в котором находится breakpoint) исполняется для определенного объекта, а не всех остальных объектов того же типа?
Можно — conditional breakpoint.
А чем этот объект отличается от других? Только this?
Re[2]: VS2017 - breakpoint на метод только определенного объекта
Здравствуйте, CoderMonkey, Вы писали:
VF>>http://files.rsdn.org/21374/conditional.png CM>Только есть одна проблема — сборка мусора меняет значение this.
Пример на C++ был, там такого нет
В C# нужно иначе:
— В Locals или Watch window для нужного объекта создаем уникальный ID (Make Object ID в контекстном меню). Номер будет показываться в скобках в Locals\Watch
— В Conditional пишем this == $n
можно и не this, а любое имя переменной, относящейся к этому объекту.
Re[6]: VS2017 - breakpoint на метод только определенного объекта
Здравствуйте, CoderMonkey, Вы писали:
C>>- В Locals или Watch window для нужного объекта создаем уникальный ID (Make Object ID в контекстном меню). CM>Интересно, можно ли сделать это программно?
Можно, в расширении VS. Самый простой способ использовать встроенный Expression Evaluator:
1. получаем Debugger5 Interface Как получить — в Remarks
2. вызываем Debugger5.GetExpression для this (или любой переменной) и результат кастим к Expression2 Interface
3. вызываем Expression2.MakeObjectId
4. парсим Expression.Value, к нему добавится {N#}
далее при желании можно в Debugger5.GetExpression передавать $N и наблюдать за объектом.
Но это способ довольно дубовый и медленный. Хотя для единичных объектов отлично подойдет. Более эффективные способы:
1. присоединиться к отладочной сессии, получить IDebuggerInternalXX (в зависимости от студии) и вызывать IDebuggerInternalXX.CreateObjectID. Недокументированный хак в чистом виде, подходит для VS 2010-2017.6.6 При выходе новой студии нужно проверять работоспособность и, возможно, искать новые интерфейсы IDebuggerInternalXX. Но относительно просто.
2. Использовать Concord Debug Engine. Оффициально, работать будет на всех версиях (>=2012). Практически нет документации, только это https://github.com/Microsoft/ConcordExtensibilitySamples. Реализуется заметно сложнее.