gdb программирование на python: как написать код, который установит точки останова для каждого метода класса C ?

#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 обладает информацией.