LLDB获取argv的内存地址

LLDB get memory address of argv

我正在阅读 Jon Erickson 的 Hacking,在第 61 页上有一个使用 gdb 探索存储在 argv 中的字符串指针数组的示例。看起来当你在 gdb 中的 main 中断时,argc 的值和 argv 的地址是日志语句的一部分。例如,

Breakpoint 1, main(argc=2, argv=0xbffff894) at convert2.c:14

我正在尝试用 lldb 做同样的事情,虽然我可以使用 settings show target.run-args 来获取参数,但我真正想要的是 argv 的地址。这可能吗?

对于 ARM 和 x86_64,这很容易:在 main 停止,然后执行:

(lldb) memory read -t "char *" -c `(int) $arg1` $arg2

"memory read -t" 在功能上与 gdb 打印的“@”语法相同。只是说 "read the memory pointed to by the address passed to the command as an array of the type given by the -t argument"

lldb 定义了 "convenience variables" $arg1、$arg2 等,它们是用于将第一个、第二个等参数传递给函数的寄存器的别名。您必须在函数的开头就可以使它们具有正确的值,因为它们只是寄存器,它们将被重用。 32 位 Intel 不使用寄存器来传递参数,因此您必须从堆栈中获取它们。

此命令使用$arg2,它将保存argv变量作为要读取的内存地址。

关于这个命令的另一个有趣的事情是它使用 lldb 的反引号——这意味着将这个参数作为一个表达式来计算——从第一个 (argc) 参数读取计数。