将用户定义的变量作为命令选项传递的语法

Syntax for passing a user-defined variable as a command option

对于 LLDB 版本 8,我正在尝试使用 memory read 命令转储函数 "fh" 的代码字节,使用变量来计算长度:

(lldb) expr unsigned $addr = (unsigned) fh
(lldb) expr unsigned $next_addr = (unsigned) fi
(lldb) expr unsigned $len = $next_addr - $addr
(lldb) p/x $addr
(unsigned int) $addr = 0x00000286
(lldb) p/x $next_addr
(unsigned int) $next_addr = 0x000002e4
(lldb) p/x $len
(unsigned int) $len = 0x0000005e

传递 $addr 作为地址被正确解释为长度的文字整数:

(lldb) memory read --size 1 --format x --count 0x5e $addr
0x00000286: 0xc8 0x47 0202 0x48 0xc9 0x42 ...

但将 $len 作为计数选项的参数传递失败:

(lldb) memory read --size 1 --format x --count $len $addr
error: invalid uint64_t string value: '$len'

断点语法也会发生这种情况,因此这可能是选项解析的一般限制:

(lldb) breakpoint set -l $len
error: invalid line number: $len.

我还尝试通过命令别名传递它,希望变量值的替换会更早发生,但结果相似:

(lldb) command alias foop memory read  --size 1 --format x --count %1 %2
(lldb) foop $len $addr
error: invalid uint64_t string value: '$len'

是否有其他语法来评估带变量的命令?我宁愿避免依赖 Python 支持,因为我使用的工具链不能可靠地提供它。

您可以通过查看选项的帮助来判断是对选项参数进行求值还是直接读入。例如,内存读取的参数是 <address-expression> 和:

(lldb) help address-expression
  <address-expression> -- An expression that resolves to an address.

但 count 只是类型 "count" - 这只是一个无符号整数。

但是... lldb 语法的另一点是,如果任何参数或选项值被 `` 包围,它首先作为表达式求值,如果结果是标量,则该值用于选项。

所以你想说:

memory read --size 1 --format x --count `$len` $addr