android 如何分析应用的内存(五)
接上文
lldb的工具篇的GUI部分。分成两部分:
- vscode 的LLDB
- as的LLDB
接下来是as的LLDB
as的LLDB
为了进行LLDB的调试,需要对as进行配置,事实上,每一个在AS中编辑的应用,都会有一个默认配置。
我们先从手动添加配置,开始,然后再过渡到默认配置。
手动添加debug配置。
分别点击 run-》edit configurations,如下图
在弹出框中,点击左上角的加号,选择Android APP,并命名如下图
因为本文章仅调试,所以并不需要在General标签页中,指定APP启动的各种选项。General中的参数说明,见下一小节。
需要说明的是,各种debug type:
Java Only:表示只对Java进行调试
Native Only:表示只对Native进行调试,As默认使用LLDB
Detect Automaticlly:自动检测,根据你使用的语言,自动选择调试工具
Dual:表示两个调试工具都使用。
接下来就是进行debug了。Android的debug有两种方式。图标如下:
图标1:as重新编译并运行,然后开始调试(因为本文章,仅仅涉及调试,所以不使用它)
图标2:as将调试器,attach到一个应用程序上
点击第二个图标,弹出选项框,选择自己配置的debug选项,这里提供的例子是:piano-lldb
然后,就会进入调试界面。
注意:部分AS试程序可能出现下面的情况
- 点击图标一,出现没有可以调试的程序
- 点击图标二,依然没有可以调试的程序,但是有Android 手机。
解决办法:File-》invalidate caches 然后在弹出框中,点击invalidate and restart 即可。
因为AS的调试,大家都比较熟悉,因此,直接贴一张总图
as的默认配置选项
本部分仅仅对,上一小节中,提及的默认配置,做介绍性说明。
为何会有这部分说明?
因为,对于Framework 工程师而言,AS提供的功能有限,可能并不适用,所以可以使用jetbrain的相关IDE,如Intellig IDEA
和CLion。介绍AS的默认配置,可以帮组Framework工程师,理解jetbrain的配置选项。
依然按照,run-》Edit configuration,打开如下界面。
deploy的四种方式:
- default apk:即默认就是安装apk
- apk from app bundle:会将apks从apk中抽取出来,然后再安装
- custom artifact:只得是,可以自定义部署的部件,不仅仅是apk,还可以是其他的jar包,aar等等
对于debugger标签页,见下图
as LLDB的及时调试技术
方法同gdb里面介绍的一样,可参见gdb篇章,
android 如何分析应用的内存(二)
as LLDB加载corefile
非常之不幸,Android studio提供的配置项,并没有提供对core file的支持。但是我们可以使用它的替代产品,jetbrains的Clion。它的配置,同上面介绍的几乎完全一样。因此不再过多赘述。
至此,所有关于native内存的前三部分介绍完成,如下:
native部分
寄存器内容是什么。如pc指向何处,sp指向何处指定地址内容是什么。如变量a对应的内容线程堆栈内容是什么。如主线程的堆栈,UI线程的堆栈- 堆区的对象有哪些。
java部分
- 线程堆栈有什么内容。
- 堆中对象分配情况
与其说是native的内存,倒不如说是native的调试。但,为了内存知识的丰富性和整体性,将这部分也划入Android的内存部分。
关于Android代码如何调试,如怎样调试AOSP的原生代码,怎么分析各种各样的崩溃,或许后面会有时间单独一个专题。
接下来就是native内存部分的重点章节了。不同的分析技术,可能需要不同的代码。
即将介绍的部分有:
- 手动实现,new和delete,以及malloc和freee,并统计内存分配情况
- 使用malloc hook
- 使用Malloc和libc回调,搭配使用DDMS
- 使用AddressSanitizer
- 使用HWASan/Asan工具,查找内存错误
- 使用perfetto工具,他也可以分析java部分
题外话:就个人使用情况而言,并不是很推荐AS的LLDB,更推荐使用VScode的LLDB。而使用gdb的时候,我也不推荐使用命令行,更推荐使用Clion。它有非常快速且有好的UI界面。