我正在尝试获取调用方法的参数值:
@selector(processEditingForTextStorage:edited:range:changeInLength:invalidatedRange:)
我知道值是如何存储的:
- $rdx - 第一个参数
- $rcx - 第二个参数
- $r 8 - 第三个参数(NSRange.location 8bytes)
- $r 9 - 第三个参数 (NSRange.length 8bytes)
- $rbp+0x10 - 第四个参数(NSUInteger 8字节)
- $rbp+0x18 - 第五个参数(NSRange.location 8bytes)
- $rbp+0x20 - 第五个参数(NSRange.length 8bytes)
这是对的吗?
第二个问题,如果我知道整数的存储位置,是否有更简单的方法如何打印NSRange?类似"po *(NSUInteger *)($rbp+0x20)"
我为此收到错误:
(lldb) po *(NSRange *)($rbp+0x18)
error: incomplete type 'NSRange' (aka '_NSRange') where a complete type is required
forward declaration of '_NSRange'
必填
(lldb) memory read --size 8 --format x --count 1 ($rbp+0x20)
0x7fff5e348660: 0x0000000000000008
(lldb) memory read --size 8 --format x --count 1 ($rbp+0x18)
0x7fff5e348658: 0x000000000000000a
(lldb) memory read --size 8 --format x --count 1 ($rsp+0x8)
0x7fff5e348438: 0x000000000000000a
(lldb) memory read --size 8 --format x --count 1 ($rsp+0x10)
0x7fff5e348440: 0x0000000000000008
模仿GDB命令的各种命令都有缩写。其中之一是x
(表示"eXamine memory"),它是"内存读取"的缩写。您可以添加斜杠和格式说明符以使用特定格式。例如,x/xg
以十六进制格式设置 8 字节值的格式。参数是要检查的地址的表达式。
所以:
x/xg $rsp+0x10