2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

关注

评论

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

放弃 SpringCloud Gateway!Apache APISIX 在「还呗」业务中的技术实践

API7.ai 技术团队

spring-cloud SpringCloud Gateway APISIX 网关 开源、

Zebec地平线节点运营计划,Web3流支付赛道或多一条全新公链

鳄鱼视界

激活工具带毒,静默安装360、2345系列软件

火绒安全

安全 下载器 病毒 恶意软件

Kubernetes 认证管理员(CKA)必过心得

HummerCloud

云原生 CKA #k8s Kubetnetes kubernetes 运维

“超越融合 异筑信创”,AntDB数据库携手超云等生态伙伴共建信创大生态

亚信AntDB数据库

AntDB AntDB数据库 企业号十月PK榜 企业号十月 PK 榜

React-diff原理及应用

xiaofeng

React

深入分析React-Scheduler原理

xiaofeng

React

Apache Dolphin Scheduler 3.0.1 发布,对核心及UI相关进行优化

白鲸开源

海豚调度 Apache DolphinScheduler 任务调度 版本发布 新版本/特性发布

【开发者说】一课表,你的智能课业管理工具

HarmonyOS开发者

HarmonyOS

React源码分析6-hooks源码

goClient1992

React

React Context源码是怎么实现的呢

flyzz177

React

25分钟了解php?php基础

贤鱼很忙

php 10月月更

【直播回顾】OpenHarmony知识赋能第八期:手把手教你实现涂鸦小游戏

OpenHarmony开发者

OpenHarmony

2022年9月国产数据库大事记-墨天轮

墨天轮

数据库 opengauss TiDB 国产数据库 KingBase

leetcode 236. Lowest Common Ancestor of a Binary Tree 二叉树的最近公共祖先(中等)

okokabcd

LeetCode 数据结构与算法

广州云管平台有哪些?联系方式是什么?

行云管家

云计算 企业上云 云管平台 广州

VoneBaaS团队成功入围第二届中国可信区块链安全攻防大赛决赛

旺链科技

区块链 产业区块链 VoneBaaS BaaS平台

我对软件工程的理解

老张

软件工程 质量保障

ReactDOM.render在react源码中执行之后发生了什么?

flyzz177

React

React核心技术浅析

夏天的味道123

React

快手 RocketMQ 高性能实践

阿里巴巴云原生

阿里云 RocketMQ 云原生

React源码分析5-commit

goClient1992

React

React生命周期深度完全解读

夏天的味道123

React

【等保小知识】等保测评整体测评是什么意思?

行云管家

等保 等级保护 等保测评 等保2.0

DAPP系统开发Web3.0技术实现

薇電13242772558

dapp web3

StoneDB 团队成员与 MySQL 之父 Monty 会面,共话未来数据库形态

StoneDB

MySQL 国产数据库 HTAP StoneDB 10月月更

浅谈Vue3组件通信

CoderBin

Vue 前端 10月月更

公共数据开放落地细则探讨,企业如何合规取用?

Jessica@数牍

安全隐私 公共数据开放 安全合规

NFTScan 是什么?

NFT Research

区块链 NFT 多链 数据基础设施

深度探讨react-hooks实现原理

xiaofeng

React

MobPush Android常见问题

MobTech袤博科技

android

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