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

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.mzph.cn/news/17535.shtml

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

相关文章

【驱动开发day8作业】

作业1&#xff1a; 应用层代码 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/ioctl.h>int main(int…

Docker安装es以及ik分词器

1、拉取镜像 docker pull elasticsearch:7.10.12、下载对应版本的ik分词、并将它们解压到ik文件夹下&#xff0c;如图 https://github.com/medcl/elasticsearch-analysis-ik/releases 3、在服务器上创建文件夹 mkdir /usr/elklog/elk/es mkdir /usr/elklog/elk/es/data mkdi…

Web3教程| 如何发现并追踪“聪明钱”?

在加密领域&#xff0c;聪明钱&#xff08;Smart Money&#xff09;是指拥有专业知识、对市场有深入了解以及具有信息优势的专业投资机构或个人投资者。 聪明钱一直以来都是加密市场中的关注焦点&#xff0c;因为这些实体通常可以获得普通交易者不易获得的信息和资源&#xff0…

【Web开发指南】如何用MyEclipse进行JavaScript开发?

由于MyEclipse中有高级语法高亮显示、智能内容辅助和准确验证等特性&#xff0c;进行JavaScript编码不再是一项繁琐的任务。 MyEclipse v2023.1.2离线版下载 JavaScript项目 在MyEclipse 2021及以后的版本中&#xff0c;大多数JavaScript支持都是开箱即用的JavaScript源代码…

【运维】hive 终端突然不能使用:Hive Schema version does not match metastore‘s schema version

文章目录 一. 问题描述二. 常规排查1. 元数据库2. hive-site.xml相关meta连接信息检查 三. 正解 一. 问题描述 进入hive终端&#xff0c;执行如下命令报错&#xff1a; hive> show tables; FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: …

冒泡排序算法

冒泡排序 算法说明与代码实现&#xff1a; 简单分析&#xff0c;外循环次数为数据len(arr)-1次&#xff0c;内循环为len(arr)-外循环次数 下面是使用Go语言实现冒泡排序算法的示例&#xff1a; package mainimport "fmt"func bubbleSort(arr []int) {n : len(arr…

【JavaEE】简单了解JVM

目录 一、JVM中的内存区域划分 二、JVM的类加载机制 1、类加载的触发时机 2、双亲委派模型 1.1、向上委派 1.2、向下委派 三、JVM中的垃圾回收机制&#xff08;GC&#xff09; 1、确认垃圾 1.1、引用计数&#xff08;Java实际上没有使用这个方案&#xff0c;但是Pytho…

【HttpRunnerManager】搭建接口自动化测试平台实战

目录 一、需要准备的知识点 二、我搭建的环境 三、搭建过程 四、访问链接 五、两个问题点 【整整200集】超超超详细的Python接口自动化测试进阶教程&#xff0c;真实模拟企业项目实战&#xff01;&#xff01; 一、需要准备的知识点 1. linux: 安装 python3、nginx 安装和…

emWin - BMP图片显示

BmpCvt.exe 用途 利用BMP图片&#xff0c;进行GUI显示&#xff1b;ICON等图标都是小BMP图片&#xff0c;核心是将BMP图片&#xff0c;转成emWin支持的方式&#xff0c;最终显示到TFT屏上 使用BmpCvt.exe工具&#xff0c;将各个图片转成相应的C文件. emWin有关的工具&#xff…

测试|Selenium介绍及环境搭建

测试|Selenium介绍及环境搭建 1.Selenium是什么 Selenium是用来做web网站 UI自动化的测试工具/测试框架。 我们这里说的Selenium是Selenium2.0&#xff0c;它由Selenium IDE&#xff0c;Webdriver, Selenium Grid组成。 Selenium IDE是用于Selenium测试的完成集成开发环境&…

云计算——云计算关键技术

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 一.云计算关键技术 1.虚拟化技术 2.分布式数据存储技术 &#xff08;1&…

天下风云出我辈,AI准独角兽实在智能获评“十大数字经济风云企业

时值盛夏&#xff0c;各地全力拼经济的氛围同样热火朝天。在浙江省经济强区余杭区这片创业热土上&#xff0c;人工智能助力数字经济建设正焕发出蓬勃生机。 7月28日&#xff0c;经专家评审、公开投票&#xff0c;由中共杭州市余杭区委组织部&#xff08;区委两新工委&#xff…

如何解决制造业数字化改造的障碍?

制造业的数字化转型可能是一个复杂且具有挑战性的过程&#xff0c;但解决以下障碍有助于为成功实施铺平道路&#xff1a; 抵制变革&#xff1a;数字化转型中最常见的挑战之一是员工的抵制&#xff0c;尤其是那些习惯传统方法的员工。为了克服这一问题&#xff0c;组织需要培养一…

JDBC-笔记

JDBC 1. JDBC介绍 JDBC&#xff08;Java Database Connectivity&#xff09;是一种用于连接和操作数据库的 Java API。 通过Java操作数据库的流程 第一步&#xff1a;编写Java代码 第二步&#xff1a;Java代码将SQL发送到MySQL服务端 第三步&#xff1a;MySQL服务端接收到SQ…

Spring中IOC容器常用的接口和具体的实现类

在Spring框架没有出现之前&#xff0c;在Java语言中&#xff0c;程序员们创建对象一般都是通过关键字new来完成&#xff0c;那时流行一句话“万物即可new&#xff0c;包括女朋友”。但是这种创建对象的方式维护成本很高&#xff0c;而且对于类之间的相互关联关系很不友好。鉴于…

【Web】web

dns与域名 网络是基于tcp/ip协议进行通信和连接的 应用层——传输层——网络层——数据链路层——物理层 每一定的台主机都有一个唯一且固定的地址标识——IP地址 IP地址的做用&#xff1a;1.区分用户和计算机&#xff1b;2.进行通信 IP地址由32位二进制数组成&#xff0c;…

读取application-dev.properties的中文乱码【bug】

读取application-dev.properties的中文编码【bug】 2023-7-30 22:37:46 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://blog.csdn.net/qq_51625007 禁止其他平台发布时删除以上此话 bug 读取application-dev.propert…

ATFX汇市月报:7月美联储坚定加息,8月成利率决议空档期

7月汇市行情回顾—— 7月份&#xff0c;美元指数下跌1.01%&#xff0c;收盘在101.88点&#xff0c; 欧元升值0.76%&#xff0c;收盘价1.0997点&#xff1b; 日元升值1.41%&#xff0c;收盘价142.27点&#xff1b; 英镑升值1.08%&#xff0c;收盘价1.2835点&#xff1b; 瑞…

TSINGSEE青犀视频AI算法引擎中台在渣土车智慧管控场景中的应用

一、行业背景 随着社会的发展和人们生活水平的不断进步&#xff0c;大家对环境卫生和空气质量的要求越来越重视。渣土车是建筑垃圾的运输主力&#xff0c;也存在行驶频繁、不合规、不合法的操作&#xff0c;可能对交通安全、环境卫生和城市形象造成影响。比如在施工工地&#x…

【C++】C/C++内存管理

1、C/C内存分布 【1】栈又叫堆栈 – 非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。 【2】内存映射段 – 是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存&#xff0c;做进程间通信 【3】堆 – 用于程序运…