Android Studio中使用LLDB进行内存调试

C++程序开发过程中,内存往往是一个经常需要关心的话题,特别是在进行Debug时,能正确的找出内存中的异常数据更是非常有用。

如对一个void*类型的数据void* data,在很多IDE中都可以对其直接进行内存查的,如下图是在Xcode中查看的结果:

Android Studio中使用LLDB进行内存调试

从图中可以很清楚地看出data所指向内存的数据,具体方法就是xcode中,选中变量,直接右键选择查看内存即可。

但是在Android studio中问题就变得相对复杂了,AS并没有像xcode一样具有非常好的集成环境,因此需要使用一些更为原始的手段,可能会有一个插件,因为对AS并不熟悉,所以也没找到好的plugin。所以平时工作时一般会选择使用LLDB的命令来进行内存探查。

Android Studio中使用LLDB进行内存调试

如图中所示,在debug时,怀疑data的数据是有问题的,需要确切知道data的值是不是我们预期的值,最好的方式是像xcode的提供的memory viewer来进行查看,但是AS中并没有找到相关的view,右键也没有相关提示。

一切回到最原始的做法,没有GUI帮助,那还是使用命令行吧,毕竟AS的断点调试还是基于LLDB的,所以使用LLDB的命令应该能搞定一切(这里比较好的一点是LLDB的命令和GDB的命令差不多)。

启动进程,当断点到当前行后,可以在debug view进行中操作了,如下图所示:

Android Studio中使用LLDB进行内存调试

AS的debug view提供了两种模式,Variables和LLDB,大部分情况下,直接在Variables模式下足以,但当需要更加细致的操作时,还是需要回归到最原始的命令行模式(LLDB)。

1. frame variable

切到命令行后,也无需担心,依然可以快速查看所有的变量信息,并且得到的信息可能反而更加直观,如

Android Studio中使用LLDB进行内存调试

2. 打印变量

除了查看所有变量之外,还是逐个查看单个变量,使用p(print)命令,如:

Android Studio中使用LLDB进行内存调试

3. 调试内存

前面两个操作只是LLDB命令的简单用法,并非本文的重点,本文的重点debug内存,现在回到之前的问题,我们需要知道data中的值是否正确,当然这很多方法,比如输出log等。这里我使用lldb提供的memory命令。

memory read --size 4 --format x --count 4 0xbffff3c0
Android Studio中使用LLDB进行内存调试

memory命令读取的地址可以是当前frame的变量,也可以是一个地址,如上图所示,两种方式得到的结果是相同的。

其中:

  • --size 指定的是每个值所占用字节数,可以是1,2,4,8等等,与要显示的数据类型要匹配
  • --format 显示类型 x表16进制,也可以是f(float), d(int), u(unsigned int)等。
  • --count 要显示的值的个数
  • 0xbffff3c0 是要调试的内存地址。

上面指令也可以简化成

emory read -s4 -fx -c4 data

结果如下:

Android Studio中使用LLDB进行内存调试

如果查看每个byte的数据,还可以更加简化一下指令,其中最多只能显示1024个字节的数据,如果需要显示更多,需要自行做偏移,如

memory read -s1 -c128 data
Android Studio中使用LLDB进行内存调试

本文的核心内容到此基本就结束了,除此之外,LLDB还提供了一个parray命令来输出数组类型的内容,如下图所示

Android Studio中使用LLDB进行内存调试

注意,使用parray时,必然将void* 强制转换成具体类型。

本文只是简单使用了lldb的部分特性,其它更多内容需要各位自己查找LLDB的相关文档,希望能帮助各位正在使用Android studio进行c/C++开发的同学,希望至少能起到抛砖引玉的效果吧。

Android Studio中使用LLDB进行内存调试


分享到:


相關文章: