写点什么

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

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

关注

评论

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

我的远程办公深度体验 | 社区征文

6个核桃

初夏征文

Vue3核心之响应式

Python研究所

6月月更

云技能提升好伙伴,亚马逊云师兄今天正式营业

亚马逊云科技 (Amazon Web Services)

亚马逊云

用Python自动化办公(csv项目实战)

王小王-123

csv python项目 自动化办公 大数据分割

优惠券种类那么多,先区分清楚再薅羊毛!

CRMEB

led背光板的作用是什么呢?

Dylan

LED LED显示屏

网络营销之四大误解

源字节1号

微信小程序 前端开发 后端开发 网站开发

ABAP-时间函数

桥下本有油菜花

abap

用Python写一个简易机器人,超级简单!

王小王-123

python编写机器人 python项目 语法知识大全

OpenMLDB Meetup No.4 会议纪要

第四范式开发者社区

机器学习 数据库 特征平台 特征工程 实时

​web前端培训 | JavaScript私有属性的实现方式

@零度

JavaScript 前端开发

Subtrate 源码追新导读-5月上旬: XCM 正式启用

彭亚伦

Substrate 波卡

Flutter的特别之处在哪里

Geek_99967b

小程序 Flutter 小菜

拆分电商系统为微服务

Fan

「架构实战营」

Dart 开发技巧

Geek_0a3437

flutter android dart 6月月更

直播带货源码开发中,如何降低直播中的延迟?

开源直播系统源码

软件开发 直播系统 直播源码

科普达人丨漫画图解什么是eRDMA?

阿里云弹性计算

大数据 TCP/IP RDMA

IOS技术分享| iOS快速生成开发文档(二)

anyRTC开发者

ios objective-c 音视频 移动开发 Jazzy

揭秘得物客服IM全链路通信过程

得物技术

前端 大前端 通信 IM 客服

K8S V1.23 安装--Kubeadm+contained+公网 IP 多节点部署

云原生 k8s Kubernetes 集群

今晚19:00知识赋能第2期直播丨OpenHarmony智能家居项目之控制面板界面设计

OpenHarmony开发者

Open Harmony

14岁懂社会-《关于“工作的幸福”这件事儿》读书笔记

懒时小窝

14岁懂社会

Flutter 中的 ValueNotifier 和 ValueListenableBuilder

坚果

flutter dart 6月月更

用Python编写学生成绩计算系统

王小王-123

Python 成绩计算系统 成绩项目 日常编程

国内首批!阿里云云原生数据湖产品通过信通院评测认证

阿里云大数据AI技术

大数据 运维 存储

Go 语言入门很简单:Go 处理 XML 文件

宇宙之一粟

xml Go 语言 6月月更

Scala 基础 (四):函数式编程【从基础到高阶应用】

百思不得小赵

scala 函数式编程 大数据开发 6月月更

用Python编写学生成绩管理系统(内附源码)

王小王-123

Python 系统设计 用python编写成绩管理系统 学生成绩管理系统

OLAP数据库引擎如何选型?

奇点云

OLAP 数据库引擎 OLAP数据库

百度直播iOS SDK平台化输出改造

百度Geek说

ios 直播

实现多方数据安全共享,解决普惠金融信息不对称难题

易观分析

数据安全

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