Android NDK JNI 开发native层崩溃日志栈分析

news2024/10/7 8:25:41

问题:

在Android的JNI开发中,你是否看到如下一堆崩溃日志,不知如何下手分析问题,崩溃在哪一行?

11-16 17:20:44.844 23077 23077 W test_jni_h: jni_preload: Starting for process=ln
11-16 17:20:44.844 23077 23077 W test_jni_h: jni_preload: =============================== Call doJniMain()
11-16 17:20:44.844 23077 23077 W test_jni_h: doJniMain: Starting for process=ln, isHook=CONFIG:VPN:SE_MAIN:SIG:PT1:AES, is_preload=1
11-16 17:20:44.845 23077 23077 F libc    : Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 23077 (ln), pid 23077 (ln)
11-16 17:20:44.857  2599  5691 I MiuiNetworkPolicy: bandwidth: 15 KB/s, Max bandwidth: 1846 KB/s

....
11-16 17:20:44.892 23080 23080 I crash_dump64: obtaining output fd from tombstoned, type: kDebuggerdTombstoneProto
11-16 17:20:44.893  1120  1120 I tombstoned: received crash request for pid 23077
11-16 17:20:44.895 23080 23080 I crash_dump64: performing dump of process 23077 (target tid = 23077)
11-16 17:20:44.902 23081 23081 E .android.camera: Not starting debugger since process cannot load the jdwp agent.

....
11-16 17:20:45.103 23080 23080 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
11-16 17:20:45.103 23080 23080 F DEBUG   : Build fingerprint: 'Xiaomi/cupid/cupid:13/TKQ1.220807.001/V14.0.8.0.TLCCNXM:user/release-keys'
11-16 17:20:45.103 23080 23080 F DEBUG   : Revision: '0'
11-16 17:20:45.103 23080 23080 F DEBUG   : ABI: 'arm64'
11-16 17:20:45.103 23080 23080 F DEBUG   : Timestamp: 2023-11-16 17:20:44.913140070+0800
11-16 17:20:45.103 23080 23080 F DEBUG   : Process uptime: 2s
11-16 17:20:45.103 23080 23080 F DEBUG   : ZygotePid: 108306913
11-16 17:20:45.103 23080 23080 F DEBUG   : Cmdline: ln -s /data/app/~~yJTBwDTAb9UQbvJ96gDx8g==/com.test.zwwx-ZA2ckl4hnybAXhmaCpjn7Q==/lib/arm64/libtbs.libtencentpos.so.so /data/user/0/com.test.zwwx/app_tbs_64/core_static_tbs_tmp/libtencentpos.so
11-16 17:20:45.103 23080 23080 F DEBUG   : pid: 23077, tid: 23077, name: ln  >>> ln <<<
11-16 17:20:45.103 23080 23080 F DEBUG   : uid: 10398
11-16 17:20:45.103 23080 23080 F DEBUG   : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
11-16 17:20:45.103 23080 23080 F DEBUG   : pac_enabled_keys: 000000000000000f (PR_PAC_APIAKEY, PR_PAC_APIBKEY, PR_PAC_APDAKEY, PR_PAC_APDBKEY)
11-16 17:20:45.103 23080 23080 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0000000000000000
11-16 17:20:45.103 23080 23080 F DEBUG   : Cause: null pointer dereference
11-16 17:20:45.103 23080 23080 F DEBUG   :     x0  0000000000000000  x1  0000000000000073  x2  0000000000000000  x3  0000000000000000
11-16 17:20:45.103 23080 23080 F DEBUG   :     x4  00000000c0300c03  x5  0000000040100401  x6  000000000000003c  x7  62682e6d6f632f30
11-16 17:20:45.103 23080 23080 F DEBUG   :     x8  b400007170487fb2  x9  0000000000000001  x10 000000003a534947  x11 000000003a534947
11-16 17:20:45.103 23080 23080 F DEBUG   :     x12 000000003a534947  x13 0000000000000050  x14 000000004749533a  x15 000000003a565000
11-16 17:20:45.103 23080 23080 F DEBUG   :     x16 00000071f0d81ab0  x17 00000071f0d00200  x18 0000007225754000  x19 0000007204c0c2f8
11-16 17:20:45.103 23080 23080 F DEBUG   :     x20 0000007204d0e000  x21 0000007204cd2000  x22 0000007fd4689e8b  x23 0000007204d0e000
11-16 17:20:45.104 23080 23080 F DEBUG   :     x24 0000007fd4689e8b  x25 0000007204cd0000  x26 0000007fd4689f10  x27 0000007fd4689e40
11-16 17:20:45.104 23080 23080 F DEBUG   :     x28 0000007204c02000  x29 0000007fd4686090
11-16 17:20:45.104 23080 23080 F DEBUG   :     lr  00000071f0d509ec  sp  0000007fd4686090  pc  00000071f0d00270  pst 0000000040001000
11-16 17:20:45.104 23080 23080 F DEBUG   : backtrace:
11-16 17:20:45.104 23080 23080 F DEBUG   :       #00 pc 0000000000086270  /apex/com.android.runtime/lib64/bionic/libc.so (__strchr_aarch64+112) (BuildId: 607a29162b319a50c57abd2b2141d335)
11-16 17:20:45.104 23080 23080 F DEBUG   :       #01 pc 00000000000d69e8  /apex/com.android.runtime/lib64/bionic/libc.so (strstr+28) (BuildId: 607a29162b319a50c57abd2b2141d335)
11-16 17:20:45.104 23080 23080 F DEBUG   :       #02 pc 0000000000086ffc  /data/app/~~yJTBwDTAb9UQbvJ96gDx8g==/com.test.zwwx-ZA2ckl4hnybAXhmaCpjn7Q==/lib/arm64/libtest64.so
11-16 17:20:45.104 23080 23080 F DEBUG   :       #03 pc 0000000000074f28  /data/app/~~yJTBwDTAb9UQbvJ96gDx8g==/com.test.zwwx-ZA2ckl4hnybAXhmaCpjn7Q==/lib/arm64/libtest64.so
11-16 17:20:45.104 23080 23080 F DEBUG   :       #04 pc 0000000000054078  /data/app/~~yJTBwDTAb9UQbvJ96gDx8g==/com.test.zwwx-ZA2ckl4hnybAXhmaCpjn7Q==/lib/arm64/libtest64.so
11-16 17:20:45.104 23080 23080 F DEBUG   :       #05 pc 0000000000054a3c  /data/app/~~yJTBwDTAb9UQbvJ96gDx8g==/com.test.zwwx-ZA2ckl4hnybAXhmaCpjn7Q==/lib/arm64/libtest64.so
11-16 17:20:45.104 23080 23080 F DEBUG   :       #06 pc 0000000000052b28  /apex/com.android.runtime/bin/linker64 (__dl__ZN6soinfo17call_constructorsEv+752) (BuildId: 92b6d7d677c276f6b53d86e83a2c0bc0)
11-16 17:20:45.104 23080 23080 F DEBUG   :       #07 pc 00000000000528d0  /apex/com.android.runtime/bin/linker64 (__dl__ZN6soinfo17call_constructorsEv+152) (BuildId: 92b6d7d677c276f6b53d86e83a2c0bc0)
11-16 17:20:45.104 23080 23080 F DEBUG   :       #08 pc 00000000000b7a08  /apex/com.android.runtime/bin/linker64 (__dl__ZL29__linker_init_post_relocationR19KernelArgumentBlockR6soinfo+4204) (BuildId: 92b6d7d677c276f6b53d86e83a2c0bc0)
11-16 17:20:45.104 23080 23080 F DEBUG   :       #09 pc 00000000000b6944  /apex/com.android.runtime/bin/linker64 (__dl___linker_init+832) (BuildId: 92b6d7d677c276f6b53d86e83a2c0bc0)
11-16 17:20:45.104 23080 23080 F DEBUG   :       #10 pc 00000000000554c8  /apex/com.android.runtime/bin/linker64 (__dl__start+8) (BuildId: 92b6d7d677c276f6b53d86e83a2c0bc0)
11-16 17:20:45.104 22354 22584 W weworklocal: [22354:22584:1116/17:20:45.104:W:(tcp_connection.cpp:132)] GapTcpConnection(0): Performing destruction reset
11-16 17:20:45.104 22354 22584 I pjsip:  : [, , 0]:fd_list_del:173

.....
11-16 17:20:45.154 23081 23118 D CAM_HybridZoomingSystem: [1.0, 2.0]
11-16 17:20:45.157  2599  6270 W NativeCrashListener: Couldn't find ProcessRecord for pid 23077

别着急,请看本文即可轻松拿捏Native层的崩溃栈。

准本分析

实际上android已经为开发者提供了崩溃栈的分析工具: ndk-stack。

准备一下三个东西:

1. 准备分析工具:

ndk工具,由于使用ndk开发jni并编译,一定有这个工具了。

2. 需要分析的so文件:

在你编译项目的输出目录下,比如Android.mk编译出来的目录为:

工程根目录下的...xxx/xxx/Demo/obj/local/, 里面有armeabi-v7a和arm64-v8a等等子目录,Cmake编译的在 build output(自己研究下)。

在...xxx/xxx/Demo/obj/local/当前目录下执行也可,也可以直接拷贝出来在某个自己的目录下。

3. 崩溃栈日志:

把adb logcat 抓出来的本亏日志文件(如果太多,可以直接去一个完整的崩溃栈)拷贝到分析目录下。 注:不在分析目录下分析就放在任意地方,能找到就行。

分析问题

下面以分析arm64-v8a目录下的

在...xxx/xxx/Demo/obj/local/打开Terminal终端,执行命令:

 ndk-stack -sym arm64-v8a/ -dump arm64-v8a/hook_preload_fatal_log.txt

执行命令
		user@hulk-shell_test-shell_test_vpn:~/projects/shell_test/shell_test_vpn/encap/shell_test/mam/ShellTest/obj/local$
		user@hulk-shell_test-shell_test_vpn:~/projects/shell_test/shell_test_vpn/encap/shell_test/mam/ShellTest/obj/local$ ndk-stack -sym arm64-v8a/ -dump arm64-v8a/hook_preload_fatal_log.txt
				********** Crash dump: **********
		Build fingerprint: 'Xiaomi/cupid/cupid:13/TKQ1.220807.001/V14.0.8.0.TLCCNXM:user/release-keys'
		pid: 23077, tid: 23077, name: ln  >>> ln <<<
				signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0000000000000000
		Stack frame #00 pc 0000000000086270  /apex/com.android.runtime/lib64/bionic/libc.so (__strchr_aarch64+112) (BuildId: 607a29162b319a50c57abd2b2141d335)
		Stack frame #01 pc 00000000000d69e8  /apex/com.android.runtime/lib64/bionic/libc.so (strstr+28) (BuildId: 607a29162b319a50c57abd2b2141d335)
		Stack frame #02 pc 0000000000086ffc  /data/app/~~yJTBwDTAb9UQbvJ96gDx8g==/com.test.zwwx-ZA2ckl4hnybAXhmaCpjn7Q==/lib/arm64/libtest64.so: Routine is_shell_test at /home/user/projects/shell_test/shell_test_vpn/encap/shell_test/mam/ShellTest/jni/./enc_dec.c:8701
		Stack frame #03 pc 0000000000074f28  /data/app/~~yJTBwDTAb9UQbvJ96gDx8g==/com.test.zwwx-ZA2ckl4hnybAXhmaCpjn7Q==/lib/arm64/libtest64.so: Routine initPackageName(char*) at /home/user/projects/shell_test/shell_test_vpn/encap/shell_test/mam/ShellTest/jni/./app-context.cc:231
		Stack frame #04 pc 0000000000054078  /data/app/~~yJTBwDTAb9UQbvJ96gDx8g==/com.test.zwwx-ZA2ckl4hnybAXhmaCpjn7Q==/lib/arm64/libtest64.so: Routine doJniMainExt(char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, char*, int) at /home/user/projects/shell_test/shell_test_vpn/encap/shell_encap/mam/ShellTest/jni/./Java_com_hulk_test_jni_h.cc:400
		Stack frame #05 pc 0000000000054a3c  /data/app/~~yJTBwDTAb9UQbvJ96gDx8g==/com.test.zwwx-ZA2ckl4hnybAXhmaCpjn7Q==/lib/arm64/libtest64.so: Routine jni_preload() at /home/user/projects/shell_test/shell_test_vpn/encap/shell_test/mam/ShellTest/jni/./Java_com_hulk_test_jni_h.cc:633 (discriminator 12)
		Stack frame #06 pc 0000000000052b28  /apex/com.android.runtime/bin/linker64 (__dl__ZN6soinfo17call_constructorsEv+752) (BuildId: 92b6d7d677c276f6b53d86e83a2c0bc0)
		Stack frame #07 pc 00000000000528d0  /apex/com.android.runtime/bin/linker64 (__dl__ZN6soinfo17call_constructorsEv+152) (BuildId: 92b6d7d677c276f6b53d86e83a2c0bc0)
		Stack frame #08 pc 00000000000b7a08  /apex/com.android.runtime/bin/linker64 (__dl__ZL29__linker_init_post_relocationR19KernelArgumentBlockR6soinfo+4204) (BuildId: 92b6d7d677c276f6b53d86e83a2c0bc0)
		Stack frame #09 pc 00000000000b6944  /apex/com.android.runtime/bin/linker64 (__dl___linker_init+832) (BuildId: 92b6d7d677c276f6b53d86e83a2c0bc0)
		Stack frame #10 pc 00000000000554c8  /apex/com.android.runtime/bin/linker64 (__dl__start+8) (BuildId: 92b6d7d677c276f6b53d86e83a2c0bc0)
		user@hulk-shell_test-shell_test_vpn:~/projects/shell_test/shell_test_vpn/encap/shell_test/mam/ShellTest/obj/local$

结论

看上面的执行结果,函数调用关系如下:

Routine jni_preload() > Routine doJniMainExt() > initPackageName(char*) > is_shell_test() 函数,位于 enc_dec.c:8701 enc_dec文件的8701行么,如下:

Routine is_shell_test at /home/user/projects/shell_test/shell_test_vpn/encap/shell_test/mam/ShellTest/jni/./enc_dec.c:8701

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

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

相关文章

AWD比赛中的一些防护思路技巧

## 思路1&#xff1a; 1、改服务器密码 &#xff08;1&#xff09;linux&#xff1a;passwd &#xff08;2&#xff09;如果是root删除可登录用户&#xff1a;cat /etc/passwd | grep bash userdel -r 用户名 &#xff08;3&#xff09;mysql&#xff1a;update mysql.user set…

基于SpringBoot+Vue的二手物品交易平台

基于SpringBootVue的二手物品交易平台的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 详情 管理员界面 摘要 本项目是基于Spring Boot 和 Vue 技术栈构建…

latex简单使用

​​文章目录 公式详解 普通公式公式居中带标号公式上标下标根号分式括号运算符列表 无序列表有序列表插入图片 单图多图排版表格脚注与定理子标题目录与附录 目录附录参考文献字体设置 字体样式 加粗斜体字母大写等线自定义字体字体大小 第一种设置第二种设置第三种设置 页面…

系列六、JVM的内存结构【栈】

一、产生背景 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的&#xff0c;不同平台的CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 二、概述 栈也叫栈内存&#xff0c;主管Java程序的运行&#xff0c;是在线程创建时创建&#xff0c;线程销毁时销毁&…

【PyQt小知识 - 4】:QGroupBox分组框控件 - 边框和标题设置

QGroupBox QGroupBox 是 PyQt 中的一个小部件&#xff0c;用于创建一个带有标题的组框。 可以使用 QGroupBox 将相关控件分组并添加一个标题。 以下是一个使用 QGroupBox 的示例代码&#xff08;示例一&#xff09;&#xff1a; from PyQt5.QtWidgets import * import sysa…

ERP管理系统:企业升级的秘密武器

ERP管理系统&#xff1a;企业升级的秘密武器 在当今快速发展的商业环境中&#xff0c;企业要想保持竞争力&#xff0c;就必须不断进行自我升级。而在这个过程中&#xff0c;ERP管理系统以其强大的功能和优化流程的能力&#xff0c;逐渐成为了企业升级的秘密武器。 一、ERP管理…

Unity开发之C#基础-异常处理(Try Catch)

前言 其实本来这章应该将栈和队列的 但是后来想想 栈和队列在实际应用很少跟多的是大家了解一下栈和队列的基本常识比如先进先出的是谁后进先出的是谁这种 csdn有很多介绍栈和队列的文章 我觉得都比我理解深刻所以大家可以去搜索参照一下 今天我们继续往下讲解 如何自己主动的…

【Java 进阶篇】JQuery 遍历 —— For 循环的奇妙之旅

在前端开发的世界里&#xff0c;遍历是一个常见而重要的操作。它让我们能够浏览并操纵文档中的元素&#xff0c;为用户提供更加丰富和交互性的体验。而在 JQuery 中&#xff0c;遍历的方式多种多样&#xff0c;其中 for 循环是一种简单而灵活的选择。在本篇博客中&#xff0c;我…

11-Vue基础之组件通信(二)

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Freeswitch中mod_commonds

mod_commands Table of Contents (click to expand) 0. About1. Usage 1.1 CLI1.2 API/Event Interfaces1.3 Scripting Interfaces1.4 From the Dialplan2. Format of returned data3. Core Commands 3.1 acl  3.1.1 Syntax3.1.2 Examples3.2 alias 3.2.1 Syntax3.2.2…

作为HR是看重学历还是工作经验?

作为HR是看重学历还是工作经验&#xff1f; 这个没有绝对的统一的看法&#xff0c;如果我是HR我更看重工作经验&#xff0c;如果是中小企业&#xff0c;对于人才嘛&#xff0c;那肯定是要到岗就能干活的&#xff0c;底子好不好先不说&#xff0c;关键是要能干活的。 不过近些…

【算法基础】分解质因数

文章目录 什么是分解质因数具体案例输入格式输出格式数据范围 原理讲解原始方法转换思路利用试除法判定质数的思路为什么不需要单独判断是否为质数 什么是分解质因数 分解质因数是指将一个合数用质因数相乘的形式表示出来&#xff0c;即将一个合数分解为若干个质数的乘积。其中…

人工智能如何重塑体验为先的汽车行业

面向汽车行业用户体验的 AI 人工智能的影响力继续在各个主要行业中迅速蔓延&#xff0c;全球各地的公司都开始大力投资 AI 技术&#xff0c;以提高自身的竞争优势。未来的趋势表明&#xff0c;企业如果不立即采用人工智能战略&#xff0c;就可能会远远落后于竞争对手。 AI 和…

es head 新增字段、修改字段、批量修改字段、删除字段、删除数据、批量删除数据

目录 一、新增字段 二、修改字段值 三、批量修改字段值 ​四、删除字段 五、删除数据/文档 六、批量删除数据/文档 一、新增字段 put http://{ip}:{port}/{index}/_mapping/{type} 其中&#xff0c;index是es索引、type是类型 数据&#xff1a; {"_doc"…

一阶滤波器(一阶巴特沃斯滤波器)

连续传递函数G(s) 离散传递函数G(z) 转换为差分方程形式 一阶巴特沃斯滤波器Filter Designer参数设计&#xff1a;参考之前的博客Matlab的Filter Designer工具设计二阶低通滤波器 设计采样频率100Hz&#xff0c;截止频率20Hz。 注意&#xff1a;设计参数使用在离散系统中&…

【邻接表,图的邻接表存储表示】

文章目录 邻接表无向图有向图图的邻接表存储表示&#xff1a;图的邻接表的弧&#xff08;边&#xff09;的结点结构 邻接矩阵的好处&#xff1a; 1.直观&#xff0c;简单&#xff0c;好理解。 2.方便检查任意一对顶点间是否存在边 3.方便找到任一顶点的所有“邻接点”&#xff…

【MATLAB源码-第80期】基于蚯蚓优化算法(EOA)的无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚯蚓优化算法&#xff08;Earthworm Optimisation Algorithm, EOA&#xff09;是一种启发式算法&#xff0c;灵感来源于蚯蚓在自然界中的行为模式。蚯蚓优化算法主要模仿了蚯蚓在寻找食物和逃避天敌时的行为策略。以下是蚯蚓…

为什么LDO一般不用在大电流场景?

首先了解一下LDO是什么&#xff1f; LDO&#xff08;low dropout regulator&#xff0c;低压差线性稳压器&#xff09;或者低压降稳压器&#xff0c;它的典型特性就是压降。 那么什么是压降&#xff1f; 压降电压 VDO 是指为实现正常稳压&#xff0c;输入电压 VIN 必须高出 所…

C++基础(3)——类与对象

1.构造函数&#xff1a; 1.1 构造函数的引入&#xff1a; 在关于数据结构这一部分的文章中&#xff0c;创建了一个新的数据结构后&#xff0c;通常需要编写一个初始化函数来对这个数据结构进行一次初始化。在C的类中&#xff0c;如果存在函数&#xff0c;同样也需要对函数进行…

景联文科技入选量子位智库《中国AIGC数据标注产业全景报告》数据标注行业代表机构

量子位智库《中国AIGC数据标注产业全景报告》中指出&#xff0c;数据标注处于重新洗牌时期&#xff0c;更高质量、专业化的数据标注成为刚需。未来五年&#xff0c;国内AI基础数据服务将达到百亿规模&#xff0c;年复合增长率在27%左右。 基于数据基础设施建设、大模型/AI技术理…