Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python gdb和ctypes_Python_Gdb_Ctypes - Fatal编程技术网

python gdb和ctypes

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,

我正在尝试实现一个调试助手,它应该字符串化xml节点。我使用gdb7.2spython接口来实现这一点。其思想是获取节点地址,然后使用ctypes将其传递给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崩溃。我做错了什么?想想你在做什么。它不可能工作

您将获得一个gdb.Value,它表示低级(正在调试)进程中
xmlNodePtr
的地址

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

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

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

  • 如果您有一个活动的低级进程(即,您没有进行事后调试),您可以从gdb调用
    xmlNodeDump
    callxmlnodedump(a_指针)
  • 如果您正在进行事后调试,或者只是不想调用低级进程(这样做会“干扰”低级进程),那么您必须完全在Python中重新实现
    xmlNodeDump
    ,使用
    gdb.Value
    dereference
    cast
    ,等等

我很好奇这些地址仍然有效——如定义XMLDOC和XMLNo结结构,并尝试将空PTR转换为这些类型的指针并访问这些字段。另一个要考虑的角度,我不确定是否安全地假设OLLC字段是int的大小,因为它是枚举。这可能会对contentIO字段的对齐造成严重破坏。出于某种原因,我假设gdb加载到与次字段相同的地址空间。如果这不是真的,那么我的脚本的行为为什么是随机的,这是很清楚的。我想知道为什么调试C++助手在早期使用过:它们被注入到调试程序中。