python gdb和ctypes
我正在尝试实现一个调试助手,它应该字符串化xml节点。我使用gdb7.2spython接口来实现这一点。其思想是获取节点地址,然后使用ctypes将其传递给xml库 我已经获得了xml节点地址(一个gdb.Value),并且可以调用xml库中的函数。但不知何故,目的并没有达到python gdb和ctypes,python,gdb,ctypes,Python,Gdb,Ctypes,我正在尝试实现一个调试助手,它应该字符串化xml节点。我使用gdb7.2spython接口来实现这一点。其思想是获取节点地址,然后使用ctypes将其传递给xml库 我已经获得了xml节点地址(一个gdb.Value),并且可以调用xml库中的函数。但不知何故,目的并没有达到 // prototype of functions to call int xmlNodeDump (xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level,
// 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崩溃。我做错了什么?想想你在做什么。它不可能工作 您将获得一个gdb.Value,它表示低级(正在调试)进程中
xmlNodePtr
的地址
然后将该地址传递到libxml2.so.2
,并加载到GDB本身
但是,在GDB中很可能无法访问较低级别的地址。如果碰巧可以访问,它几乎肯定不会指向xmlNode
。如果奇迹般地指向xmlNode
,它仍然不是您想要的节点(不是处于较低进程中的节点)
有两种方法可以解决这个问题
- 如果您有一个活动的低级进程(即,您没有进行事后调试),您可以从gdb调用
:xmlNodeDump
callxmlnodedump(a_指针)
- 如果您正在进行事后调试,或者只是不想调用低级进程(这样做会“干扰”低级进程),那么您必须完全在Python中重新实现
,使用xmlNodeDump
,gdb.Value
,dereference
,等等cast