Android应用程序 c/c++ 崩溃排查流程二——AddressSanitizer工具使用

目录

1.背景

2.ASan工具集成到应用中进行使用

3.使用ASan工具查看日志


1.背景

由于在Android应用中进行c/c++编程会有各种crash或者内存指针异常,如果内存需要查看哪地方进行释放内存是无法通过addr2line或者ndk-stack工具排查出来的,这时就需要使用AddressSanitizer对内存异常的进行深度分析,例如list收尾相连成为环形了,如下:

主要代码逻辑如下:

根本原因:Scudo(Android 11+ 的默认内存分配器)检测到要释放的内存块的头部信息(chunk header)已被破坏 。

直接触发点:在osa_free中释放某个内存块(地址0xd0061100)时,Scudo 验证发现其头部校验和不匹配 。头部可能因内存越界写入(如缓冲区溢出)或使用已释放内存(use-after-free)而损坏 。

重要背景:在崩溃前,您的队列验证代码多次检测到并修复了循环链表("Circular list confirmed! Cycle detected after X steps")。队列结构持续被破坏,暗示存在持续的内存越界写入严重的并发访问问题​ 。

Scudo 本身是一种缓解机制,而 ASan 能更精确地定位内存错误,此处就需要用到ASan工具

2.ASan工具集成到应用中进行使用

1.在AndroidManifest.xml中添加:

android:extractNativeLibs="true"

如下:

2.在gradle中添加

useLegacyPackaging = true

如下是我的配置

如果不行直接把我的配置拷贝进去

packagingOptions { jniLibs { useLegacyPackaging = true // 兼容旧版本Gradle } resources { // 包含所有.so文件 pickFirsts += "**/*.so" // 包含静态库(如果需要) pickFirsts += "**/*.a" } }

3、将wrap.sh 文件添加到src/main/resources/lib目录中的对应目录。我这边是32位的,如下:

wrap.sh内容如下,直接拷贝即可:

#!/system/bin/sh HERE="$(cd "$(dirname "$0")" && pwd)" export ASAN_OPTIONS=log_to_syslog=false,allow_user_segv_handler=1 ASAN_LIB=$(ls $HERE/libclang_rt.asan-*-android.so) if [ -f "$HERE/libc++_shared.so" ]; then # Workaround for https://github.com/android-ndk/ndk/issues/988. export LD_PRELOAD="$ASAN_LIB $HERE/libc++_shared.so" else export LD_PRELOAD="$ASAN_LIB" fi "$@"

也可以参考:https://developer.android.com/ndk/guides/asan?hl=zh-cn#ndk-build

4.找到asan的动态库,和其他动态库一样集成到项目中

首先我这边是用的32位库,路径如下:

Sdk\ndk\23.1.7779620\toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\12.0.8\lib\linux

然后集成到项目中,这里的流程就是和一般的so包一样进行集成即可

上述的流程就完成了ASan工具的集成

3.使用ASan工具查看日志

上述集成完成,然后我们运行应用,如果有wrap.sh相关的AddressSanitizer打印说明我们集成成功了,如下:

从ASan报告中有几个关键信息点:

  1. 错误类型AddressSanitizer: attempting free on address which was not malloc()-edSUMMARY: AddressSanitizer: bad-free。这直接指明了是无效的释放操作。

  2. 地址位置Address 0xc99ce0f8 is located in stack of thread T20 (Thread-4)。这是最关键的线索,它表明您的程序试图释放(free)的内存地址是一个位于线程栈(stack)上的局部变量,而栈内存是由系统自动管理(函数返回时自动回收)的,绝不能手动释放。

  3. 调用栈:调用栈显示了从liblpa.so开始的函数调用链,错误就发生在这个库中。您需要沿着这个调用栈来定位问题代码。

然后我们使用addr2line工具进一步定位,不会用addr2line工具的可以看前一篇文章:

https://blog.csdn.net/gongjdde/article/details/155744018?sharetype=blogdetail&sharerId=155744018&sharerefer=PC&sharesource=gongjdde&spm=1011.2480.3001.8118

此时我们就定位到错误的位置了,如下:

可以看出来这个是局部的变量,不能被回收,所以导致出现无效的释放,将这行代码删除即可

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

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

相关文章

电车的真相,700公里续航跑长途仅是勉强够,有效续航仅六成

随着纯电车的续航不断提升,如今部分电车的续航已达到700公里了,单从数据来看,电车达到这样的续航应该能充分满足要求了,但是只要一跑长途,就会发现这样的续航仅仅是勉强够,这是因为快充技术的特性决定的。车…

高质量同步数据如何驱动机器人VLA模型?Trossen系列视频2-揭示关键三要素

训练一个能“看懂指令并动手操作”的机器人,关键不在数据量,而在数据质量。Trossen Robotics 最新官方视频指出:有效的视觉-语言-动作(VLA)模型训练,必须同步捕捉三要素——摄像头看到的画面、人类给出的语…

以数字创新激活文化传承:iBox入选2025数字化转型特色案例

近日,中国互联网协会数字化转型与发展工作委员会正式公布了2025年度“互联网助力经济社会数字化转型”案例评审结果。在这一具有行业权威性的评选中,文化数字资产生态平台iBox所申报的《iBox助力文化产业数字化转型创新实践》案例,经多轮严格…

Android应用程序 c/c++ 崩溃排查流程三——ndk-stack工具使用

目录 一.背景 二.ndk-stack工具如何使用 一.背景 Android中使用c/c出现crash,或者前一篇的AddressSanitizer工具中,AddressSanitizer工具抓取的日志需要再定位下具体在哪一行,使用addr2line工具固然可以进行进一步排查,但是还有…

Nginx 服务优化与防盗链配置方案

Nginx服务优化 1、配置nginx隐藏版本号 server_tokens off; ##添加,关闭版本号2、配置Nginx网页缓存时间 当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,…

基于Hello Robot具身智能平台的CoRI系统:提升机器人意图沟通透明度

CoRI突破机器人意图表达瓶颈,Hello Robot 机器人 Stretch3助力人机交互升级 在辅助机器人日益普及的背景下,卡内基梅隆大学与本田研究院联合开发的CoRI系统,成功解决了机器人如何清晰表达行动意图的关键挑战。本研究依托Stretch3移动操作机器…

【私域商城系统是企业构建自主可控电商生态的核心工具】

私域商城系统是企业构建自主可控电商生态的核心工具,旨在通过自有渠道深度运营用户资产,实现低成本获客、高复购转化及品牌价值沉淀。以下是其关键特性及实施要点: 一、核心功能模块 • 全渠道触达与整合 支持小程序、APP、H5、PC端等多终端入…

【知识科普】| 虚拟币网络传销

前言 随着区块链概念的普及,部分不法分子借 “区块链创新” 之名,将 “非法虚拟代币” 包装成 “高收益投资产品”,用 “稳赚不赔”“一夜暴富”“只涨不跌” 等煽动性话术,诱导公众盲目投入。与传统传销相比,这类非法…

大数据领域数据仓库的性能瓶颈分析

大数据领域数据仓库的性能瓶颈分析关键词:大数据、数据仓库、性能瓶颈、分析、优化摘要:随着大数据时代的到来,数据仓库在企业数据管理和分析中扮演着至关重要的角色。然而,数据仓库的性能问题常常成为限制其有效应用的关键因素。…

【定制化开发是指根据企业的个性化业务需求】

定制化开发是指根据企业的个性化业务需求,从零构建或深度改造软件系统的过程。以下是其核心要点及实施指南: 一、适用场景与价值 典型需求 ✅ 复杂业务流程:如跨境物流清关、医药行业GSP合规审批等非标环节。 ✅ 高安全要求:金融级…

T30天正结构 结构工程师的施工图提速神器安装激活步骤

T30 天正结构(T30-Asd V1.0)是天正软件依托 AutoCAD 平台打造的新一代结构设计绘图软件。软件以 “二维绘图 三维同步 计算数据无缝对接” 为核心优势,全面覆盖混凝土结构施工图设计全流程,内置权威规范校验与多专业协同功能&am…

C# 成为 TIOBE 2025 年度编程语言

在 2026 年 1 月 TIOBE 指数中,C# 被评为 2025 年度编程语言,主要原因是它在过去一年中实现了最大的年度排名提升。📈 这几年,C# 做对了哪些关键选择?从 Windows-only,逐步走向真正的跨平台从 Microsoft 私…

数字政府建设的坚实支撑

在数字政府建设浪潮中,政务云凭借安全可控、高效协同的特性,成为提升治理能力的关键抓手。天翼云翼政通iStack一体机通过“一云多芯”架构,适配多种国产化芯片,实现了从IaaS到SaaS的全栈自研,成功入选信通院高质量数字…

《秘籍在此!提示工程架构师在Agentic AI上下文工程用户体验设计的关键法门》

《秘籍在此!提示工程架构师在Agentic AI上下文工程用户体验设计的关键法门》 关键词 Agentic AI、上下文工程、提示工程、用户体验设计、Prompt Architect、对话管理、意图理解 摘要 当我们谈论Agentic AI(智能体AI)时,“像人一样…

救命神器8个AI论文网站,研究生高效写作必备!

救命神器8个AI论文网站,研究生高效写作必备! 1.「千笔」—— 一站式学术支持“专家”,从初稿到降重一步到位(推荐指数:★★★★★) 在研究生的论文写作过程中,从选题、构思到撰写、查重&#xf…

筑牢数字时代的云端防线

随着云服务渗透率的提升,安全防护已成为企业上云的核心关切。数据泄露、恶意攻击、配置错误等风险,以及全球数据保护法规的日趋严格,对云安全提出了更高要求。构建坚不可摧的云端防线,需要技术防护与管理体系的双重保障。当前&…

气体检测仪的应用:CCUS二氧化碳捕集驱油过程泄露监测方案

随着双碳目标的推进,CCUS技术,尤其是二氧化碳驱油,已成为石油开采行业降本增效与绿色转型的关键路径。然而,在二氧化碳的注入、输送、驱油及封存的全流程中,管道、阀门、井口及地表可能存在泄露风险。这不仅造成宝贵资…

数字时代的生产力新底座

当全球数据量预计在2025年突破175ZB,云计算已从技术概念升级为支撑千行百业的核心基础设施。作为数字化转型的“隐形引擎”,云服务通过IaaS、PaaS、SaaS三层架构,为企业提供弹性算力、智能存储和高效协同解决方案。小到初创公司的办公协同&am…

ionic + vue3 + capacitor遇到backButton问题

项目背景:ionic vue3 capacitor需求描述:需要通过 capacitor 提供的 backButton 方法,来监听安卓原生的返回按键事件。1、bug:使用 capacitor 封装的 backButton 方法来监听安卓原生返回键,如果不是根页面的情况&…

大数据领域数据标注的创新技术与趋势

大数据时代的数据标注革命:创新技术、实践痛点与未来趋势 摘要/引言 你知道训练一个能精准识别肺癌的AI模型需要多少标注数据吗?答案是至少5万张带病灶定位的CT影像——而这只是医疗AI领域的“基础需求”。当我们迈入大数据时代,全球每天产生…