首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python gdb和ctype

python gdb和ctype
EN

Stack Overflow用户
提问于 2011-04-12 23:27:54
回答 1查看 976关注 0票数 3

我正在尝试实现一个调试帮助器,它应该字符串表示一个xml节点。我使用GDB7.2s的python接口来做这件事。其思想是获取节点地址,然后使用ctype将其传递给xml库。

我已经设法获得了xml节点地址(一个gdb.Value),并且可以调用xml库中的函数。但不知何故,这两个目标并不一致。

代码语言:javascript
复制
// prototype of functions to call
int xmlNodeDump (xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format);
xmlBufferPtr xmlBufferCreate(void);

以及调用此函数的python部分:

代码语言:javascript
复制
# this is xmlBuffer
class lxmlBufferStruct(Structure):
    _fields_ = [('content', POINTER(c_ubyte)),
        ('use', c_uint), ('size', c_uint),
        ('alloc', c_int), ('contentIO', POINTER(c_ubyte))]
pNode # gdb.Value containing the addr of xmlNodePtr cur
pDoc # gdb.Value  containing addr of xmlDocPtr doc

libxml2 = CDLL('libxml2.so.2')
xmlBufferCreate = libxml2.xmlBufferCreate
xmlBufferCreate.restype = POINTER(lxmlBufferStruct)
xmlBuf = xmlBufferCreate()
libxml2.xmlNodeDump(buf, c_void_p(int(str(pDoc), 16)), 
    c_void_p(int(str(pNode), 16)), 0, 0)

这通常会让我在xmlNodeDump上遇到gdb崩溃。有没有暗示我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-13 10:22:24

想想你在做什么。这不可能行得通!

您将获得一个gdb.Value,表示下级(被调试)进程中xmlNodePtr的地址。

然后将该地址传递给libxml2.so.2,并加载到GDB本身。

但是在GDB中很可能无法访问下级中的地址。如果它碰巧是可访问的,那么它几乎肯定不会指向xmlNode。如果它奇迹般地指向xmlNode,那么它仍然不是您想要的节点(而不是下级进程中的节点)。

有两种方法可以解决这个问题。

  • 如果你有一个实时的下级进程(即你没有做事后调试),你可以简单地从gdb调用xmlNodeDump:你正在做事后调试,或者只是不想调用下级进程(这样做会“干扰”下级进程),你必须完全用Python语言重新实现xmlNodeDump,使用gdb.Valuedereferencecast等。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5637718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档