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

Crash之防测漏篇

最先能想到的是收集crash日志信息: For Android Native 程序异常,会生成tombstone 文件位于路径 /data/tombstones/ 下 Java异常可以Logcat(...比较复杂的问题可能集中crash的栈都是系统信息或者第三方库,或者多个模块存在耦合的代码,排查起来难度比较大。 如图,栈里面都是android自己的内容: ?...以下是crash跟进总结过程的一些可深入的点,如: 1 体验类问题 体验类问题,如保证异常的恢复无明显异常: ?...的crash的类型及原因 http://blog.csdn.net/wtyvhreal/article/details/45146531 7、 Android NDK Tombstone/Crash 分析...http://woshijpf.github.io/2016/06/14/Android-NDK-Tombstone-Crash-%E5%88%86%E6%9E%90/ 8、 分析iOS Crash文件

1.3K81

【腾讯TMQ】Crash 之防测漏篇

): 1.首先发生crash所在进程,创建之初便准备好了defaultUncaughtHandler,用来来处理Uncaught Exception,并输出当前crash基本信息; 2.调用当前进程的...最先能想到的是收集crash日志信息: For Android Native 程序异常,会生成tombstone 文件位于路径 /data/tombstones/ 下 Java异常可以Logcat(...以下是crash跟进总结过程的一些可深入的点,如: 1.体验类问题 体验类问题,如保证异常的恢复无明显异常: 2.代码质量提升 crash分析总结,可以把常见的坑,提取成静态扫描规则加入到代码扫描...的crash的类型及原因 http://blog.csdn.net/wtyvhreal/article/details/45146531 7、 Android NDK Tombstone/Crash 分析...http://woshijpf.github.io/2016/06/14/Android-NDK-Tombstone-Crash-分析/ 8、 分析iOS Crash文件:符号化iOS Crash文件的

2K00
您找到你想要的搜索结果了吗?
是的
没有找到

音视频开发之旅(59)- 捕获收集、定位分析 Native崩溃

本文学习实践的demo以张绍文《Android开发高手课》的例子进行。...minidump_stackwalk工具,这些命令工具我们在后面定位分析时会用到 2.3 将Breakpad集成到Android项目中 将 google-breakpad 源代码里面的src文件夹拷贝到项目的...三、如何分析定位Native崩溃 讲解几种常用的分析工具之前,我们先来了解下编译生成带符号表的so和不带符号表的so的区别。...如果是我们自己开发编译的so,发布时要把带符号表的so进行备份或者上传,方便分析定位native崩溃。...Tombstone/Crash 分析 安卓Native崩溃定位 Android NDK墓碑/崩溃分析 如何分析、定位Android Native Crash 干货|安卓APP崩溃捕获方案——xCrash

1.2K40

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

Linux对信号的定义signum.h文件: ? 4.2 FaultManager 除了SignalCatcher,Runtime启动的时候会创建一个FaultManager, ?...而下面这个则是带有符号表的so信息: ? 正常情况下,cmake编译的so是分为两种,一个是libs下的不带符号表的so,一个是objs下面带有符号表的so,调试的时候需要用到objs下面的文件。...任务,最终这些调试信息会在打包apk strip掉,可以gradle增加以下选项禁止strip: packagingOptions{    doNotStrip "*/*/*.so" } 有了带符号表的...Android上使用gdb编译不是一件轻松的事情,但是也并不复杂。Android SDK实际上已经包含了一套gdb调试工具,我们直接拿来使用即可。...6.2 debuggerd Android手机中有个debuggerd进程,当发生Native Crash,系统会自动调用debuggerd来讲信息dump到tombstone文件

17.2K153

浅析Android的ThreadLocal

ThreadLocal第一眼很容易让人误以为这是一个Thread,其实并不是,它是JDK 1.2引入,为每个线程提供一个独立的本地变量副本,用来解决变量并发访问的冲突问题。...那为什么标题中说的是Android的ThreadLocal呢,原因是Android的ThreadLocal和JDK的ThreadLocal代码实现上是有一定区别的,虽然最终实现的效果是一样的。...} } } 开头先调用了cleanUp方法,顾名思义就是释放掉当前table数字已经失效的value值。...然后通过一个for循环寻找当前的value值需要存放的位置,这里起始的index使用的是key.hash & mask,这样做的用意是什么呢?...最后key.hash & mask的值会落在table的某个位置。接下来for循环中如果我们table中找到了ThreadLocal的弱引用,则替换它的下一位的value的值。

557100

Android Handler机制2之ThreadLocal

本片文章的主要内容如下: 1、Java的ThreadLocal 2、 Android的ThreadLocal 3、Android 面试的关于ThreadLocal的问题 4、ThreadLocal...的总结 5、思考 这里先说下Java的ThreadLocal和Android的ThreadLocal的源代码是不一样的,为了让大家更好的理解Android的ThreadLocal,我们先从Java...(2)、存储Entry对象 hash散列的数据存储过程可能会发生碰撞,大家知道HashMap存储的是一个Entry链,当hash发生冲突,将新的的Entry存放在链表的最前端。...这里面的关键就是这个奇怪的数字0x61c88647,根源就在它的身上。...是不会,虽然ThreadLocal实例被线程的Values实例所持有,也可以被看成是线程所持有,若使用线程池,之前的线程实例处理完出于复用的目的依然存在,但Values选择key时,并不是直接选择

86210

Android tombstone文件是如何生成的

现实生活墓碑一般是给死人准备的,而在android系统“墓碑”则是给进程准备的。 为何Android要设计出这样一个东西呢?...因为android系统是运行在Linux Kernel内核之上的,当内核出现异常,则内核异常机制会分辨出是什么原因,处理不了的直接panic。...tombstone(墓碑),方便后续的debug调试。...NULL指针例子回顾 我们在上一节NULL指针的奇妙之旅详细讲解了当CPU去访问NULL指针,操作系统内部的一系列活动,最后控制台打印出耳熟能详的"Segmetation Faule"。...通过上面的描述,我们大概已经推测出tombstone的大致实现流程了,接下来就去验证猜想了。 进程是如何运行起来的 这里简单描述下android中一个进程是如何跑起来的。

5.3K20

使用内存安全工具提升应用质量和安全性

每年有超过 60% 的 Android 漏洞是由内存错误造成的,除了 Android 之外的其他大型原生代码库也报告了类似的问题,修复应用的内存错误与修复系统的内存错误一样重要。...GWP-ASan GWP-ASan 是我们 Android 11 引入的一款概率性内存错误检测工具,概率性是指随机保护某些堆分配,这样能在性能和捕获错误的几率之间取得平衡。...运行代码并查找问题 启用内存安全工具应尽可能多地执行代码路径,内存错误会生成可用于本地调试的 Logcat 和 Tombstone 跟踪记录,在生产环境,报告将从设备导出到 Play 开发者控制台。...我们 Android 12 引入了新的 Tombostone API 使开发者能在应用下次启动时提取到更多的崩溃信息。...我们在内部开发 Android 操作系统时一直使用这些工具,这帮助我们检测到了代码库隐藏了多年的大量错误,这些工具极大地提高了我们检测错误的能力,而且增强的错误报告帮助我们缩短了修复时间。

63020

Android Tombstone 分析

当前进程接收到该错误信号,可以有三种不同的处理方式。 (1)忽略该信号。 (2)捕捉该信号并执行对应的信号处理函数(signal handler)。...我们就可以大概定位出问题发生的地方,本次 tombstone 日志,我们通过 I/DEBUG ( 241): #00 pc 00028fa8 /system/lib/libc.so...:0 因为这个动态库是最后要打包到最后生成的system.ing的,所以它不包含调试符号信息。...sym 参数就是你android项目下,编译成功之后,obj目录下的文件(android系统源码o 带有符号信息的文件)。...我们可以使用它来分析我们的log文件 ndk-stack -sym xxx.so -dump logfile 所以我们调试android系统源码的时候也可以直接分析log的crash信息。

1K10

APP测试之Monkey压力测试(二)

通过APP测试之Monkey测试(一),我们了解了Monkey是什么,Monkey是如何实现对APP进行压力测试,也熟悉了Monkey基本的命令,今天将在之前的基础上进行补充和拓展,一起深入接触并掌握Monkey...2.数字对应下面百分比对应的数字,比如下图中0:15.0%,表示分配--pct-touch事件15%,测试100次分配15次测试down-up ?...3.如果在monkey参数不指定上述参数,这些动作都是随机分配的,9个动作其每个动作分配的百分比之和为100%,我们可以通过添加命令选项来控制每个事件的百分比,进而可以将操作限制一定的范围内。...(3) 检查tombstone目录是否有生成日志,有的话说明发生过native crash,如图: ?...Monkey后台运行 作用:使得android系统的设备脱离PC,独立运行monkey和记录logcat和monkey日志。 方法如下: 1.

1.6K81

APP测试之Monkey压力测试(二)

通过APP测试之Monkey压力测试(一),我们了解了Monkey是什么,Monkey是如何实现对APP进行压力测试,也熟悉了Monkey基本的命令,今天将在之前的基础上进行补充和拓展,一起深入接触并掌握...Android平台应用程序可能产生以下四种Crash: App层(JAVA应用程序): 1、Force Close Crash 2、ANR Crash Native层(本地框架): 3、Tombstone...2.数字对应下面百分比对应的数字,比如下图中0:15.0%,表示分配--pct-touch事件15%,测试100次分配15次测试down-up ?...3.如果在monkey参数不指定上述参数,这些动作都是随机分配的,9个动作其每个动作分配的百分比之和为100%,我们可以通过添加命令选项来控制每个事件的百分比,进而可以将操作限制一定的范围内。...Monkey后台运行 作用:使得android系统的设备脱离PC,独立运行monkey和记录logcat和monkey日志。 方法如下: 1.

1.9K20

学习tombstone,signal

二、Tombstone生成过程 为了更好地分析tombstone触发的过程,我们可以先了解一下Android中一个进程是如何跑起来的。...循环遍历这个进程的所有线程,对进程的每一个线程进行ptrace操作,对目标线程读取其crashinfo。Crashinfo读取完毕detach当前的线程。...dump_signal_info函数首先调用signal_has_si_addr()对信号的signo进行判断,可以在下面的函数中看到,只有信号不是manually sent并且是某些特定信号的情况下...最近的frame的pc寄存器的值可以直接从thread_info当中获取,后面的pc寄存器的值unwind的过程更新;后面的文件名可以根据memory map和pc寄存器的地址得出;后面的function...后面的name属性表明了crash进程的名称和它在文件系统的位置。

1.7K20

Android NDK 开发】NDK CC++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库的报错代码位置 )

文章目录 一、从 Tombstone 报错日志查找报错动态库 二、addr2line 命令行工具使用 64 位动态库使用的 aarch64-linux-android-addr2line.exe 工具.../tombstones/ 目录下 , 先 ROOT 再说 , 没有 ROOT 权限无法访问该目录的信息 ; 使用 Pixel 2 手机进行调试 , 其它 ROOT 的手机也可以使用 ; ROOT 前先...报错日志查找报错动态库 ---- 参考 【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 获取 tombstone_0X 崩溃日志信息...) 博客 , 在上述博客 , 获取到了 Tombstone 内容如下 : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** **...工具 Android NDK 开发 , 使用的 addr2line 命令行工具是 SDK 的 ndk-bundle\toolchains\aarch64-linux-android-4.9\prebuilt

1K10

Android NDK 开发】NDK CC++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 获取 tombstone_0X 崩溃日志信息 )

再说 , 没有 ROOT 权限无法访问该目录的信息 ; 使用 Pixel 2 手机进行调试 , 其它 ROOT 的手机也可以使用 ; ROOT 前先 解锁 Bootloader , 参考博客 【Android...written to: /data/tombstones/tombstone_00” , 崩溃日志信息被保存到了 /data/tombstones/tombstone_00 文件 ; 二、手机命令行操作.../tombstones/tombstone_00 的崩溃日志文件拷贝到了 sd 卡 , /sdcard/tombstone_00 ; adb pull 命令无法从 /data/ 目录中直接拉取文件 ,...拷贝到 sd 卡 , 就可以从 sd 卡拉取该文件 ; 将 /sdcard/tombstone_00 崩溃日志文件拉取到本地 ; adb pull /sdcard/tombstone_00 ....这样就获取到了 tombstone_00 文件 ; 四、Tombstone 内容 ---- 打开查看其中的大致内容 : *** *** *** *** *** *** *** *** *** ***

1.2K00

Android Native Crash问题排查思路

背景:定位难 对于Android APP而言,native层Crash相比于Java层更难捕获与定位,因为so的代码通常不可见,而且,一些第三方so的crash或者系统的更难定位,堆栈信息非常少:参考下面的几个...app crash 的时候,系统会保存一个tombstone文件到/data/tombstones目录,该命令会导出最近的crash相关信息,我们可以通过bugreport导出,导出它是一个zip...包的形式,解压如下 对于每个tombstone,如果是native crash,打开大概会看到如下日志: 最上面的这些日志是最重要的,它包含了发生crash的线程是哪个,发的日志调用帧是哪个,到这里基本能很大程度上帮助我们实现问题的定位了...由于系统上有共性:只有Android10系统的ARM64设备上出现,所以有理由怀疑Android10的源码BakerReadBarrierThunkAcquire_r15_r0_2这里的处理上有什么不对劲...总结 最主要的是结合bugreport及tombstone文件做好定位,定位问题,才方便解决。

1.5K10

Android hide api反射方案合集

, 关键代码: image.png 这里的 WalkStack 函数就是回溯当前的调用栈帧。...因为Android9的时候,他会调用 hidden_api.h 里面的 IsCallerTrusted 函数,如果是BootClassLoader加载的,会直接信任: image.png但是Android10...jni调用 从前面的代码可以得到jni层面的两个调用方案: • 创建一个jni线程,然后jni线程里面进行反射设置豁免 • System.loadLibrary 的调用domain很低,可以在对应的so...内存符号修改方案 通过dlopen、dlsym可以加载并修改so里面的符号地址,例如 • libart 里的 ZN3artL32VMRuntime_setHiddenApiExemptionsEP7_JNIEnvP7...,但是实际写起来比较复杂,并且每个Android版本,不同的Android厂商可能符号或者符号位置会有差异,兼容性比较难保证。

10810

深入解析AndroidHandler消息机制

Handler消息机制可以说是Android系统中最重要部分之一,所以,本篇博客我们就来深入解析AndroidHandler消息机制。...UI的地方 sendEmptyMessage 或者 sendMessage 3.handleMessage里面的switch里面case不同的常量执行相关操作 public class MainActivity...另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本...至于Looper,它在Android的消息机制担负着消息轮询的职责,它会不间断地查看MessageQueue是否有新的未处理的消息;若有则立刻处理,若无则进入阻塞。...p = n; } } } 一个无限for循环,只有n.when > now和n == null才会跳出循环,说明是等消息队列已有的消息处理完毕

49130

Linker加载so失败问题分析

好在手上正好有一台刚刷完自己编译的Android AOSP的Pixel,做一些实验变得更轻松了。...的symtab查找某个符号时ElfW(Sym)* s的地址出现异常,导致s->st_name获取到错误的数据。...尽管从tombstone我们可以看到一些寄存器数据及寄存处地址附近内存数据,同时也可以看到crash时的虚拟内存映射表,仍然无法获取有价值的信息。...通过根据tombstone的/proc//maps的虚拟内存地址与日志打印的地址进行对比,可以发现最为符号表地址的s并没有指向so文件虚拟内存的地址段,因此可以怀疑,so加载确实出现了异常...inode文件被open函数O_TRUNC掉,则kernel会把so文件对应在虚存的页清空,这样当运行到so里面的代码时,因为物理内存不再有实际的数据(仅存在于虚存空间内),会产生一次缺页中断。

1.7K20

正则表达式 入门

但是一些场景下,我们不需要回溯,匹配不上返回失败就好了,因此正则还有另外一种模式,独占模式,它类似贪婪匹配,但匹配过程不会发生回溯,因此一些场合下性能会更好。 什么是回溯?...例如下面的正则: regex = “xy{1,3}z” text = “xyyz” 匹配时,y{1,3}会尽可能长地去匹配,当匹配完 xyy ,由于 y 要尽可能匹配最长,即三个,但字符串后面是个...z 就会导致匹配不上,这时候正则就会向前回溯,吐出当前字符 z,接着用正则的 z 去匹配 ?...但经过测试,你会发现,这个正则并不能很好地完成任务,因为18位数字也会匹配上前15位 ? 没有匹配到18位的记录 解决方式 可以用括号括起来表示一个整体 ? 替换举例 ? 替换: ?...你应该知道 d{11} 能匹配上11位数字,但这11位数字可能是18位身份证号的一部分。再比如,去查找一个单词,我们要查找 tom,但其它的单词,比如 tomorrow 也包含了tom ?

72730

Linker加载so失败问题分析

好在手上正好有一台刚刷完自己编译的Android AOSP的Pixel,做一些实验变得更轻松了。...的symtab查找某个符号时ElfW(Sym)* s的地址出现异常,导致s->st_name获取到错误的数据。...通过复现问题,可以抓到更完整的 /data/tombstone日志,得到如下完整的信息: [图片4.png] 尽管从tombstone我们可以看到一些寄存器数据及寄存处地址附近内存数据,同时也可以看到...另外通过linker增加日志,并重新编译linker替换到/system/lib/linker: [图片6.png] [图片7.png] 可以获取到如下的地址信息: [图片8.png] 通过根据tombstone...的/proc//maps的虚拟内存地址与日志打印的地址进行对比,可以发现最为符号表地址的s并没有指向so文件虚拟内存的地址段,因此可以怀疑,so加载确实出现了异常。

1.5K10
领券