xcode 打印内存中的值

来源:互联网 发布:厦门天心软件 编辑:程序博客网 时间:2024/05/17 06:34

所以许多时候需要调试原始的C语言指针。Xcode的调试器LLDB提供了许多有趣的调试指令,下面来看看针对内存数据的读取和修改指令。

为了更好地演示,先写一段测试代码,如下:

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下方输入调试指令。

首先是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字节。

格式字符串则类似printf,x是16进制,f是浮点,d是十进制等等。

后面的地址变量也可以加表达式,如果有表达式的化需用单引号扩上内容。OK,有了上面的知识,我们可以做更多有意思的事情。

比如,查看后四个字节(也就是第二个int,注意表达式需用单引号扩住):

(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
Related Posts:
.NET(C#):字符编码(Encoding)和字节顺序标记(BOM)
.NET(C#):从文件中觉察编码
.NET(C#):灵活运用CryptoStream,加密不是必须用CryptoStreamMode.Write
WPF: 和有索引的PNG8图像发生致命冲突