Разрыв GDB при вызове функции объекта

#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*