#c #python #debugging #gdb
#c #python #отладка #gdb
Вопрос:
Я хотел бы иметь возможность устанавливать точки останова для каждого метода класса C в gdb. Я думаю, что самый простой способ сделать это, вероятно, на python, поскольку теперь python имеет полный доступ к gdb. Я очень мало знаю python, а с gdb поверх него это еще сложнее. Мне интересно, знает ли кто-нибудь, как написать код класса python, который устанавливает точки останова для каждого метода именованного класса в gdb.
Ответ №1:
Предполагая, что вы скомпилированы с использованием символов отладки, вам даже не нужен python для этого:
rbreak source.cpp:.
Комментарии:
1. вау, это здорово, спасибо! Я в отпуске, и у меня нет возможности проверить это, но я только что просмотрел документы gdb, и вот оно!
Ответ №2:
Редактировать: Я только что заметил, что вы спрашиваете, как это сделать с классом C , а не с классом python. Упс. Я оставлю ответ в надежде, что он будет полезен всем, кто занимается отладкой расширения python…
Немного погуглив, можно найти: код Python может манипулировать точками останова с помощью gdb.Breakpoint
класса..
Мы можем найти все методы такого класса, как этот:
import inspect
class Foo(object):
bar = 1
def baz(self):
print "quoz"
inspect.getmembers(Foo, inspect.ismethod)
# [('baz', <unbound method Foo.baz>)]
Собираем это вместе:
def stop_hammertime(klass):
methods = inspect.getmembers(klass, inspect.ismethod)
method_names = [klass.__name__ m[0] for m in methods]
return [gdb.Breakpoint(m) for m in method_names]
Примечание: Это непроверено, поскольку у меня не установлен gdb
модуль.
Ответ №3:
Вы можете сгенерировать (например, используя python) файл .gdbrc со строкой, содержащей ‘break C::foo’ для каждой функции вашего класса C, а затем запустить gdb.
Комментарии:
1. спасибо, но я действительно хочу общую процедуру, которая будет работать, когда я нахожусь в gdb, не выходя. Учитывая, что при завершении вкладки будет отображен целый список символов, очевидно, что gdb обладает информацией.