首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JNI使用内存相关问题记录

经过排查,问题最终定位如下: 在jni.h中,关于jlong(java long)的typedef并不是唯一的,在windows上,long总是32位(所以在linux上没问题),所以在jni层将地址转长整型的操作...spm=1001.2014.3001.5501 3、Crash调试手段: Android的NDK调试工具ndk-stack,ndk-stack是ndk开发工具包下提供的好用工具,能结合崩溃日志给出详细分析...; 基础用法: ndk-stack -sym 带有符号表的so所在的目录 -dump 崩溃日志: 比如  ~/Library/Android/sdk/ndk/android-ndk-r16b/ndk-stack...-sym app/build/intermediates/cmake/debug/obj/arm64-v8a -dump crash.log  参考:https://blog.csdn.net/ReadyShowShow.../article/details/109095211  如果是给服务器或者Java应用程序使用的JNI库,调试Crash日志的方法,包括常规手段:日志法、return或者注释代码; 如果能从Core-dump

37320

Android JNI Crash定位步骤

今天讲的是纯干货,目的就是为了指导Android开发者如何根据JNI Crash日志顺藤摸瓜,最后直捣黄龙定位磨人的JNI Crash。所以废话不多,直接开干吧。 1....巧妇内为无米之炊,找到未strip的, 符号表完整的so库文件 在Android Studio 3.2.1: strip之前的文件所在目录: app/build/intermediaters/transforms...打蛇要打七寸,确定发生Crash的设备对应的CPU架构 在JNI Crash的日志里 如果有lib/arm, 则是armeabi-v7a架构; 如果有lib/arm64, 则是arm64-v8a架构...工欲善其事必先利其器,使用add2line 和ndk-stack等工具分析JNI Crash的log addr2line 作用是根据内存地址找到对应的报错代码的文件名和行号 所在目录是toolchain...作用是一键生成更可读的Crash 日志 所在目录是 /media/kyle/a393d005-ebe5-42a0-8c6a-c86fdfb185c1/Android/Sdk/ndk-bundle/ndk-stack

2.9K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Art of Android Development Reading Notes 13

    《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化 第13章 综合技术 13.1 使用CrashHandler来获取应用的...Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?...(2)宿主和插件:宿主是指普通的apk,插件是经过处理的dex或者apk。...(3)资源访问:宿主程序调起未安装的插件apk,插件中凡是R开头的资源都不能访问了,因为宿主程序中并没有插件的资源,通过R来访问插件的资源是行不通的。...第14章 JNI和NDK编程 本章主要是介绍JNI和NDK编程入门知识,比较简单,略过不总结。 如果感兴趣NDK开发可以阅读我之前总结的Android NDK和OpenCV整合开发系列文章。

    54820

    掌握 Android 系统架构,看这一篇就够了!

    ,见Android JNI原理分析。...对于IPC(Inter-Process Communication, 进程间通信),Linux现有管道、消息队列、共享内存、套接字、信号量、信号这些IPC机制,Android额外还有Binder IPC...系统稳定性主要是异常崩溃(crash)和执行超时(timeout): 序号 文章名 概述 1 理解Android ANR的触发原理 触发ANR的场景以及机理 2 Input系统—ANR原理分析 input...Native进程之Trace原理 debuggerd -b 信息收集过程 6 WatchDog工作原理 WatchDog触发机制 7 理解Java Crash处理流程 AMS.handleApplicationCrash...过程分析 8 理解Native Crash处理流程 debuggerd守护进程 9 global reference限制策略 global reference 4.3 Android进程系列 进程/线程是操作系统的魂

    24.3K2313

    Android的.so文件你需要知道那些知识

    在Android中调用动态库文件(*.so)都是通过jni的方式。...Android平台生成.so文件 说了这么多,那么如何在Android平台上生成.so文件呢? NDK环境搭建 关于ndk详细的理论请查看之前的讲解ndk详解,这里只做一个简单的环境搭建。...下载NDK 在Android Studio上下载即可。下载完后可以在structs目录查看。 ? 打开项目根目录的local.properties文件 ?...打开项目根目录的gradle.properties文件,添加 android.useDeprecatedNdk=true ? 这样ndk环境就搭建好了。 编写代码 1 ....使用.so文件需要注意的地方 当你编译.so文件时,经常会出现一些错误,其中最多的是”UnsatisfiedLinkError”,”dlopen: failed”以及其他类型的crash或者低下的性能:

    1.6K50

    JNI 异常处理

    该地址如果不可读不可写,马上会Crash,内核给进程发送错误的信号SIGSEGV,这时候bug会很快被发现。...如果放问地址可写,而且通过野指针修改了该处的内存,那么很有可能等一段时间才会发送Crash,这时候查看Crash调用的栈,和野指针所在的代码部分,几乎没有任何关联。...,是在方法声明时显示用throw声明了某一个异常,编译器要求在调用的时候必须显示捕获处理; 而在JNI中,由于JNI没有像Java一样有try...catch...final这样的异常处理机制,面且在本地代码中调用某个...函数后,必须先检查、处理、清除异常后再做其它 JNI 函数调用,否则会产生不可预知的结果; 一旦发生异常,立即返回,让调用者处理这个异常。...或 调用 ExceptionClear 清除异常,然后执行自己的异常处理代码; 异常处理的JNI函数: ExceptionCheck:检查是否发生了异常,若有异常返回JNI_TRUE,否则返回JNI_FALSE

    1K10

    Android NDK 开发中快速定位 Crash 问题

    在 Android NDK 开发中,排查问题遇到的最熟悉的关键字非 backtrace 莫属,Linux 系统中进程 crash 后通过 backtrace 输出堆栈信息,开发者就是基于这些堆栈信息来定位代码问题...我们也可以借助于 ASAN (注意 Android 版本)进行定位,具体可以参考文章:用 Asan 提前解决 NDK 疑难 crash 写两行代码,先制造一个简单的 crash 场景。...NDK 中自带 addr2line ,一般位于以下目录中: //32bit D:\NDK\android-ndk-r16\toolchains\arm-linux-androideabi-4.9\prebuilt...-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line.exe 执行 crash 代码得到的 crash...D:\NDK>D:\NDK\android-ndk-r16\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64

    1.4K30

    Android:JNI 与 NDK到底是什么?(含实例教学)

    前言 在Android开发中,使用 NDK开发的需求正逐渐增大 但很多人却搞不懂 JNI 与 NDK 到底是怎么回事 今天,我将先介绍JNI 与 NDK & 之间的区别,手把手进行 NDK的使用教学...+的动态库,并自动将so和应用一起打包成 APK 即可通过 NDK在 Android中 使用 JNI与本地代码(如C、C++)交互 应用场景:在Android的场景下 使用JNI 即 Android..."); } // 步骤2:定义在JNI中实现的方法 public native String getFromJNI(); // 此处设置了一个按钮用于触发JNI方法..." tools:context="scut.carson_ho.ndk_demo.MainActivity"> // 此处设置了一个按钮用于触发JNI方法 <Button...总结 本文主要讲解 Java的 JNI与 Android的NDK相关知识 下面我将继续对 Android中的NDK进行深入讲解 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记 ---- 请帮顶或评论点赞

    3.4K21

    Android Studio开发so库实践

    如何配置NDK编译环境可以参考我以前发表的旧文: Cocos2d-x 2.2.3 使用NDK配置编译环境 JNI_Android项目中调用.so动态库 Eclipse的如何通过NDK生成so库就不多说了...什么是JNI 如果你进行Android开发一段时间还不知道什么是JNI的话,说明你还是初学者,没有理解Java层跟Native层之间是如何交互的。...然后,在Android Studio配置NDK路径: ? 上面是笔者的路径,具体按你们来配。 至此,NDK环境配置完毕。...创建Android.mk和Application.mk文件 在jni目录下,我们需要创建两个mk文件 Android.mk LOCAL_PATH := $(call my-dir) include $(...库,在其他平台出现的crash或者是其他问题,相信我们会遇到的问题别人也会遇到,这时候google一下也许能找到解决方案,最后祝生活愉快。

    1.5K20

    得物 Android Crash 治理实践

    一、前言通过修复历史遗留的Crash漏报问题(包括端侧SDK采集的兼容性优化及Crash平台的数据消费机制完善),得物Android端的Crash监控体系得到显著增强,使得历史Crash数据的完整捕获能力得到系统性改善...块的开始使用sigsetjmp打个锚点并快照当前寄存器的值,然后设置信号量处理器并关联当前线程,在catch块中解绑线程与信号的关联并执行业务兜底代码,在捕捉到信号时通过siglongjmp函数长跳转到...崩溃的触发点是mView字段为空。...q=ViewRootImpl源码中mView为空的情况有两种:未调用setView方法前触发窗口焦点变化事件(只有setView方法才会给mView赋不为空的值)。...本地验证阶段,通过在 Android 15 设备上高频触发商详页 Dialog 弹窗的焦点获取与关闭操作,未复现线上崩溃问题。考虑到 Hook 方案的侵入性风险 ,且无法本地测试,最终放弃此方案上线。

    13910

    Android基础开发实践:如何分析Native Crash

    常见导致Native Crash的原因有以下几种: 1. jni内部数组越界、缓冲区溢出、空指针、野指针等; 2. jni中多线程出现竞争,比如一个线程调用jni接口释放了内部一个指针,另一个线程调用另外一个...一旦出现Native Crash,系统或者Runtime产生对应的信号,然后通过对应的信号处理函数进行处理。 4....Android信号的处理机制 4.1 SignalCatcher Android的Zygote在Fork进程的时候,都会在InitNonZygoteOrPostFork时调用StartSignalCatcher...另外,Android为了简化addr2line解析整个Crash全部调用栈的过程,提供了ndk-stack脚本工具批量处理,有兴趣可以看下它的Python源码: ?...Native Crash调试方法 6.1 gdb调试 新版的Android Studio支持直接创建带有Native代码的工程,并使用cmake编译jni代码,内部使用llvm+lldb进行编译和调试。

    18.2K153

    Android NDK开发完全剖析

    做过jni开发的同学都知道jni代码是使用ndk工具链编译的,ndk工具中就包含交叉编译工具链,我们先看一下ndk的目录结构: 这些目录表示针对不同CPU架构的编译工具链,例如arm-linux-androideabi...脚本位于 $ANDROID_NDK/build/tools/目录中: $ANDROID_NDK/build/tools/make_standalone_toolchain.py \ --arch...CMake编译 如果大家在Android5.0做过NDK编程的话,当时是使用ndk-build工具进行编译的,还需要配置Android.mk和Application.mk。...我们先分析一下这个Crash的源头就不难得到这个结论了。 推荐一个android源码查询的站点cs.android.com,下面分析一下GetObjectClass调用链路。...其核心思想就是linux的终端就是通过signal发生给系统的,系统接收到崩溃的中断信号,就知道当前发生了不可扭转的问题,开始收集堆栈信息。

    1.9K10

    Android JNI堆栈分析工具简介

    导语 :从事Android开发的同事如果在碰到JNI的bug一般都是比较头疼的,因为JNI出错的日志信息比较少,不像Java层的堆栈那样,可以直接看到出错的信息(异常信息)以及出错的类和行数。...最近有在分析项目中一个JNI crash,查了一些JNI堆栈分析的方法,涉及到ndk的几个工具的使用,跟大家分享一下。 一、JNI堆栈 为了查看JNI的异常堆栈,我这里模拟了一个出错的代码: ?...ndk-stack可以直接从日志中分析出堆栈的错误信息,能够直接帮助我们定位到错误的位置,一步到位; 我们可以直接把logcat中的错误信息输入给ndk-stack,也可以使用ndk-stack来分析crash...的日志(比如平台上报的crash数据); ndk-stack -sym F:\hello-jni\obj\local\armeabi\ 或者: ndk-stack -sym F:\hello-jni\obj...\local\armeabi\ -dump crash.log 用ndk-stack对本文中出现的日志分析,输入如下信息,和用addr2line工具得到的结果是一样的: ********** Crash

    2.5K100

    【Android】NDK开发Crash分析

    ---- 【Android】NDK开发Crash问题 手机user版本还是userdebug或是eng版本:adb shell getprop ro.build.type 因为使用的user版本的手机...,所有没有权限读取到/data/tombstones日志,本次Crash case使用Logcat日志分析问题;可以看到,日志内容主要由下面几部分组成:(最主要的就是分析崩溃的过程和PID,终止的信号和故障地址和调用堆栈部分...A/DEBUG: #02 pc 0000000000140350 /apex/com.android.runtime/lib64/libart.so (art_quick_generic_jni_trampoline...终止信号和故障地址信息 从上面日志中的第11、12行中可以看到程序是因为什么信号导致了Crash以及出现错误的地址,如下所示: 2022-11-21 16:24:58.265 8033-8033/?...A/DEBUG: Cause: null pointer dereference 第10行的信息说明出现进程Crash的原因是因为程序产生了段错误的信号,访问了非法的内存空间,而访问的非法地址是0x0

    1.4K40
    领券