写点什么

Facebook 调试 iOS 文件损坏的过程

  • 2014-09-11
  • 本文字数:1372 字

    阅读完需:约 5 分钟

Facebook 工程师 Slobodan Predolac 和 Nicolas Spielberg 最近描述了他们如何解决了一个顽固的移动调试问题,并且使崩溃频率降低了50% 以上。在此过程中,他们展示了若干通用的技巧以及Facebook 发开的工具,这些对不断快速增长的大型代码库会有所帮助。

Predolac 和 Spielberg 回顾说,此 bug 开始的时候有点像 Core Data 崩溃。他们首先使用 Facebook 自己的工具 Hipal Scuba 从崩溃日志中查找和搜集数据,分析的结果是 Core Data 错误编码没有统一的规律。

在查找问题的根源时,Facebook 开发软件的方式是阻碍此过程的障碍之一,因为 Facebook 以月为发布周期,而且有数百名开发人员向各发布版本提交代码。所以,这两位工程师在文中描述说,“即使我们能够缩小引入 bug 的时间范围,也无法隔离数千次代码提交来纠错”。况且每次的版本发布都经过 A/B 测试,这就更难区分“到底是代码还是配置导致了该问题”。

证明以上方式行不通后,Facebook 的工程师开始做出不同的假设,在排除了若干假设后,他们试着验证下一个假设,那就是 Core Data 是该问题的根本原因所在。于是他们找到了“一段受影响的代码,他们可以很容易地将这块代码从 Core Data 切换为 SQLite,用以验证他们的假设”。

之后没多久,他们就收到崩溃报告,报告指出某文件被“可恶的线程或进程”重写了。这说明查找问题的方向是正确的,但是在“庞大的代码库中”顺利找到此线程或进程看起来不是一件容易的事情。他们采取的方法是在打开 SQLite 文件之前打开一个诱饵文件,这样就能捕捉到进行写文件操作的线程,然后查看损坏的文件。通过此方法,他们在所有的附件中发现了一个相同的前缀:17 03 03 00 28,然后使用 lldb 中的以下命令设置了一个断点,用以查找试图向 POSIX write() 方法发送此内容的任意线程:

复制代码
breakpoint set -n write -c "(*(char**) ($esp + 8))[0]==0x17
&& (*(char**) ($esp + 8))[1]==0x03
&& (*(char**) ($esp + 8))[2]==0x03
&& (*(char**) ($esp + 8))[3]==0x00
&& (*(char**) ($esp + 8))[4]==0x28"

很快他们发现 SPDY 协议栈很可能就是罪魁祸首,接下来就验证该假设。他们使用 Fishhook 完成了验证的工作,这是 Facebook 开发的一款开源工具,它可以替换系统的 write 调用。

复制代码
// setup a honeypot file
int trap_fd = open(…);
// Create new function to detect writes to the honeypot
static WRITE_FUNC_T original_write = dlsym(RTLD_DEFAULT, "write");
ssize_t corruption_write(int fd, const void *buf, size_t size) {
FBFatal(fd != trap_fd, @"Writing to the honeypot file");
return original_write(fd, buf, size);
}
// Replace the system write with our “checked version”
rebind_symbols((struct rebinding[1]){{(char *)"write", (void *)corruption_write}}, 1);

在第二天他们手中最新的崩溃报告显示,SSL 层在向一个 socket 中写数据,但这个 socket 之前已经被关闭,并且被重新分配给了出问题的数据库文件。

一旦在查明了崩溃的原因,修复问题仅仅花了几个小时就搞定了。

查看英文原文: Debugging iOS File Corruption at Facebook


感谢曹知渊对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-09-11 02:251535
用户头像

发布了 28 篇内容, 共 11.8 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

logback 默认配置文件

JefferLiu

软件测试/测试开发 | 使用 cURL 发送请求

测试人

软件测试 自动化测试 curl 测试开发

报告下载 | DQMIS高端闭门论坛成果报告——《2022第六届数据质量管理国际峰会关于数据要素发展几点看法和建议》

数据质量管理智库

数据 数据治理 数据安全 隐私计算 数据要素

使用“宝塔一键迁移”工具,将单机版typecho博客系统迁移到京东云cvm云主机

京东科技开发者

服务器 京东云 安装宝塔 云迁移 企业号 1 月 PK 榜

ChatGPT中文版重装上阵

felix

openai ChatGPT AIMODELMARKET

Mega 改进序列模型,引入移动平均捕捉时空依赖

Zilliz

计算机视觉

MYSQL数据库主从配置

Jackey

MySQL 数据库

YonBuilder 应用构建教程之移动端扩展

YonBuilder低代码开发平台

【深入浅出Spring原理及实战】「源码调试分析」结合DataSourceRegister深入分析ImportBeanDefinitionRegistrar的源码运作流程

码界西柚

spring Spring Framework

直播|镜舟 x Smartbi《后疫情下如何利用数据驱动企业逆势破局》

镜舟科技

数据库 镜舟数据库

从指标到洞察力的普罗米修斯

宋小生

Prometheus 普罗米修斯 普罗米修斯监控

软件测试/测试开发 | 如何模拟真实使用场景?mock 技术来帮你

测试人

软件测试 自动化测试 接口测试 测试开发 Mock

稳定支撑千万级月活,华为日历背后的英雄

华为云开发者联盟

数据库 后端 华为云 企业号 1 月 PK 榜

逃不开的安迪-比尔定律,在智能机器人时代该如何破解?

优必选科技

人工智能 机器人 视觉处理

SLS:基于 OTel 的移动端全链路 Trace 建设思考和实践

阿里巴巴终端技术

数据采集 Trace 移动端

又一重要进展发布!OpenMMLab算法仓支持昇腾AI训练加速

华为云开发者联盟

人工智能 华为云 昇腾AI 企业号 1 月 PK 榜

合作升级|Kyligence 跬智智能分析平台入选华为云联营商品

Kyligence

数据分析

java 本地应用程序加载与修改properties配置文件

JefferLiu

软件测试/测试开发丨接口测试经典面试题:Session、cookie、token有什么区别?

测试人

软件测试 自动化测试 接口测试 测试开发

软件测试/测试开发 | 接口测试常用代理工具

测试人

软件测试 自动化测试 接口测试 charles 测试开发

【iOS逆向与安全】系统推送服务(APNS)拦截

小陈

安卓 ios开发 逆向 iOS逆向 ios安全

TracedModule: 更友好的模型表示方案,模型训练到部署的桥梁

MegEngineBot

深度学习 开源 MegEngine 模型训练到部署

软件测试/测试开发 | 接口测试之HTTP、HTTPS 抓包分析

测试人

https 软件测试 HTTP 自动化测试 测试开发

用无线控制LED显示屏的10个特点

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家

软件测试/测试开发 | 使用postman发送请求

测试人

软件测试 Postman 自动化测试 接口测试 测试开发

百度安全入选权威报告《联邦学习与可信AI市场机会分析》典型厂商

百度安全

软件测试/测试开发 | 接口测试之HTTP 协议讲解

测试人

软件测试 HTTP 自动化测试 接口测试 测试开发

FL Studio2024中文版水果电音舞曲制作软件

茶色酒

FL Studio21 FL Studio2024

跳跃表数据结构与算法分析

京东科技开发者

redis 算法 跳跃表; 数据结构算法 企业号 1 月 PK 榜

震网(Stuxnet)病毒深度解析:首个攻击真实世界基础设施的病毒

华为云开发者联盟

安全 后端 华为云 企业号 1 月 PK 榜 震网

书单 | 春节假期,我想把这几本书带回家!

博文视点Broadview

Facebook调试iOS文件损坏的过程_Meta_Sergio De Simone_InfoQ精选文章