VS2017 - breakpoint на метод только определенного объекта
От: CoderMonkey  
Дата: 25.04.18 23:05
Оценка:
Есть ли возможность поставить breakpoint только когда метод (в котором находится breakpoint) исполняется для определенного объекта, а не всех остальных объектов того же типа?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re: VS2017 - breakpoint на метод только определенного объекта
От: VladFein США  
Дата: 25.04.18 23:45
Оценка: +1
Здравствуйте, CoderMonkey, Вы писали:

CM>Есть ли возможность поставить breakpoint только когда метод (в котором находится breakpoint) исполняется для определенного объекта, а не всех остальных объектов того же типа?


Можно — conditional breakpoint.
А чем этот объект отличается от других? Только this?
Re[2]: VS2017 - breakpoint на метод только определенного объекта
От: CoderMonkey  
Дата: 26.04.18 00:11
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>А чем этот объект отличается от других? Только this?


Ага.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[3]: VS2017 - breakpoint на метод только определенного объекта
От: VladFein США  
Дата: 26.04.18 00:22
Оценка: 2 (1)
Здравствуйте, CoderMonkey, Вы писали:

CM>Здравствуйте, VladFein, Вы писали:


VF>>А чем этот объект отличается от других? Только this?


CM>Ага.


http://files.rsdn.org/21374/conditional.png
Re[4]: VS2017 - breakpoint на метод только определенного объекта
От: CoderMonkey  
Дата: 26.04.18 01:59
Оценка: -1
Здравствуйте, VladFein, Вы писали:

VF>http://files.rsdn.org/21374/conditional.png


Слегка через то самое место, но тоже вариант.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[4]: VS2017 - breakpoint на метод только определенного объекта
От: CoderMonkey  
Дата: 26.04.18 17:19
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>http://files.rsdn.org/21374/conditional.png


Только есть одна проблема — сборка мусора меняет значение this.

Sharov, а ты хотел сказать что-то осмысленное или просто высказать своё "фи"?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[5]: VS2017 - breakpoint на метод только определенного объекта
От: Conr Россия  
Дата: 27.04.18 12:13
Оценка: 12 (2) +1
Здравствуйте, 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  
Дата: 27.04.18 16:27
Оценка:
Здравствуйте, Conr, Вы писали:

C>- В Locals или Watch window для нужного объекта создаем уникальный ID (Make Object ID в контекстном меню).


Интересно, можно ли сделать это программно?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[7]: VS2017 - breakpoint на метод только определенного объ
От: Conr Россия  
Дата: 28.04.18 11:30
Оценка: 12 (2)
Здравствуйте, 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. Реализуется заметно сложнее.
Отредактировано 28.04.2018 11:38 Conr . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.