我试图实现一个调试助手,它应该串联一个XML节点。我使用gdb 7.2s python界面来做到这一点。这个想法是获取节点地址,然后使用ctypes将它传递给xml库。python gdb和ctypes
我已经设法得到xml节点地址(一个gdb.Value),我可以在xml库中调用函数。但不知何故,目的不符合。
// prototype of functions to call
int xmlNodeDump (xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format);
xmlBufferPtr xmlBufferCreate(void);
而蟒蛇部分调用这个函数:
# 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崩溃。我做错了什么暗示?
我会很好奇这些地址仍然有效 - 如定义xmlDoc和xmlNod e结构,并尝试将void ptrs转换为这些类型的指针并访问这些字段。 – 2011-04-12 18:14:36
另一个需要考虑的角度 - 我不确定假设alloc字段是int的大小是否安全,因为它是一个枚举。这可能会严重破坏contentIO字段的对齐。 – 2011-04-12 18:19:09