崩溃|生产环境下高并发程序崩溃?麻州大学让多线程软件故障分析自动化

【崩溃|生产环境下高并发程序崩溃?麻州大学让多线程软件故障分析自动化】机器之心专栏
机器之心编辑部

能够实现自动化错误分析 , 麻州大学研究团队推出的 Watcher 让生产环境多线程程序的调试不再那么困难 。
软件调试是非常枯燥而又技术难度很高的工作 , 其中软件故障的自动化分析是几代程序员共同的梦想 。 进入多核时代后 , 多个线程的并行处理极大地提高了程序性能 , 但同时任务的交织又使得程序运行结果更难以重现 , 这让调试工作变得更加艰巨 。
近日 , 麻萨诸塞大学阿默斯特分校(University of Massachusetts Amherst , 简称「麻州大学」)的电子与计算机工程系刘通平教授领导的研究团队最近开发一个名为 Watcher(哨兵)的自动化多线程软件故障分析工具 , 可以在几秒钟或者几分钟内自动精准定位软件错误原因 , 有望彻底解决生产环境下并行程序调试困难的问题 , 能显著提高自动驾驶等关键系统的可靠性 。
从智能手表到大型服务器 , 零售终端到金融交易平台 , 软件服务存在于日常生活的方方面面 , 极大的便利了人们的日常生活 。 但是 , 软件中总会包含一些潜在的缺陷或者 bug 。 尽管严格的软件测试有助于尽早发现这些缺陷 , 但是开发人员往往迫于压力 , 在没有进行全面测试的情况下就匆匆将软件发布 。 而且有些软件缺陷只在特定输入条件下才会触发 , 或者只在特定的任务交互下才会显现 , 即使是严格的测试也并不能完全消除大型软件中的所有缺陷 , 尤其是并发软件中的缺陷 。 这些程序的缺陷常常成为软件测试的漏网之鱼 , 进而导致运行过程中系统崩溃、程序挂起、或引发安全漏洞 。
尽管目前存在一些可用的软件调试系统 , 但大都需要人工干预 。 这样的系统在实际应用生产环境中是无法直接部署的 。 人们经常使用微软公司的办公软件 , 但是你不能指望普通用户能够调试这些软件问题 。 普通用户既没有能力 , 也没有义务去帮忙调试 。 因此 , 软件公司只能收集用户的错误报告 , 然后进行离线诊断 。 但离线诊断又有各种弊端:
第一 , 因为数据上传时并不能区分出故障相关信息 , 离线诊断必须收集错误现场的所有数据 , 其中也会包含一些用户的隐私数据 。 比如 , 用户刚刚用 IE 浏览器登陆网上银行账号然后崩溃 , 其错误报告就会包含用户的账号和密码等隐私信息;
第二 , 因为离线诊断通常依赖于统计方法 , 或者通过错误状态反向推理程序运行的状态 , 这些方法的诊断能力都十分有限 。 因此 , 迫切需要更有效的软件诊断系统来取代传统的离线诊断方法 。
「无论技术如何进步 , 软件故障始终是一个令人担忧的问题」刘通平教授表示:「我们研究的软件故障诊断系统 Watcher 可以在原始的运行环境中现场快速地诊断程序故障的根本原因 。
跟以往的工具相比 , Watcher 避免了其他分析软件的隐私问题 。 用户不再需要上传整个内存镜像 , Watcher 也只会提供报告软件相关故障的报告 。 而且 , Watcher 可以轻松部署 , 不依赖于定制的硬件或操作系统(不过目前 Watcher 只提供了对 Linux 系统的支持) , 也不需要修改程序代码或者重新编译程序 。 研究团队利用 Watcher 成功检测了几十种软件(包括一些大型应用)中发生的故障 。 评估结果显示 , Watcher 可以在短短几秒钟内准确识别出软件故障的根本原因」 。
「冰冻三尺 , 非一日之寒 , 骐骥千里 , 非一日之功」 。 这项软件故障诊断的突破也是来自于刘教授和其研究团队的长期耕耘和努力:早在 10 年前 , 刘通平教授还是博士生的时候 , 他就开始研究并行软件的确定性问题 , 其成果发在计算机软件系统的最顶级会议 - 操作系统原理大会(SOSP'11) 。 在博士阶段后期 , 他开始研究 Watcher 软件系统的基础工作 , 一种确定性的记录重放系统(record-and-replay) , 相关的成果发表在软件工程顶会(ICSE‘16)和编程语言的顶会(PLDI‘18) 。 2015 年刘教授还在德州大学圣安东尼奥分校工作时 , 他的学生刘宏宇继续这一方面的研究工作 , 经过 8 年的辛勤工作 , 软件故障诊断才有了今天的重大突破 。
刘教授介绍说:「Watcher 的成功离不开它的基石 --iReplayer , 它也是我们组 PLDI‘2018 的工作 。 iReplayer 能够准确无误的复现程序错误运行情况的系统 , 保证程序运行的一致性:在重新执行过程中 , 相同指令将对与原始运行时完全一致的存储单元 / 寄存器执行相同的读写操作 。 这一特性这为软件故障诊断打下了坚实的基础」 。 正是基于 iReplayer , Watcher 才能够实现现场诊断软件错误 , 其基本原理如下图所示:

崩溃|生产环境下高并发程序崩溃?麻州大学让多线程软件故障分析自动化
文章图片

Watcher 作为一个运行库存在 , 可以和待检测的程序相链接 。 在程序正常运行时 , Watcher 对程序的运行情况进行一些记录 , 但其性能开销低于 3% 。 当程序发生错误时 , Watcher 的诊断模块将被自动开启 , 并在重放过程中进行自动诊断 。 Watcher 将二进制静态分析、动态分析与硬件调试技术结合在一起实现了自动化软件故障诊断 。 目前该研究已发表在程序语言与软件工程类顶级学术会议OOPSLA‘2020 , 相关合作单位还包括普渡大学、德州大学圣安东尼奥分校、和伊利诺伊大学香槟分校 。
Watcher 的程序错误诊断基于一个关键发现:程序错误通常是由于程序将错误或无效的值写入某个内存中 , 并在随后的运行中引发异常所导致 。 基于这个发现 , Watcher 采用混合分析法来确定导致程序错误发生的内存单元、相关的指令和错误值传播路径 。 在二进制分析中如果出现不能确定的情况时 , Watcher 利用重放运行过程再次收集和确认程序错误相关的信息 , 做到准确无误的报告程序错误的根本原因 。 此外 , Watcher 还利用硬件寄存器非入侵式地采集对特定内存的访问 , 并动态地分析程序错误相关片段 。 分析结束后 , Watcher 会生成一个对于错误值的完整报告 , 程序员根据其报告能够快速定位和修复这个程序错误 。
Watcher 的优点之一是可以在软件开发、部署、生产的所有阶段中使用 。 可以预见 , Watcher 将对各种急需现场错误诊断的系统非常有用 , 尤其是人身安全相关的领域 , 比如航空系统或者自动驾驶 。 自动驾驶领域的一大痛点问题是如何快速的进行错误诊断 , 让程序员能够修复缺陷以提高系统的鲁棒性 。 然而 , 由于无线通信等传输瓶颈无法传输整个内存镜像 , 或者即使有内存镜像也无法准确定位问题 , 自动驾驶企业很难快速地优化系统 , 从而带来潜在的安全隐患 。 因为 Watcher 可以确定失败的根本原因 , 还能避免离线分析或静态分析的多个问题 , 这些痛点问题将通过 Watcher 得到解决 。
根据 2017 年的数据 , 软件故障每年带来超过 1.7 万亿美金的财政损失 , 而且每个程序员每年平均超过 1500 小时用于程序调试 。 无侵入性部署 , 精准自动化复现多线程故障 , 秒级自动错误原因分析 , Watcher 为生产环境下的软件故障分析带来了曙光 , 也将可能会有几十亿美元级别的市场?
论文链接:https://people.umass.edu/tongping/pubs/Watcher_OOPSLA20.pdf
刘教授和其研究团队在软件系统的可靠性、性能优化和安全性方面长期耕耘 , 并期望与企业合作实现 Watcher 等技术的落地 。 如果您对此有合作和投资兴趣 , 请与 tongping@umass.edu 联系 。

    推荐阅读