【问题标题】:LLDB fails to read the memory adresses in the argv pointer-array, given as an argument in the main method in CLLDB 未能读取 argv 指针数组中的内存地址,作为 C 中 main 方法中的参数给出
【发布时间】:2021-02-15 20:25:19
【问题描述】:

我正在尝试重现 Jon Erickson 在“剥削的艺术”一书中给出的示例。该过程实际上非常简单:我想为我的程序提供命令行参数并使用 lldb 检查它们的内存地址。 C 类看起来像这样:

#include <stdio.h>

int main(int arg_count, char *arg_list[]) {
   // something
}

要使用 lldb 检查程序,我执行以下操作:

lldb ./a.out
(lldb) target create "./a.out"
Current executable set to '/Users/<path>/a.out' (x86_64).
(lldb) b main
Breakpoint 1: where = a.out`main + 22 at commandline.c:7:50, address = 0x0000000100003f06
(lldb) run first second

Process 4161 launched: '/Users/<path>/a.out' (x86_64)
Process 4161 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100003f06 a.out`main(arg_count=3, arg_list=0x00007ffeefbffa40) at commandline.c:7:50
Target 0: (a.out) stopped.

所以现在我希望接下来的三个内存字,在 arg_list 中存储的地址之后,指向通过命令行给出的字符串的地址。我知道第一个参数始终是一个字符串,其中包含我的 ./a.out 文件的路径。

(lldb) x/3xw arg_list
0x7ffeefbffa40: 0xefbffbb8 0x00007ffe 0xefbffbe9
(lldb) x/s 0xefbffbb8
error: failed to read memory from 0xefbffbb8.
(lldb) x/s 0x00007ffe
error: failed to read memory from 0x7ffe.

所以当我尝试检查内存时,它总是失败。有谁知道为什么?书中的例子使用了gdb调试器,效果很好。

【问题讨论】:

    标签: c lldb


    【解决方案1】:

    这本书看起来是为 32 位代码编写的,但您的系统是 64 位的。所以每个指针都是 64 位的。试试x/3xg arg_list,其中g 代表“giant”,gdb 的8 字节对象的大小字母。这应该给你三个以0x00007ffeefbffbb8 开头的64 位值,然后你可以x/s 0x00007ffeefbffbb8

    (您可能希望找到与您的系统更匹配的其他书籍,或者设置一个 32 位 Linux 虚拟机以跟随它。)

    【讨论】:

    • 谢谢!我正在尽力跟上。低级的东西对我来说是新的。你有关于这个主题的书籍推荐吗?
    • @P-Balk:抱歉,不是随随便便的。
    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2015-08-11
    • 2014-02-24
    • 1970-01-01
    • 2015-02-12
    • 2012-09-27
    • 1970-01-01
    相关资源
    最近更新 更多