反编译之崩溃定位

反编译之崩溃定位

  • 1.背景
  • 问题定位
    • 1.首先我们需要找崩溃所在的类和方法
    • 2.寻找崩溃的代码行数
      • 2.1借用反编译工具jadx查看反编译后的内容

1.背景

线上出了个崩溃(量挺大😭),但是apk是被混淆过的,一时摸不着头脑。崩溃信息如下:
崩溃信息
主要就是一个再常见不过的空指针的崩溃,
—java.lang.NullPointerException: Attempt to invoke virtual method ‘int java.lang.String.length()’ on a null object reference

若要定位代码所在位置,主要就是看com.jd.lib.mylive.e.d.s.onBindViewHolder(SourceFile:169)这一行,这就是我们崩溃的最终地方,但是路径被混淆了,而且代码行位置也看不出任何信息。这就让我们很头大了,如何才能找到最终的代码报错位置呢?

问题定位

这里我们分两步定位,第一步是找到崩溃的类和方法,第二是找到崩溃的代码行数。

1.首先我们需要找崩溃所在的类和方法

既然路径是被混淆的,首先我们需要根据混淆的mapping文件来还原出崩溃路径。
mapping文件一般的位置在

/app/build/outputs/mapping/release/mapping.txt

根据mapping文件我们很容找到路径对应的类为NewLiveCartSkuViewHolder:
根据混淆文件找到对应类
接下来我们需要分析一下崩溃的行数在哪一行。

2.寻找崩溃的代码行数

寻找崩溃的代码行数就没那么容易,也就是本文的重点-反编译。
因为报错信息(SourceFile:169)给到的行数并不是真实代码所在的行数,而是编译混淆后class文件里面崩溃的行数。因此,若要定位到行数,我们必须先将apk进行反编译,然后将反编译后的dex转成jar,最后分析jar文件来定位崩溃的具体位置。

2.1借用反编译工具jadx查看反编译后的内容

这里我们推荐一个很好用的反编译开源工具jadx,路径如下

https://github.com/skylot/jadx

用这个工具我们只需要将apk,倒入即可看到反编译后的结果,不过有的方法和类可能反编译不出来
jadx展示
下面是反编译后的结果
反编译后的结果
首先我们根据混淆的路径来找到我们想要定位的类和方法的大致位置,然后我们借助右下角的code或者simple那一栏来进行问题的定位,如果code里面的方法没被反编译出来,我们可以尝试在simple那一栏里面找,我这里就遇到了clode栏没被反编译出来的情况,因此我从simple栏找到了对应的方法,如下图
找到崩溃的方法
最后我们只需要找到169行,即可找到崩溃具体的位置,这里我们需要注意一下左边的行数,一定要点击左侧tab并确定行数切换到了从方法开始计算行数的模式,因为崩溃信息中(SourceFile:169)169所指的行数表示的是从崩溃所在的方法开始计数的行数,且必须是源文件中的行数。由于jadx显示的是反编译过后的文件代码(目的是方便我们阅读),且它已经帮我们标记好了反编译前的行号,因此我们只需要在onBindViewHolder中找到反编译前的行号就能找到崩溃的位置。
找到编译代码的行号
如上图,我们找到了行号在169的位置,发现该行做了判断一个字段的长度,如果price为空,那么就会发生nullPointException,正好对应了上面的崩溃信息String.length()的空指针崩溃。
最后们回归到源代码中找到了此行,
源码验证代码
问题得到验证。

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

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

相关文章

Python 计算三角形面积

"""计算三角形面积介绍:已知三角形边长分别为x、y、z,可以计算三角形半周长q,然后根据海伦公式计算三角形面积S三角形半周长:q (x y z) / 2三角形面积:S (q * (q-x) * (q-y) * (q-z)) ** 0.5知识点…

【产品应用】一体化步进伺服电机在检测电路板设备中的应用

随着科技的不断发展,一体化步进伺服电机在许多领域的应用越来越广泛。在检测电路板设备中,一体化步进伺服电机也发挥了至关重要的作用。本文将深入探讨一体化步进伺服电机在检测电路板设备中的应用。 01.设备简介 一体化步进伺服电机是一种将步进电机、驱…

【100天精通Python】Day67:Python可视化_Matplotlib 绘动画,2D、3D 动画 示例+代码

1 绘制2D动画(animation) Matplotlib是一个Python绘图库,它提供了丰富的绘图功能,包括绘制动画。要绘制动画,Matplotlib提供了FuncAnimation类,允许您创建基于函数的动画。下面是一个详细的Matplotlib动画示…

Nmap安装和使用详解

Nmap安装和使用详解 Nmap概述功能概述运行方式 Nmap安装官方文档参考:Nmap参数详解目标说明主机发现端口扫描Nmap将目标主机端口分成6种状态:Nmap产生结果是基于机器的响应报文,而这些主机可能是不可信任的,会产生一些迷惑或者误导…

【Linux】系统编程生产者消费者模型(C++)

目录 【1】生产消费模型 【1.1】为何要使用生产者消费者模型 【1.2】生产者消费者模型优点 【2】基于阻塞队列的生产消费者模型 【2.1】生产消费模型打印模型 【2.2】生产消费模型计算公式模型 【2.3】生产消费模型计算公式加保存任务模型 【2.3】生产消费模型多生产多…

速卖通新品如何推广,速卖通的推广渠道有哪些?——站斧浏览器

速卖通的推广渠道非常多样化,卖家可以根据自己的需求和预算选择合适的渠道来推广产品,提高曝光度和销售量,能够有效地提高产品的知名度和信任度。 速卖通新品如何推广? 速卖通上有数以百万计的卖家,每天都有大量的新…

位图(bitmap)原理以及实现

大家好,我是蓝胖子,我一直相信编程是一门实践性的技术,其中算法也不例外,初学者可能往往对它可望而不可及,觉得很难,学了又忘,忘其实是由于没有真正搞懂算法的应用场景,所以我准备出…

tp5连接多个数据库

一、如果你的主数据库配置文件都在config.php里 直接在config.php中中定义db2&#xff1a; 控制器中打印一下&#xff1a; <?php namespace app\index\controller; use think\Controller; use think\Db; use think\Request; class Index extends Controller {public fun…

千兆以太网传输层 UDP 协议原理与 FPGA 实现

文章目录 前言心得体会一、UDP 协议介绍二、UDP 数据报格式三、UDP 数据发送测试四、Verilog实现UDP 数据发送1、IP 头部检验 IPchecksun 的计算2、以太网报文的校验字段 FCS 的计算3、以太网报文发送模块实现五、以太网数据发送测试六、仿真代码七、仿真波形展示八、上板测试九…

一百八十二、大数据离线数仓——离线数仓从Kafka采集、最终把结果数据同步到ClickHouse的完整数仓流程(待续)

一、目的 经过6个月的奋斗&#xff0c;项目的离线数仓部分终于可以上线了&#xff0c;因此整理一下离线数仓的整个流程&#xff0c;既是大家提供一个案例经验&#xff0c;也是对自己近半年的工作进行一个总结。 二、项目背景 项目行业属于交通行业&#xff0c;因此数据具有很…

yo!这里是c++中的多态

前言 在学完继承之后&#xff0c;紧接着我们来认识多态&#xff0c;建议继承不太熟的先把继承部分的知识点搞熟&#xff0c;再来学习多态&#xff0c;否则会走火入魔&#xff0c;会混乱。因为多态是建立在继承的基础之上&#xff0c;而且多态中还存在与继承类似的概念&#xff…

如何使用jenkins、ant、selenium、testng搭建自动化测试框架

如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入&#xff0c;然后写一些测试脚本&#xff0c;这就是你所说的自动化测试&#xff0c;其实这个还不能算是真正的自动化测试&#xff0c;你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗&#xff…

Linux Ubuntu命令行快速配置C++开发环境

本文介绍在Linux操作系统的Ubuntu版本中&#xff0c;基于命令行&#xff0c;快速配置C 编辑、编译、运行的代码开发环境的简便方法。 在之前的文章Linux操作系统Ubuntu 22.04配置Visual Studio Code与C代码开发环境的方法(https://blog.csdn.net/zhebushibiaoshifu/article/det…

C++标准模板库——vector的使用及其模拟实现

目录 一. vector的介绍 1.vector的介绍 二.vector的使用 vector中常见接口的介绍vector的构造和析构函数vector的三种遍历方式 三.vector的模拟实现 vector的增删查改vector容器的容量变化和大小增减vector迭代器失效问题vector的小框架 构造函数和析构函数迭代器和operat…

基于Java的高校竞赛管理系统设计与实现(亮点:发起比赛、报名、审核、评委打分、获奖排名,可随意更换主题如蓝桥杯、ACM、王者荣耀、吃鸡等竞赛)

高校竞赛管理系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述4.2 系统角色 五、系统…

vue获取本地缓存并转为json格式

场景 要求获取当前登录用户id&#xff0c;传入后台去筛选属于该用户的数据&#xff1b; 当前登录用户信息一般会在本地存储中&#xff0c;有些则是在session中&#xff0c;此处只对本地存储做讨论&#xff1b; 本地缓存的用法 1 存储数据 localStorage.setltem(userId,"…

VS Code用AI写代码:Codeium插件

文章目录 Codeiumchat代码生成 Codeium Codeium是基于边缘计算的代码AI工具&#xff0c;提供超过70种编程语言的代码补全、对话、搜索等功能&#xff0c;相当霸道。 在插件栏搜索到Codeium之后&#xff0c;需要科学上网安装&#xff0c;安装完成后会提示注册。注册之后&#…

2023-9-22 滑雪

题目链接&#xff1a;滑雪 #include <cstring> #include <algorithm> #include <iostream>using namespace std;const int N 310;int n, m; int h[N][N]; int f[N][N];int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1};int dp(int x, int y) {int &v f…

MySQL数据库简介+库表管理操作+数据库用户管理

Mysql Part 1 一、数据库的基本概念1.1 使用数据库的必要性1.2 数据库基本概念1.2.1 数据&#xff08;Data&#xff09;1.2.2 表1.2.3 数据库1.2.4 数据库管理系统&#xff08;DBMS&#xff09;1.2.5 数据库系统 1.3 数据库的分类1.3.1 关系数据库 SQL1.3.2 非关系数据库 NoSQL…

看阿里测试工程师如何玩转postman+newman+jenkins接口自动化

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; postman用来做接口测试非常方便&#xff0c;接口较多时&#xff0c;则可以实现接口自动化 一、环境准备…