Как конвертировать gdb.TYPE_CODE_PTR в void * в C? - PullRequest
0 голосов
/ 07 января 2019
I have following 2 functions defined in a library:

void print_root(topo *root){
    int i;

    for (i=0; i<10; i++) {
        print_topo_arr(i,root);
    }
}

int add(int x, int y)
{
    return (x+y);
}

Я могу вызывать add () без проблем из скрипта Python из gdb. Тем не менее, я получаю при звонке

Python Exception <class 'ctypes.ArgumentError'> argument 1: <type 'exceptions.TypeError'>: wrong type: 

    lib = cdll.LoadLibrary('./libshow.so')
    try1 = gdb.parse_and_eval ("i")
    print(type(try1)) # output is: <type 'gdb.Value'>
    print(try1.type.code) # output is: 8 TYPE_CODE_INT
    print('NEW Val of i={0}'.format(try1))
    lib.add.argtypes = [c_int, c_int]
    print lib.add(try1, 4) # works without issues

    #try to get root and call print_root()
    root_py = gdb.parse_and_eval ("root")
    print(type(root_py)) # output is: <type 'gdb.Value'>

    print(root_py.type.code) # output is: 14 TYPE_CODE_PTR
    lib.print_root.argtypes = [c_void_p] 
    print lib.print_root(root_py) # wrong type error here

Как я могу вызвать print_root, используя переменную gdb root?

Корень присутствует в GDB:

(gdb) p root
$1 = (topo *) 0x7fffffffd620

1 Ответ

0 голосов
/ 08 января 2019

То, что вы пытаетесь сделать, не будет работать: вы загружаете общий объект в процесс GDB (через модуль Python ctypes) и пытаетесь вызвать в нем функцию, используя указатель, полученный из GDB. Этот указатель действителен только в контексте подчиненного процесса, управляемого GDB. Сама GDB имеет совершенно другое адресное пространство, и указатель root в этом контексте не имеет смысла.

Вам нужно либо реализовать печать на Python, используя GDB API для адресации всех значений, либо загрузить все данные с помощью GDB API, создать из них значения ctypes и передать корень этой новой структуры данных вашему общий объект.

С другой стороны, если общий объект уже загружен в отлаживаемый процесс, вам следует вызвать функцию напрямую, используя GDB, и не использовать модуль ctypes.

...