【问题标题】:LLDB get memory address of argvLLDB 获取 argv 的内存地址
【发布时间】:2015-04-02 03:46:26
【问题描述】:

我正在阅读 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 的地址。这可能吗?

【问题讨论】:

  • 什么是'lldb'?对于 argv,地址作为第二个参数传入 main 中的程序。就用那个地址。例如 printf("%p" argv);

标签: c lldb argv


【解决方案1】:

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

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

“memory read -t”在功能上与 gdb 打印的“@”语法相同。只是说“读取传递给命令的地址指向的内存作为 -t 参数给定类型的数组”

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

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

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

【讨论】:

  • 非常感谢您的回复。只是想知道,如果您以 32 位模式构建会怎样?您如何知道在堆栈中的哪个位置查找 args?
  • MacOS X 使用标准 i386 ABI。如果您可以访问它,此技术说明包含所有这些详细信息以及更多信息:developer.apple.com/library/mac/technotes/tn2124/_index.html#//…
猜你喜欢
  • 2012-04-08
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多