Web应用程序泄漏内存的可能性至少与常规应用程序相同。Web泄漏会显著增加浏览器的内存占用,降低应用程序的响应能力,甚至导致浏览器标签页崩溃。这种泄密无处不在,在人们日常使用的网站上随处可见——谷歌地图、火狐浏览器、谷歌Analytics或Airbnb等等。它们是出了名的难以诊断:开发人员看到了内存使用的增长,但导致增长的语句究竟在哪里?
尽管有大量关于常规(Java、c++、Python等)应用程序的泄漏检测的文献,但是以前的技术并不适用于Web应用程序,因为在Web应用程序中,泄漏表现出非常不同的特征。例如,开发人员可能忘记删除某些事件监听器,因此这些监听器对象在堆中仍然是可访问的。虽然应用程序不再使用它们,但它们仍然响应事件(例如,当用户在编辑器上使用鼠标时),保持它们的状态“新鲜”。因此,现有的基于过时的(即从上次访问到现在的时间)来识别可疑对象的技术—这些技术在许多传统应用程序上都有效—将完全错过Web应用程序中的这些泄漏。
这里的一个关键研究问题是:什么是正确的泄漏预言,可以精确地捕捉Web应用程序中的泄漏行为?换句话说,什么样的物体应该被认为是可疑的?一旦这个问题得到回答,开发一个动态分析来发现这样的物体将是一步之遥。
下面的文章对这个问题提供了一个简单但出乎意料的答案:泄漏对象与正常行为的对象的区别在于,它们的行为是否遵守特定的高级语义规则,而不是低级语义不可知的访问模式。Web应用程序中一个明确的语义规则是,如果用户导航到一个Web页面,然后返回到原始页面,应用程序的内存消耗应该保持(大致)相同。换句话说,这种导航“往返”的内存消耗可以用作泄漏oracle—如果应用程序在返回原始页面时消耗了大量内存,那么应用程序发生内存泄漏的可能性就很大。
通过使用BLeak,作者能够准确、快速地识别出广泛使用的Web应用程序(包括Airbnb和Firefox调试器)中的重要漏洞。
基于这些观察,作者创建了一个Web调试器,可以帮助开发人员快速查找泄漏的原因。惨淡使用一个用户定义的脚本来驱动应用程序进入一个导航往返循环。接下来,它通过不同的堆快照来标识每次往返都在增长的堆路径。BLeak将这些路径进行排序,以找到“泄漏根源”,捕捉与排名靠前的泄漏根源关联的调用堆栈,并将它们一起报告给用户进行泄漏诊断。通过使用BLeak,作者能够准确、快速地识别出广泛使用的Web应用程序(包括Airbnb和Firefox调试器)中的重要漏洞。
这些结果既令人印象深刻,又有抱负,特别是在至少20年的内存泄漏研究的背景下。之前的工作揭示了一系列低级的“症状”,这些“症状”表征了各种应用程序的泄漏。这些症状是在对象读写级别定义的,通常与泄漏的实际原因相差甚远。当新的应用程序出现时,这些旧的症状与泄漏不再相关。荒凉进一步探索了语义感知诊断,并证明了由开发人员提供的简单语义信息(例如往返)可以实现比传统方法使用的语义不可知症状精确数量级的堆跟踪。
展望未来,语义感知的bug诊断和优化是一个令人兴奋的研究方向,特别是考虑到现代应用程序和工作负载正变得越来越复杂和多样化。语义不可知的方法要么无法扩展到大型代码库/堆,要么无法适应现代工作负载的高度多样性。未来的工作可能会受到本文观察的启发,将决定如何利用程序语义来优化不同领域的应用程序。
数字图书馆是由计算机协会出版的。版权所有©2020 ACM股份有限公司
没有发现记录