我通过Jon Erickson的Hacking和第61页阅读了一个使用gdb来探索存储在{{1}中的指针到字符串数组的示例}。看起来当您在gdb中的argv
处中断时,main
的值和argc
的地址是日志语句的一部分。如,
argv
我试图用lldb做同样的事情,虽然我可以使用Breakpoint 1, main(argc=2, argv=0xbffff894) at convert2.c:14
获取args,但我真正想要的是settings show target.run-args
的地址。这可能吗?
答案 0 :(得分:1)
对于ARM和x86_64,它非常简单:在main停止,然后执行:
(lldb) memory read -t "char *" -c `(int) $arg1` $arg2
"记忆读取-t"在功能上与gdb print" @"相同句法。只是说"读取传递给命令的地址所指向的内存,作为-t参数给出的类型数组"
lldb定义"便利变量" $ arg1,$ arg2等,它们是用于将第一个,第二个等参数传递给函数的寄存器的别名。你必须在函数的开头才能获得正确的值,因为这些只是寄存器,它们将被重用。 32位英特尔不使用寄存器进行参数传递,因此您必须从堆栈中获取它们。
此命令使用$ arg2,它将argv变量保存为要读取的内存地址。
关于这个命令的另一个有趣的事情是它使用lldb的反引号 - 这意味着将此参数计算为表达式 - 从第一个(argc)参数中读取计数。