1
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);
}

我可以从 gdb 的 Python 脚本调用 add() 而不会出现任何问题。但是,我在打电话时得到

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
4

1 回答 1

0

您尝试执行的操作将不起作用:您正在将共享对象加载到 GDB 进程中(通过 Pythonctypes模块),并尝试使用从 GDB 获得的指针调用其中的函数。该指针仅在 GDB 控制的下级进程的上下文中有效。GDB 本身有一个完全不同的地址空间,root在这种情况下指针是没有意义的。

您要么需要在 Python 中实现打印,使用 GDB API 来处理所有值,要么使用 GDB API 加载所有数据,ctypes从中创建值,并将新数据结构的根传递给您的共享对象。

另一方面,如果共享对象已经加载到被调试的进程中,你应该直接调用函数,使用 GDB,而不是使用ctypes模块。

于 2019-01-07T21:41:00.033 回答