写点什么

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:251590
用户头像

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

关注

评论

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

架构---作业3

李某人

架构训练营 #架构训练营

华为云CDN为什么成为企业首选?四大优势助力企业腾飞!

秃头也爱科技

华为云CDN加速,如何为中小企业创新发展效力?

秃头也爱科技

Java Stream中map、flatMap 的使用区别

zarmnosaj

10月月更

企业存储难题难以解决?不如试试华为云OBS对象存储服务

爱科技的水月

传统制造业数字化转型路径与实践

宇宙之一粟

数字化转型 制造业 10月月更

怎么制作一份能够帮助客户的帮助文档呢?

Baklib

帮助文档

【Java SE】Java程序的运行详解

安苒

Java

css学习

codingyt

CSS 10月月更

华为云帮助企业做好核心数据灾备,为企业数据安全与稳定发展提供保障

爱尚科技

华为云CDN加速服务,如何让你的网速“飞”起来!

秃头也爱科技

华为云对象存储服务OBS,海量存储安全可靠,让云存储更加简单

爱科技的水月

经验分享|如何做好FAQ设计

Baklib

全国联动,千锋教育1024程序员节线下狂欢活动火热开展!

千锋IT教育

华为云数据灾备全场景应用方案,为企业数据安全护航

爱尚科技

构建超级自动化平台成为战略技术趋势——Gartner:可观测性应用将成为数据驱动型决策的最强大来源

九科Ninetech

RPA 流程挖掘 数智化转型

建立客户忠诚,从编辑产品帮助文档开始!

Baklib

帮助文档 客户忠诚

千锋郑州第八届“千锋杯”联合项目大赛圆满落幕

千锋IT教育

CSS基础4

虾仁疙瘩汤

CSS css3 10月月更

CSS学习笔记6

虾仁疙瘩汤

CSS css3 10月月更

一朝见微,十年知著:联想Tiny的办公聚变

脑极体

华为云CDN加速,如何助力企业信息化转型?

秃头也爱科技

华为云大数据BI,便捷高效的大数据解决方案,助力企业数字化运营

爱科技的水月

降低成本,快速搭建企业知识库的方法盘点

Baklib

知识库

“程”风破浪的开发者|微信小程序逆地址解析

江拥羡橙

微信小程序 学习方法 uniapp 腾讯地图 “程”风破浪的开发者

css学习笔记5

虾仁疙瘩汤

CSS css3 10月月更

【Java SE】java中变量和表达式计算的相关问题

安苒

Java

“程”风破浪的开发者 | 元宇宙就是“虚晃一枪”?

三掌柜

1024 1024程序员节 元宇宙 “程”风破浪的开发者

千锋杭州秋季IT专场双选会热烈启幕,招聘与就业成果显著

千锋IT教育

flex容器布局

codingyt

CSS Flex 10月月更

设计师高效办公必备神器-呆猫云工作站

爱科技的水月

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