如何使用lldb查找函数的内存地址?

10

在LLDB中,我该如何获取函数名的内存地址并进行调试?类似于GDB中使用"info line func_name"命令获取函数名的内存地址,然后使用"set $PC=memory_address"命令来进行函数调试。谢谢!

1个回答

20
在lldb中,命令是“image lookup”。我认为“info func”和“image lookup”之间的示例最近已添加到lldb/gdb命令页面 - http://lldb.llvm.org/lldb-gdb.html
例如:
(lldb) im loo -n puts
1 match found in /usr/lib/system/libsystem_c.dylib:
        Address: libsystem_c.dylib[0x0000000000011d9a] (libsystem_c.dylib.__TEXT.__text + 69850)
        Summary: libsystem_c.dylib`puts
(lldb) 

虽然这里只显示了libsystem_c.dylib的偏移量(0x11d9a),但要查看实际的加载地址,您需要使用“-v”选项来查找映像,它将显示puts覆盖的地址范围。或者你可以在lldb中直接使用反引号符号。

(lldb) reg read pc
     rip = 0x0000000100000f2b  a.out`main + 11 at a.c:3
(lldb) reg write pc `(void(*)())puts`
(lldb) reg read pc
     rip = 0x00007fff99ce1d9a  libsystem_c.dylib`puts

好的,我需要将puts()进行类型转换,因为lldb在此处需要函数原型-这不是很方便,但如果是你自己的一个不需要的函数:

(lldb) reg write pc `main`
(lldb) reg read pc
     rip = 0x0000000100000f20  a.out`main at a.c:2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接