《字节 iOS 端 Memory Corruption 探索与实践-吴凯凯.pdf》由会员分享,可在线阅读,更多相关《字节 iOS 端 Memory Corruption 探索与实践-吴凯凯.pdf(57页珍藏版)》请在三个皮匠报告上搜索。
1、字节 iOS 端 Memory Corruption 探索与实践吴凯凯字节跳动-开发者服务团队我介绍2020年6加字节跳动,直专注在APM向,负责iOS端稳定性监控和优化作;主要技术建设作:崩溃、慢函数、卡死等系统策略崩溃的监控和归因,相关技术及产品泛应在抖、头条、书等业务中Memory Corruption 介绍线下排查具和适性介绍线上排查案和疑难崩溃案例分析总结回顾纲Memory Corruption 定义对不属于的内存进读写,就是memory corruption Use after freeWild PointerUse after scope Uninitialized pointe
2、rGlobal buffer overflowBuffer overflowHeap buffer overflowStack buffer overflowDouble freeOtherInvalid freeMemory Corruption 类型介绍和触发原因 Use after freeWild PointerUse after scope Uninitialized pointerMemory Corruption 类型介绍和触发原因 Use after freeWild PointerUse after scope Uninitialized pointerMemory Corr
3、uption 类型介绍和触发原因 Use after freeWild PointerUse after scope Uninitialized pointerGlobal buffer overflowBuffer overflowHeap buffer overflowStack buffer overflowMemory Corruption 类型介绍和触发原因Memory Corruption 类型介绍和触发原因Double freeOtherInvalid freeMemory Corruption 危害1.对客户端排查不友好。2.会发不可预期为,如写坏了其它业务线的内存,通常会在今
4、后某个时间点发崩溃,并不是写坏这个时间点。所以崩溃堆栈不定是发的原因,有时候,崩溃堆栈甚都是随机的,较难归因。Memory Corruption 介绍线下排查具和适性介绍线上排查案和疑难崩溃案例分析总结回顾纲线下排查具-ZombieZombie 定义 指的是已经释放的 OC 对象。属于Use after free类型内存问题。缺点 1.线下难复现;线上排查困难。2.只适 OC 对象野指针(use after free)导致的内存问题线下排查具-Zombieobject_dealloc_zombie_NSZombie_XXzombie objectany messageexception rep
5、ortClean线下排查具-Address SanitizerClang-fsanitize=addressasan dylib线下排查具-Address Sanitizer 插桩pIsPoisoned(p)Process memoryShadow memory线下排查具-Address Sanitizer 插桩buffernumberStack线下排查具-Address Sanitizer 插桩buffernumberStack线下排查具-Address Sanitizer 插桩Globals线下排查具-Address Sanitizer 运时线下排查具-Address Sanitizer
6、运时线下排查具-Address Sanitizer 缺点缺点 1.开销:内存使量增加2到3倍,代码的速度降低2到5倍。2.对 Overflow 的检测依赖 redzone。3.对 Use-after-free 检测原理是将释放的内存放个隔离的列表中隔离段时间,但是过了隔离时间再使,检测失效。HWASan:ARMv8 寻址只到了低 48 位,所以剩下的 16 位可以拿来做其它事情。HWASan 8bit 来存储块内存区域的标签(tag)。线下排查具Malloc Scribble:申请内存后在内存上填0 xAA,内存释放后在内存上填0 x55Malloc Guard Edges:申请内存的时候在前
7、后page上加保护Guard Malloc:将每个内存分配在不同的虚拟内存上Malloc Stack Logging:记录内存地址申请和释放的堆栈Memory Corruption 介绍线下排查具和适性介绍线上排查案和疑难崩溃案例分析总结回顾纲线上排查案和疑难崩溃案例分析-Zombieobject_dealloc_zombie_NSZombie_XXzombie objectany messageexception reportClean缺点 1.性能消耗太,线上不能直接使。2.线上使即使监控到Zombie对象,也不定能找到崩溃原因。线上排查案和疑难崩溃案例分析-Zombie线上改造案:1.配
8、置缓存个数和,删除淘汰的Zombie对象,避免OOM。2.通过名单只监控配置的类,减少性能损耗。3.可配置归因Zombie类型,命中后,在dealloc时候记录调栈。线上排查案和疑难崩溃案例分析-ZombieZombie开启之前调栈纯系统调栈线上排查案和疑难崩溃案例分析-ZombieZombie开启之后调栈线上排查案和疑难崩溃案例分析-Zombie排查Zombie对象在这个版本的diff线上排查案和疑难崩溃案例分析-Zombie开启归因,Zombie对象的释放调栈Zombie对象不是线程安全的,通过释放调栈,找到这代码,很容易发现在这存在多线程问题线上排查案和疑难崩溃案例分析-Zombie 局
9、限性只能监控归因 OC 对象的 Use after free 和 double free 问题!线上排查案和疑难崩溃案例分析-GWPASan将每个内存分配在不同的虚拟内存上,然后在释放内存时删除整个。线上排查案和疑难崩溃案例分析-GWPASan可检测的内存崩溃类型:1.Double free2.Use after free3.Invalid Free4.Buffer overflow5.Buffer underflow线上排查案和疑难崩溃案例分析-GWPASan持配置Allocation Page个数和命中采样率。规模户采样,分摊内存消耗,实现极低性能消耗,监控到部分内存问题。Use afte
10、r free 崩溃案例分析Use after free 崩溃案例分析type:use-after-freeasan_fault_addr:0 x120ABC000allocate_addr:0 x120ABC000allocate_size:32崩溃内存创建调栈崩溃内存释放调栈Use after free 崩溃案例分析 问题原因 可变字典异步传给志层后,然后清除可变字典;存在多线程问题 解决案 可变字典在业务层copy后,再传给志Buffer overflow 崩溃案例分析type:Buffer overflow访问越界内存0 x1146F4010调栈内存申请调栈,内存有效范围0 x1146F
11、3FB0,0 x1146F4000)Buffer overflow 崩溃案例分析 问题原因 没有检测参已经超过数组 解决案 增加边界检测,超出边界则返回缺省值GWPASan 局限性 Use after freeWild PointerUse after scope Uninitialized pointerGlobal buffer overflowBuffer overflowHeap buffer overflowStack buffer overflowDouble freeOtherInvalid free线上排查案和疑难崩溃案例分析-CoredumpCoredump 定义 lldb
12、定义的种特殊件格式,可以还原App运某时刻的完整运状态 优势 1.结合 lldb 需复现就可以实现线上疑难问题的事后调试 2.崩溃现场信息完全还原,海量分析素材 适范围 任意 Mach 异常和 Signal 异常问题线上排查案和疑难崩溃案例分析-Coredump采集流程线上排查案和疑难崩溃案例分析-Coredump使线上排查案和疑难崩溃案例分析-Coredump使线上排查案和疑难崩溃案例分析-Coredump解决字节存在年的崩溃,将字节系iOS应整体崩溃率下降8%线上排查案和疑难崩溃案例分析-Coredump线上排查案和疑难崩溃案例分析-Coredump线上排查案和疑难崩溃案例分析-Cored
13、ump切换到线程80切换到第0帧读取寄存器X0的值查询哪些线程的寄存器的值,等于0 x2815ee80memory read:读取某个范围的内存值 问题原因 com.apple.CFFileDescriptor 队列外部引计数于0,被过度释放线上排查案和疑难崩溃案例分析-Coredump解决案 替换 dispatch_queue_create 法在创建队列时使 dispatch_source_create 式增加 CFFileDescriptor 队列的外部引计数线上排查案和疑难崩溃案例分析-Coredump线上排查案和疑难崩溃案例分析-Coredump _path不符合预期的值 【IESMe
14、tadataStorage】【Info】extent file F%2F%2Ffalcon%2Ffe_app_react%2Fcreator_center%2Findex.html%3Fhide_nav_bar%3D1%26should_full_screen%3D1%26enter_from%3Dnavigation_panel to size 2113536 问题原因 -NSString initWithFormat:arguments:中,format参数带有%特殊符号,解析 arguments 参数时读到错误的内存地址闪退线上排查案和疑难崩溃案例分析-Coredump 问题原因 use after free 内存问题。UTF8String 返回的 C 字符串命周期 filePath 命周期更短,所以如果外要使这个 C 字符串更命周期,就需要 copy 份来管理内存 线上排查案和疑难崩溃案例分析-CoredumpMemory Corruption 介绍线下排查具和适性介绍线上排查案和疑难崩溃案例分析总结回顾纲总结回顾其它ASanZombieGWPASanCoredump线下具线上具线上具线上具 Memory Corruption类型什么是 Memory Corruption概念Zombie