Ошибка при попытке создать подкласс gdb.Breakpoint при написании расширения PythonGDB - PullRequest
4 голосов
/ 30 апреля 2011

Я пытаюсь написать простое расширение Python для GDB, которое выводит в файл при каждом достижении точки останова. Согласно документации, «класс gdb.Breakpoint можно разделить на подклассы» (см. http://sourceware.org/gdb/onlinedocs/gdb/Breakpoints-In-Python.html)

Однако, когда я пробую следующий код, я получаю сообщение об ошибке «Ошибка типа: ошибка при вызове баз метаклассов. Тип« gdb.Breakpoint »не является приемлемым типом базы»

class MyBreakpoint(gdb.Breakpoint):
  def stop (self):
    print "break"
    return False

Я использую Ubuntu 11.04 и gdb 7.2. Любая помощь или ссылки на лучшую документацию будут оценены. Спасибо!

Мои точные шаги:

$ gdb
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) source t.py 
Traceback (most recent call last):
  File "t.py", line 3, in <module>
    class MyBreakpoint(gdb.Breakpoint):
TypeError: Error when calling the metaclass bases
    type 'gdb.Breakpoint' is not an acceptable base type
(gdb) 

Ответы [ 2 ]

5 голосов
/ 01 мая 2011

Соответствующая документация по gdb 7.2 находится здесь:

http://sourceware.org/gdb/download/onlinedocs/gdb/Breakpoints-In-Python.html#Breakpoints-In-Python

Я предполагаю, что EmployedRussian использует сравнительно недавно GDB 7.2 (7.2.90 или что-то подобное, что, кажется, содержит эти патчи)

на самом деле это не официальный релиз 7.2, и во многих отношениях он больше похож на предварительный релиз 7.3, созданный всего за 2 недели до разветвления 7.3. (новая функция отключена от GDB 7.3).

так что он работал над тем, что gdb использует «ветку 7.3 перед выпуском», а не «ветку 7.3 после выпуска 7.2».

так что для этого с 7.2 вам, возможно, придется прибегнуть к

break foo
commands
python print "break"
end
3 голосов
/ 30 апреля 2011

Ваш код (с поправкой на отступ) работает нормально с GDB-7.2 и последним снимком CVS GDB:

$ cat t.py
class MyBreakpoint(gdb.Breakpoint):
  def stop (self):
    print "break"
    return False

$ gdb-cvs 
GNU gdb (GDB) 7.3.50.20110411-cvs
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) source t.py
(gdb) quit

Видите ли вы что-то другое, если вы повторите шаги выше? Если нет, что именно вы делаете, чтобы получить TypeError?

EDIT : это работает только потому, что к моему GDB-7.2 применены некоторые вышестоящие патчи. не работает с "ванилью" 7.2

...