下载PDF摘要:尽管软件测试取得了进步,但错误仍然困扰着已部署的软件,并导致生产崩溃。调试问题时-有时是&heisenbugs"引起的-需要解释核心转储,并在部署的同一二进制文件上脱机再现问题。这需要整个工具链(编译器,链接器,调试器)正确生成和使用调试信息。很少有人致力于检查现代工具链是否正确保留了此类信息。优化阶段。这特别重要,因为在优化的生产二进制文件中管理调试信息很简单,通常会导致工具链错误,从而可能会阻碍部署后的调试工作。在本文中,我们介绍了Debug $ ^ {2} $,这是一个在现代工具链中查找调试信息错误的框架。我们的框架将随机源程序提供给目标工具链,并通过手术方式比较了优化/未优化二进制变量的调试行为。这种差异分析允许Debug $ ^ {2} $在每个调试步骤中检查不变性并检测来自不变性违规的错误。我们的不变性基于常见调试实体(如源代码行,堆栈框架和函数参数)的(不一致)一致性。我们展示了,尽管简单,但是这种策略产生了强大的跨工具链和跨语言不变式,可以查明现代工具链中的几个错误。我们已经\ n在LLVM工具链(clang / lldb)中发现了23个错误,在GNUtoolchain(GCC / gdb)中发现了8个错误,在Rust工具链中(rustc / lldb)发现了3个错误-开发人员已经修复了14个错误。