我正在尝试实现一个调试帮助器,它应该字符串表示一个xml节点。我使用GDB7.2s的python接口来做这件事。其思想是获取节点地址,然后使用ctype将其传递给xml库。
我已经设法获得了xml节点地址(一个gdb.Value),并且可以调用xml库中的函数。但不知何故,这两个目标并不一致。
// prototype of functions to call
int xmlNodeDump (xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format);
xmlBufferPtr xmlBufferCreate(void);以及调用此函数的python部分:
# 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崩溃。有没有暗示我做错了什么?
发布于 2011-04-13 10:22:24
想想你在做什么。这不可能行得通!
您将获得一个gdb.Value,表示下级(被调试)进程中xmlNodePtr的地址。
然后将该地址传递给libxml2.so.2,并加载到GDB本身。
但是在GDB中很可能无法访问下级中的地址。如果它碰巧是可访问的,那么它几乎肯定不会指向xmlNode。如果它奇迹般地指向xmlNode,那么它仍然不是您想要的节点(而不是下级进程中的节点)。
有两种方法可以解决这个问题。
xmlNodeDump:你正在做事后调试,或者只是不想调用下级进程(这样做会“干扰”下级进程),你必须完全用Python语言重新实现xmlNodeDump,使用gdb.Value,dereference,cast等。https://stackoverflow.com/questions/5637718
复制相似问题