Python GDB и Ctypes - PullRequest
       3

Python GDB и Ctypes

3 голосов
/ 12 апреля 2011

Я пытаюсь реализовать помощник по отладке, который должен привести в порядок узел xml. Я использую интерфейс Python GDB 7.2s, чтобы сделать это. Идея состоит в том, чтобы получить адрес узла, а затем передать его в библиотеку xml с помощью 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);

И часть 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)

Обычно это приводит к сбою GDB в xmlNodeDump. Есть намеки на то, что я делаю не так?

1 Ответ

3 голосов
/ 13 апреля 2011

Подумайте о том, что вы делаете.Он не может возможно работать!

Вы получаете значение gdb.Value, представляющее адрес xmlNodePtr в подчиненном (отлаженном) процессе.

Затем вы передаете этот адрес в libxml2.so.2, загруженный в саму GDB .

Но адрес в подчиненном, скорее всего, недоступен в GDB.Если случайно он доступен, он почти наверняка не указывает на xmlNode.И если по чуду он указывает на xmlNode, он все равно не будет тем узлом, который вам нужен (не тот, который находится в подчиненном процессе).

Есть два способа исправить это.

  • Если у вас есть живой подчиненный процесс (то есть вы не выполняете посмертную отладку), вы можете просто позвонить xmlNodeDump из gdb: call xmlNodeDump(a_pointer)
  • Если вы делаете посмертную отладкуили просто не хотите вызывать подчиненный процесс (делая это «мешает» подчиненному), вы должны полностью реализовать xmlNodeDump в Python, используя gdb.Value, dereference, cast и т. д.и т. д.
...