lldb 内存读取

所以许多时候需要调试原始的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字节。

格式字符串则类似printfx是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:

  1. .NET(C#):字符编码(Encoding)和字节顺序标记(BOM)
  2. .NET(C#):从文件中觉察编码
  3. .NET(C#):灵活运用CryptoStream,加密不是必须用CryptoStreamMode.Write
  4. WPF: 和有索引的PNG8图像发生致命冲突

转载于:https://my.oschina.net/u/2528742/blog/691688

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值