首页 热点资讯 义务教育 高等教育 出国留学 考研考公

PC GWP-ASan方案原理 | 堆破坏问题排查实践

发布网友 发布时间:2024-09-07 06:52

我来回答

1个回答

热心网友 时间:2024-09-21 13:44

堆crash分析的难点在于无法直接定位问题代码。剪映专业版及依赖的音视频编辑SDK、特效模块采用MD链接方式标准库,模块间堆错误互相影响,问题定位困难。GWP-ASan是Google开发的用于检测堆内存问题的调试工具,基于Electric Fence Malloc调试器原理,通过概率采样内存分配行为,发现并生成上传崩溃报告。相比ASan,GWP-ASan在性能消耗上可以忽略不计,更适用于线上场景。

GWP-ASan检测原理是保留连续n*page size的受保护内存池,分配内存时随机选择Slot或Guard Page,同时记录分配的堆栈信息。当释放内存时,检查是否在保护内存池内,记录释放堆栈。这些信息基于Protobuf协议序列化后添加到minimp文件中。客户端崩溃后,GWP-ASan信息结合minimp中加载的模块列表和相关符号表,进行符号化,基本定位问题。

在剪映专业版接入字节内部APM-PC平台的GWP-ASan功能后,解决了30余例疑难堆crash问题,大大降低了排查难度,缩短了研发修复时间。无崩溃的GWP-ASan在检测异常后,生成上传崩溃报告,不主动终止进程,保持用户体验。

实际案例中,GWP-ASan准确识别了Use-after-free、Buffer-underflow、Buffer-overflow等内存问题,提供了详细的堆栈信息,快速定位问题源。例如,在分析VENotifyListener和MediaInfoViewModel类的继承关系时,GWP-ASan揭示了MediaInfoViewModel在析构前未正确调用VENotify::removeListener,导致悬垂指针,引发Use-after-free问题。类似地,在QUICollectionViewItem类的多叉树数据结构中,GWP-ASan帮助识别了析构时的悬垂指针问题,通过检查调用deleteLater()的代码段,最终定位到问题位置。在多线程竞争导致的crash中,GWP-ASan明确指出数据结构的释放堆栈,快速定位问题源,建议对存在竞争的数据结构加锁。

对于Buffer-overflow问题,GWP-ASan同样提供直接的第一现场信息,帮助识别错误的内存操作,如在memcpy中溢出。通过分析局部变量和GWP-ASan的输出,确定问题所在,并指出实现方式上的不严谨,如错误地将二进制流当作字符串处理,导致堆溢出。最终,通过改进参数传递方式,问题得以解决。

GWP-ASan的使用极大提高了堆内存问题的定位和修复效率,对于线上服务稳定性具有重要意义。剪映专业版接入GWP-ASan功能后,成功解决了多个复杂堆crash问题,体现了其在实际场景中的价值。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com