Информация об изменениях

Сообщение Re[7]: VS2017 - breakpoint на метод только определенного объ от 28.04.2018 11:30

Изменено 28.04.2018 11:38 Conr

Re[7]: 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. Недокументированный хак в чистом виде, при выходе новой студии нужно проверять работоспособность. Но относительно просто.
2. Использовать Concord Debug Engine. Оффициально, работать будет на всех версиях. Но практически нет документации, только это https://github.com/Microsoft/ConcordExtensibilitySamples
Re[7]: 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. Реализуется заметно сложнее.