#c #gdb
#c #gdb
Вопрос:
Я отлаживаю проблему, и я хочу прерывать работу при каждом вызове метода, который имеет определенный объект в качестве параметра «this». Возможно ли это в GDB?
Комментарии:
1. Вы имеете в виду конкретный адрес? Вы не можете получить тип объекта из указателя this .
2. Вам придется использовать условную точку останова. Они существуют, но я понятия не имею, как их настроить. gdb в значительной степени является для меня загадкой, и различные графические интерфейсы вокруг него делают больше, чтобы скрыть, чем сделать его доступным.
3. Я имею в виду конкретный адрес — у меня есть объект, который застрял, и я хочу знать, что на нем вызывается.
4. @NathanielFlath: Итак, не только один адрес, но вы хотите останавливаться на каждой отдельной функции-члене метода, которая вызывается с этим адресом как
this
?5. @NathanielFlath: Я предполагаю, что это невозможно сделать легко, не установив условную точку останова типа, указанного в лучшем ответе, для каждого метода соответствующего класса. Возможно, я ошибаюсь. Для gdb может быть возможно указать (и использовать) какой-то подстановочный знак, который соответствовал бы всем методам класса. Это была бы действительно полезная функция.
Ответ №1:
Это просто. Вы можете использовать команду, подобную b A::a if (this==0x28ff1e)
.
Комментарии:
1. Можно ли указать подстановочный знак вместо
A::a
того, чтобы он соответствовал именам всех методов вA
классе?2. Я не знаю никакого способа использовать подстановочный знак в gdb, возможно, ему нужна программа для генерации команд для установки разрывов.
3. @NathanielFlath — Знаете, мне интересно
rbreak
, может ли команда gdb не делать то, что вы хотите…4. По какой-то причине мне нужно использовать версию без круглых скобок, например
b A::a if this==0x28ff1e
Ответ №2:
Параметром this должны быть только методы, которые включены в сам класс. Поэтому вам просто нужно установить точки останова для всех методов рассматриваемого класса. Я не уверен, что есть простой способ сделать это.
Комментарии:
1. Я предположил, что OP имеет в виду конкретный метод. Но я подозреваю, что ваша интерпретация более правильная. Как бы вы настроили такую точку останова даже для одного метода?
Ответ №3:
Я хочу прерывать каждый вызов метода, который имеет определенный объект в качестве параметра «this»
Это означает, что вы хотите выполнить разрыв для каждой функции-члена определенного класса, для которого был создан экземпляр объекта.
Для удобства предположим, что все функции-члены определены в конкретном cpp-файле, например myclass_implementation.cpp
Вы можете использовать gdb для применения точки останова к каждой функции внутри myclass_implementation.cpp
таким образом:
rbreak myclass_implementation.cpp:.
Допустим, вы хотите прервать некоторые конкретные функции, такие как функции получения, которые начинаются с Get , тогда вы можете использовать gdb для применения точек останова таким образом:
rbreak myclass_implementation.cpp:Get*