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

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

关注

评论

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

AI 聊天机器人开发框架及其特点

北京木奇移动技术有限公司

软件外包公司 AI机器人 AI聊天

等保三级测评流程解析以及相关问题解答

行云管家

等保 等保测评 等保三级

越“挖”越有料,天翼云“息壤”助攻DeepSeek变身万能搭子!

天翼云开发者社区

人工智能 算力 AI应用 DeepSeek

用户的声音 | 文档结构化信息提取方案测评:LLM、开源模型部署与云端API,谁是合适选择?

合合技术团队

#大模型 文档解析 #数据

解读TaurusDB二级分区,如何提高查询性能和管理效率

华为云开发者联盟

MySQL 数据库 TaurusDB 分区表

澜舟智搭×DeepSeek:企业智能体平台全面升级,打造AI Agent应用新范式

澜舟孟子开源社区

人工智能 DeepSeek DeepSeek v3 DeepSeek-R1

龙伯透镜天线 --- 空间变化介电材料【CST仿真案例】

思茂信息

cst cst电磁仿真 CST软件

AI工作流程开发框架

北京木奇移动技术有限公司

AI智能体 软件外包公司 AI流程

告别混乱!浩辰CAD看图王让项目管理井井有条

在路上

cad cad看图 CAD看图王

文献解读-Thiabendazole Inhibits Glioblastoma Cell Proliferation and Invasion Targeting Mini-chromosome Maintenance Protein 2

INSVAST

肿瘤测序 Sentieon GATK 基因变异检测 生物信息分析服务

即时通讯安全篇(一):正确地理解和使用Android端加密算法

JackJiang

网络编程 即时通讯 IM

DeepSeek:探索AI辅助创作的无限可能

测吧(北京)科技有限公司

测试

零信任供应侧稳步发展并持续创新

芯盾时代

身份安全 零信任 统一身份管理平台

AI与低代码结合:中小企业的技术弯道超车之道

天津汇柏科技有限公司

AI 低代码

利用TencentOS 在企业私有化场景中快速部署DeepSeek

TencentOS

Linux 操作系统 DeepSeek TencentOS

终于搞懂MES和WMS系统的区别了

积木链小链

数字化转型 制造业 wms mes

Svelte 最新中文文档教程(12)—— 样式

冴羽

vue.js 前端 React Svelte SvelteKit

DeepSeek 对人形机器人赛道影响

机器人头条

机器人 科技 大模型 人形机器人 具身智能

【GreatSQL优化器-14】直方图应用

GreatSQL

优化器 直方图

CAD神器来了!让你的CAD标注效率翻倍

在路上

cad cad看图 CAD看图王

《Operating System Concepts》阅读笔记:p41-p49

codists

操作系统

云上玩转DeepSeek系列之三:PAI-RAG集成联网搜索,构建企业级智能助手

阿里云大数据AI技术

人工智能 LLM rag PAI DeepSeek

Java Stream API:每个开发者都应该知道的 3 件事

码界行者

Java

面试官:说说你项目中JWT的执行流程?

王磊

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