写入PythonGDB扩展时尝试将gdb.Breakpoint子类化时出错

写入PythonGDB扩展时尝试将gdb.Breakpoint子类化时出错,python,scripting,gdb,extending,Python,Scripting,Gdb,Extending,我试图为GDB编写一个简单的python扩展,每当遇到断点时,它就会输出到一个文件中。根据文档,“gdb.Breakpoint类可以分为子类”(请参阅) 但是,当我尝试以下代码时,我得到错误“TypeError:调用元类基时出错。类型'gdb.Breakpoint'不是可接受的基类型” 我正在运行Ubuntu11.04和GDB7.2。任何帮助或链接到更好的文件将不胜感激。谢谢 我的具体步骤是: $ gdb GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2 Cop

我试图为GDB编写一个简单的python扩展,每当遇到断点时,它就会输出到一个文件中。根据文档,“gdb.Breakpoint类可以分为子类”(请参阅)

但是,当我尝试以下代码时,我得到错误“TypeError:调用元类基时出错。类型'gdb.Breakpoint'不是可接受的基类型”

我正在运行Ubuntu11.04和GDB7.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) 
$gdb
GNU gdb(Ubuntu/Linaro 7.2-1ubuntu11)7.2
版权所有(C)2010免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“i686 linux gnu”。
有关错误报告说明,请参阅:
.
(gdb)源t.py
回溯(最近一次呼叫最后一次):
文件“t.py”,第3行,在
类MyBreakpoint(gdb.Breakpoint):
TypeError:调用元类基时出错
类型“gdb.Breakpoint”不是可接受的基类型
(gdb)
您的代码(针对缩进进行了更正)似乎可以与GDB-7.2和最近的GDB CVS快照配合使用:

$ 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
$cat t.py
类MyBreakpoint(gdb.Breakpoint):
def停止(自):
打印“中断”
返回错误
$gdb cvs
GNU gdb(gdb)7.3.50.20110411-cvs
版权所有(C)2011免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“x86_64-unknown-linux-gnu”。
有关错误报告说明,请参阅:
.
(gdb)源t.py
(gdb)退出
如果你重复上述步骤,你会看到一些不同的东西吗? 如果没有,您将如何获得
类型错误

编辑:这仅适用于我的GDB-7.2应用了一些上游补丁。
它不适用于“香草”7.2,相应的gdb 7.2文档如下:

我假设EmployedRussian使用的是相对较新的GDB7.2(7.2.90或类似版本,似乎包含这些补丁)

这并不是7.2的正式版本,在很多方面更像是7.3的预发行版,它是在7.3发布前2周创建的 (gdb 7.3的新功能被切断)

因此,它对his的作用仅仅是gdb使用了“发布前的分支7.3”,而不是“发布7.2后的分支7.3”模型

因此,要使用7.2实现这一点,您可能必须求助于

break foo
commands
python print "break"
end

很抱歉格式化错误。我已经用产生错误的确切步骤编辑了我的文章。为了保持一致性,我将脚本重命名为t.py。我注意到CVS快照比我的版本早了几个版本,所以下一步我会尝试一下。我无法从源代码构建gdb,得到错误“/libdecnumber/decContext.h:54:61:致命错误:gstdint.h:没有这样的文件或目录”。这可能与最初的问题无关,而且由于您在7.2上使用了它,我怀疑构建7.3分支是否会有所帮助。还有其他想法吗?谢谢你的帮助!是的,我没有意识到我的GDB-7.2合并了这些补丁,但它确实合并了。当我构建“香草”7.2时,我得到了与OP相同的错误。
break foo
commands
python print "break"
end