android 如何分析应用的内存(十四)——jdb命令行

news2024/9/20 8:13:58

android 如何分析应用的内存(十四)

前面的系列文章介绍了android应用如何分析native内存。

接下来就是android应用如何分析java内存。同native一样,我们也希望能够看到
ART的堆和栈的情况,以及锁的情况,方法的本地变量,以及栈帧等

因此ART的内存分析就变成两个部分:

  1. 查看栈内容,如当前栈帧的本地变量等
  2. 查看堆内容,即对象分配情况

注意:在Android中,有几个特殊的堆内存,如存储dex文件的image heap和存储共有资源的zygote heap。他们属于Framework应该关心的内容,因此不在此系列中做介绍。

使用jdb进行查看

如何查看ART的栈情况呢?还是跟native一样,可以使用调试器进行查看。
java的调试器,称为jdb。

跟native的gdb和lldb的远程调试一样,jdb也分成两个部分:

  1. 一个放在Android设备端,这部分由ART负责
  2. 另一个放在pc端。这部分由jdb负责

这两个部分要进行通信,他们的通信协议叫做JDWP(java debug wire protocol)

因为ART属于标准java虚拟机之一,所以任何一个jdb即可调试Android的java应用。

app的准备

需要在编译的时候,加上-g选项。如果使用的是Android studio,则在编译器中配置如下
在这里插入图片描述

如果能自定义ROM,在编译的时候加上-g选项,则可以调试整个Frmawork代码,此处不涉及Framework因此,不过多介绍。

如何查看是否含有调试信息

使用javap命令,查看对应的xxx.class是否包含:LineNumberTable和LocalVariableTable

  • LineNumberTable 包含了源代码行号与字节码指令的对应关系,用于在调试时定位源代码行号。
  • LocalVariableTable 包含了方法中局部变量的信息,包括变量名称、数据类型和作用域范围等,用于在调试时查看变量的值。

举例截图如下:

 javap -v ./MainActivity.class | grep -E "LineNumberTable|LocalVariableTable" 

在这里插入图片描述

开始调试

  1. 安装应用,并运行adb jdwp其中adb jdwp用于查看满足jdwp协议的应有有哪些。列出的数字为进程pid

  2. 将本地调试的端口转发给Android应用,运行如下命令:

## 此处我们再次选择了5039端口用于jdwp的连接。(在gdb和lldb中也是使用了5039见:http://t.csdn.cn/QkkH3和http://t.csdn.cn/JWgcF)
adb forward tcp:5039 jdwp:6405
  1. 使用jdb连接上tcp:5039即可,如下:
jdb -attach localhost:5039

则输出如下,表示连接成功:

设置未捕获的java.lang.Throwable
设置延迟的未捕获的java.lang.Throwable
正在初始化jdb...
>

注意:在运行jdb之前,一定要先停止Android studio的运行,否则连接不上

注意:在本文中,井号开头的行表示注释.而右尖括号,表示键入的命令

挂起线程

## suspend [thread id(s)]    -- 挂起线程 (默认值: all)
> suspend 

查看有哪些线程

#threads [threadgroup]     -- 列出线程
>threads

如下图
在这里插入图片描述

打印堆栈

#where [<thread id> | all] -- 转储线程的堆栈
> where 0x4e81

输出如下:
在这里插入图片描述

同时将main线程选为了当前线程

打印本地变量

#locals  打印本地变量
>locals 

输出如下
在这里插入图片描述

移动栈帧

# up [n frames]             -- 上移线程的堆栈
# down [n frames]           -- 下移线程的堆栈

打印变量

# dump 变量名
> dump view.mTextClassifierHelper

输出如下
在这里插入图片描述

设置源代码位置

# 在jdb启动的时候,添加选项-sourcepath 路径1:路径2  即可添加源代码的路径
# 这样在调试AOSP代码的时候,会变得异常方便
# 还可以在jdb内部,使用use命令,修改源码路径
# 如下面使用jdb调试Android原生代码里面的MessageQueue

在这里插入图片描述

注意:在后面会有一个AMS的源码分析,将会非常频繁的使用本章介绍的jdb内容

列出源代码

# list [line number|method] -- 输出源代码
# 见上图

设置断点

# stop in <class id>.<method>[(argument_type,...)] 在方法处设置一个断点
# stop at <class id>:<line> 在某行设置一个断点
# clear <class id>.<method>[(argument_type,...)] 清除断点 
# clear <class id>:<line> 清除断点
# clear 列出断点
# stop 列出断点
>stop in com.example.test_malloc.MainActivity.click

出现如下的输出
在这里插入图片描述

触发断点如下

在这里插入图片描述

其中bci表示:字节码索引

单步

# step -- 执行当前行,可理解为单步进入
# step up -- 执行直到当前方法返回到它的调用者
# stepi -- 执行当前指令
# next -- 步进一行,可以理解为单步over
# cont -- 从断点处继续执行

在这里插入图片描述

修改值

# set <lvalue> = <expr> 赋值字段,变量,数组元素新值

跟踪线程的方法进入和退出

# trace [go] methods [thread]
                          -- 跟踪方法进入和退出。
                          -- 除非指定 'go', 否则挂起所有线程
# trace [go] method exit | exits [thread]
                          -- 跟踪当前方法的退出, 或者所有方法的退出
                          -- 除非指定 'go', 否则挂起所有线程
untrace [methods]         -- 停止跟踪方法进入和/或退出

trace method 命令在调试大型程序或复杂的方法调用关系时特别有用。它可以帮助你定位问题,理解代码的执行流程,并找到潜在的错误或异常。
在这里插入图片描述

捕获异常

# catch [uncaught|caught|all] <class id>|<class pattern>  当指定的异常发生时,暂停,如下图
# ignore [uncaught|caught|all] <class id>|<class pattern>  取消捕获某个异常

在这里插入图片描述

打印锁信息

# lock <expr> -- 打印某个对象上面的锁信息
# threadlocks [thread id] --打印线程上面的锁信息

在这里插入图片描述

即时调试

同native一样,即时调试分成两部分

  1. 程序一启动就等待调试器的加入
  2. 程序一崩溃就等待调试器的加入

程序一启动就等待调试器的加入

  1. 告诉系统,停在合适的位置

android 提供了一个命令行选项,告诉app,启动之后,等待debugger的接入。命令如下:

adb shell am set-debug-app -w com.example.test_malloc
说明:set-debug-app [-w] [--persistent] <PACKAGE>
      -w: 应用开始,就等待debugger接入
      --persistent: 这个值一直存在,不会因为应用消失之后被清除掉

设置成功之后,应用打开将会出现如下的情况
在这里插入图片描述

  1. 告诉jdb,连上app之后,不要马上运行而是挂起所有线程。
    在user目录下,创建配置文件。
  • Linux和Macos叫做.jdbrc
  • windows叫做jdb.ini
    保存如下内容:
suspend

可以看到如下的截图
在这里插入图片描述

  1. 设置好对应操作之后(如断点),再开始使用resume命令开始。
    如下图
    在这里插入图片描述

注意:除了通过上面的操作等待jdb的连接以外,还可以通过代码的方法。如线程的挂起API或者一个循环。因为较简单,不再做过多介绍

问题排查

问题1:如果jdb连上之后,app依然在运行
解决:漏掉了上面的第2步

问题2:app启动之后,没有出现wait for debugger
解决:需要先查看自己所在的系统是否支持第1步中的命令。使用如下命令查看

adb shell am -h

根据上面的输出,设置成对应的命令即可

程序一崩溃就等待调试器的加入

因为java程序崩溃时,会输出一段详细的调用栈。而不像native程序那样情况复杂。所以对于程序的崩溃很好分析。因此这部分内容无。

注意:Android应用中,可能因为复杂的线程和锁关系,导致ANR,从而引起的崩溃。此时通过Android的ANR文件,即可分析出相应的原因。这不属于本文要介绍的范围。后续有时间再写一个怎么分析ANR

至此,java的jdb大部分功能已经介绍完毕,它比AS提供的功能更加丰富,多出来的功能有:

  1. 单独操作某个具体的线程
  2. 修改源码位置
  3. 跟踪方法的进入和退出
  4. 主动捕获异常
  5. 打印锁信息

上面多出来的功能,有助于:分析大型Android项目,分析AOSP系统级代码,分析Android漏洞,分析多线程编程

在完成jdb的命令行介绍之前,先对jdb能观察的内存内容做一个小结:

  1. 查看堆帧
  2. 查看本地变量
  3. 查看锁
  4. 查看对象

本文完。

在进行java堆内容查看之前。先引入对应的UI界面,下一小节将介绍jdb如何搭配VScode使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/821236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatFile实现相关流程

文本上传构建向量库后台库的内容 调用上传文件接口先上传文件 存在疑问:暂时是把文件保存在tmp文件夹,定时清理,是否使用云存储 根据不同的文件类型选取不同的文件加载器加载文件内容 switch (file.mimetype) {case application/pdf:loader new PDFLoader(file.path)breakc…

爬虫教程1_Xpath 入门教程

Xpath 入门教程 在编写爬虫程序的过程中提取信息是非常重要的环节&#xff0c;但是有时使用正则表达式无法匹配到想要的信息&#xff0c;或者书写起来非常麻烦&#xff0c;此时就需要用另外一种数据解析方法&#xff0c;也就是本节要介绍的 Xpath 表达式。 Xpath表达式 XPath…

Linux(centos7)如何实现配置iscsi存储多路径 及DM-Multipath的配置文件概述

安装多路径软件&#xff08;系统默认安装&#xff09; #第一&#xff1a;安装多路径软件yum -y install device-mapper device-mapper-multipath#第二&#xff1a;在CentOS7中启用多路径模块&#xff0c;mpathconf命令及相关模块加载&#xff08;可以使用mpathconf -h查看用法&…

RocketMQ 在业务消息场景的优势详解

作者&#xff1a;隆基 01 消息场景 RocketMQ 5.0 是消息事件流一体的实时数据处理平台&#xff0c;是业务消息领域的事实标准&#xff0c;很多互联网公司在业务消息场景会使用 RocketMQ。 我们反复提到的“消息、业务消息”&#xff0c;指的是分布式应用解耦&#xff0c;是 R…

史上最全,性能测试-性能分析调优详细讲解,全网独一份...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能分析 前提&a…

中国AI大模型峰会“封神之作” - 开发者不容错过这场夏季盛会

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【AI模型系列】中国AI大模型峰会“封神之作”,不容错过的大模型机遇

目录 序言 峰会介绍 现场大咖 大语言模型 五大论坛 峰会特点 参与方式 方式一 方式二 序言 AI大模型是指具有数十亿个参数的深度学习模型。这些模型通常使用多层神经网络来处理大规模的数据集&#xff0c;以学习和提高它们的表现。 大模型通常需要大量的计算资源和…

three.js实现vr全景图

方法: 可以利用Threejs中的立方体或者球体实现全景图功能&#xff0c;把立方体或球体当成天空盒子&#xff0c;将无缝衔接的图片贴上&#xff0c;看起来就像在一个场景中&#xff0c;相机一般放置在中央。 three.js中文网 1、立方体实现 立方体6个面要贴上6个方向的图片&…

GFS 分布式文件系统

GFS 分布式文件系统 一.GlusterFS 概述 1.GlusterFS简介 &#xff08;1&#xff09;开源的分布式文件系统。 &#xff08;2&#xff09;由存储服务器、客户端以及NFS/Samba 存储网关&#xff08;可选&#xff0c;根据需要选择使用&#xff09;组成。 &#xff08;3&#x…

css3 hover border 流动效果

/* Hover 边线流动 */.hoverDrawLine {border: 0 !important;position: relative;border-radius: 5px;--border-color: #60daaa; } .hoverDrawLine::before, .hoverDrawLine::after {box-sizing: border-box;content: ;position: absolute;border: 2px solid transparent;borde…

常用的统计分析方法

统计方法是指有关收集、整理、分析和解释统计数据&#xff0c;并对其所反映的问题作出一定结论的方法。统计方法是一种从微观结构上来研究物质的宏观性质及其规律的独特的方法。统计方法是适用于所有学科领域的通用数据分析方法&#xff0c;只要有数据的地方就会用到统计方法。…

vue3.3-TinyMCE:TinyMCE富文本编辑器基础使用

一、TinyMCE官网 GitHub - tinymce/tinymce TinyMCE中文文档中文手册 二、官网介绍 TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有&#xff1a;UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 TinyMCE的优势&…

XML约束和解析

文章目录 概述使用场景语法dtd约束Schema约束解析DOM4j&#xff08;重点&#xff09; 概述 可扩展的标记性语言 使用场景 以前: 传输数据的媒介。 例如&#xff1a;微服务架构中&#xff0c;可以用xml文件进行多语言之间的的联系。 现在: 做配置文件 现在作为传输数据的媒介…

untiy代码打压缩包,可设置密码

1、简单介绍&#xff1a; 用的是一个插件SharpZipLib&#xff0c;在vs的Nuget下载&#xff0c;也可以去github下载https://github.com/icsharpcode/SharpZipLib 用这个最主要的是因为&#xff0c;这个不用请求windows的文件读写权限&#xff0c;关于这个权限我搞了好久&#…

基于SSM家电补贴一站式服务平台-计算机毕设 附源码12305

ssm家电补贴一站式服务平台 摘 要 近年来&#xff0c;随着移动互联网的快速发展&#xff0c;电子商务越来越受到网民们的欢迎&#xff0c;电子商务对国家经济的发展也起着越来越重要的作用。简单的流程、便捷可靠的支付方式、快捷畅通的物流快递、安全的信息保护都使得电子商务…

C++ 文件流操作详解

1. C I/O流 本文章有很多内容参考并借鉴了《C primer plus》 这本经典。这里先说明一下。 1. C I/O流 1.1. 数据流1.2. 控制台流1.3. 文件流 1.3.1. 什么是文件流&#xff1f;1.3.2. 缓冲区1.3.3. 文件流和控制流的关系1.3.4. 文件处理1.3.5. 简单的文件I/O1.3.6. 流状态检查和…

DNS WEB HTTP

DNS与域名 网络是基于 TCP/IP 协议进行通信和连接的。 每一台主机都有唯一的标识&#xff0c;用于区别在网络上成千上万个用户和计算机。即固定的IP地址&#xff08;32位二进制数转换成为十进制数——点分十进制&#xff09;。每一个与网络相连接的计算机和服务器都被指派一个…

xml的学习笔记

学习视频&#xff1a;093-尚硅谷-xml-什么是XML以及它的作用_哔哩哔哩_bilibili 目录 XML简介 XML的作用 XML语法 1.文档声明 2.xml注释 3.元素标签 4.xml属性 5.语法规则 1.所有xml元素都须有关闭标签(也就是闭合) 2.xml 标签对大小写敏感 3.xml必须正确的嵌套 4…

前端工程化最佳实践:项目结构、代码规范和文档管理

文章目录 前端工程化最佳实践项目结构设计与组织文档管理和注释规范国际化和本地化实践 前端工程化的未来发展趋势前端工程化领域的最新技术和工具WebAssembly 和前端性能优化可持续性和可访问性的趋势 总结前端工程化的关键知识点前端工程化对项目和团队的价值 前端工程化最佳…

玩转顺序表——【数据结构】

在C语言学习中&#xff0c;我们经常会遇见增删查改等一系列操作&#xff0c;而这些操作全都与线性表关联&#xff0c;没有线性表将会对这些操作完成的十分艰难&#xff01;那今天就让我们来了解一下顺序表如何增删查改&#xff01;&#xff01;&#xff01; 目录 1.线性表 2…