2017-10-18 332 views
0

我想获得一个调用方法的参数值:如何简化存储器读取,如果我知道注册的名字

@selector(processEditingForTextStorage:edited:range:changeInLength:invalidatedRange:) 

我知道价值是如何存储:

  • $ RDX - 第一个参数
  • $ RCX - 第二个参数
  • $ R8 - 第三个参数(NSRange.location 8个字节)
  • $ R9 - 第三个参数(NSR ange.length 8个字节)
  • $ RBP + 0×10 - 第四个参数(NSUInteger 8个字节)
  • $ RBP +为0x18 - 第五个参数(NSRange.location 8个字节)
  • $ RBP + 0×20 - 第五个参数(NSRange.length 8个字节)

这是正确的吗?

第二个问题是有更简单的方法如何打印NSRange如果我知道整数存储在哪里?像 “PO *(NSUInteger *)($ RBP + 0×20)”

我得到错误的:需要

(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 
+0

“PO *(NSRange *)($ RBP +为0x18)” - 工程XCode中8.3.3的罚款。 Xcode 9测试版不喜欢它。 –

回答

1

有许多命令模仿的缩写GDB的命令。其中之一是x(用于“eXamine内存”),它是“内存读取”的缩写。您可以添加斜杠和格式说明符以使用特定的格式。例如x/xg格式化十六进制的8字节值。这个论点是一个表达地址来检查。

所以:

x/xg $rsp+0x10 
+0

作品!谢谢.. –

+0

调用参数的任何输入? –

+0

对不起,我不明白这个问题。你的意思是你对各种论点有正确的表达吗?是的,我相信这是正确的。 –

相关问题