【问题标题】:How to find a function's memory address with lldb?如何使用 lldb 查找函数的内存地址?
【发布时间】:2012-08-13 18:15:07
【问题描述】:

在GDB中,我可以使用“info line func_name”得到func_name的内存地址,然后使用“set $PC=memory_address”开始调试这个函数。我如何在 lldb 中做同样的事情?提前致谢!

【问题讨论】:

    标签: gdb lldb


    【解决方案1】:

    lldb 中的命令是“图像查找”。我认为最近将“信息功能”“图像查找”的示例添加到 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”选项进行图像查找,该选项将显示放​​置的地址范围盖子。或者您可以更直接地使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-13
      • 2016-01-10
      • 2017-02-24
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      相关资源
      最近更新 更多