因此许多时候须要调试原始的C语言指针。Xcode的调试器LLDB提供了许多有趣的调试指令,下面来看看针对内存数据的读取和修改指令。html
为了更好地演示,先写一段测试代码,以下:app
int ints[] = {1, 2, 3}; double doubles[] = {1.1, 2.2, 3.3}; NSMutableData *data = [NSMutableData data]; [data appendBytes:ints length:sizeof(ints)]; [data appendBytes:doubles length:sizeof(doubles)]; char *bytes = (char *)[data bytes];
OK!而后在bytes变量后加入断点,运行,接着在Xcode下方输入调试指令。post
首先是LLDB的内存读取指令,这个其实能够用memory read
指令,可是这个指令写起来太繁琐了,幸亏LLDB继承了GDB的x
命令,能够快速的用简短的指令来完成多种内存读取操做。测试
好比显示bytes变量前三个int
的内容:编码
(lldb) x/3xw bytes
0x100107980: 0x00000001 0x00000002 0x00000003
这里x
表明用16进制来显示结果,w
表明Word(16位)大小。因此x/3xw
就是用16进制来显示bytes所指空间的3个16位的元素内容。对于x命令的详细格式能够参考,这篇文章,或者这篇。加密
常见的大小格式为:b
– byte 1字节,h
– half word 2字节,w
– word 4字节和最后的g
– giant word 8字节。spa
格式字符串则相似printf
,x
是16进制,f
是浮点,d
是十进制等等。指针
后面的地址变量也能够加表达式,若是有表达式的化需用单引号扩上内容。OK,有了上面的知识,咱们能够作更多有意思的事情。调试
好比,查看后四个字节(也就是第二个int
,注意表达式需用单引号扩住):code
(lldb) x/4xb 'bytes + 4'
0x100107984: 0x02 0x00 0x00 0x00
显示后面3个double
的内容:
(lldb) x/3fg 'bytes + 12'
0x10010798c: 1.1000000000000001
0x100107994: 2.2000000000000002
0x10010799c: 3.2999999999999998
或者显示所有36个字节:
(lldb) x/36xb bytes
0x100107980: 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00
0x100107988: 0x03 0x00 0x00 0x00 0x9a 0x99 0x99 0x99
0x100107990: 0x99 0x99 0xf1 0x3f 0x9a 0x99 0x99 0x99
0x100107998: 0x99 0x99 0x01 0x40 0x66 0x66 0x66 0x66
0x1001079a0: 0x66 0x66 0x0a 0x40
至于内存数据的写入,对应LLDB的memory write
命令,这里LLDB没有继承GDB的set
命令,因此只能直接用memory write
。注意能够经过-s参数来指定写入数据的大小,同时memory write
也支持写入多个值。
好比:把第二个字节设置为1:
(lldb) memory write 'bytes+1' 1 (lldb) x/4xb bytes 0x100107980: 0x01 0x01 0x00 0x00
能够看到,这里写入的1大小默认是字节。固然,也可使用-s参数指定一个大小,好比把第二个int设置成15:
(lldb) memory write -s 4 'bytes+4' 15 (lldb) x/12xb bytes 0x100107980: 0x01 0x01 0x00 0x00 0x15 0x00 0x00 0x00 0x100107988: 0x03 0x00 0x00 0x00
最后,多值写入,把bytes的前8字节写入4个2字节的数字,分别是1,2,3,4:
(lldb) memory write -s 2 'bytes' 1 2 3 4 (lldb) x/12xb bytes 0x100107980: 0x01 0x00 0x02 0x00 0x03 0x00 0x04 0x00 0x100107988: 0x03 0x00 0x00 0x00