Page 65 - 《软件学报》2025年第7期
P. 65
2986 软件学报 2025 年第 36 卷第 7 期
所有细节状态, 特别是分布式协议中的细微状态转移等内部状态信息. 为了弥补这一不足, 可以采用代码级监控技
术, 通过在代码中插入监控点 (插桩) 来实时追踪系统的执行情况. 这种方法能够记录代码的执行路径、分支选择
以及函数调用等详细信息, 提供更丰富的系统运行细节. 借助这些数据, 测试工具能够更加全面地了解系统的行为
状态, 从而提高测试的精确性和有效性.
3.2.2 代码插桩
图 7 展示了分布式系统动态测试工具中代码插桩的基本流程. 首先, 获取待测系统源代码并进行静态分析, 识
别基本代码块和控制流分支. 随后, 利用编译器技术进行插桩, 在源代码中嵌入用于跟踪执行情况和关键状态的特
殊代码段, 生成增强版可执行文件. 运行时, 这些代码段在特定操作执行时激活, 记录测试输入的执行细节, 包括执
行路径和关键状态变化. 这些详细的执行信息帮助测试工具实时分析系统行为, 识别异常状态或行为. 通过分析代
码覆盖率数据, 测试工具评估测试输入的覆盖范围, 并优化测试策略, 生成新的测试输入以更全面测试系统, 挖掘
潜在缺陷. 根据插桩流程不同, 常见插桩工具分为 3 类: 源码静态插桩、编译器插桩和二进制插桩.
待测系 目标函数/ 逻辑插桩 跟踪获取
统源码 代码块识别 系统状态
图 7 动态测试工具进行代码插装的基本流程
早期的插桩工具直接在源代码中添加或修改代码, 以在程序执行时收集实时信息, 如执行路径和变量状态. 针
对 C/C++程序代码, 典型的工具有 Gcov/Lcov [98] , 它是 GNU 工具链的一部分, 通过在源代码中插桩来收集程序执
行信息, 帮助实时获取分析测试覆盖率指标. 另一个工具是 JaCoCo [99] , 它是为 Java 程序设计的代码覆盖率库, 通
过在字节码层面插桩, 支持 Eclipse 和 Maven 等集成, 常用于 Java 项目的测试覆盖率分析. 这种方法提供了高度的
灵活性, 但可能会影响原始代码的结构和性能.
不同于源代码修改, 常用编译工具 GNU Compiler Collection (GCC) 提供的“-finstrument-functions” 选项是一
种编译时插桩技术, 允许开发者在每个函数的出入口自动插入用户定义的监控逻辑. 在编译阶段编译器会在每个
函数的开始处调用 “__cyg_profile_func_enter” 接口, 在函数返回前调用 “_cyg_profile_func_exit” 接口. 这两个接口
需要由开发者实现具体的监控逻辑, 它们的参数包括当前函数和调用者的地址, 使得动态测试器可以跟踪函数的
调用情况, 如调用次数、执行路径等. 这项技术对于测试分析、调试和理解程序行为非常有用, 尤其是在需要深入
分析程序执行细节的场景中. 通过这种方式, 动态测试工具可以在不修改源代码的情况下, 获得关于程序运行时行
为的详细信息, 从而帮助动态优化测试流程和诊断系统中代码缺陷.
不同于源码静态插装和编译器插桩, Intel PIN 是一个强大的动态二进制插桩框架, 允许测试器在不访问源代
码的情况下对运行中的程序进行监控和分析. 作为一个运行时重写工具, PIN 提供了一种灵活的方式, 将自定义的
分析代码注入到目标应用程序的二进制文件中. 开发者可以使用 PIN 跟踪程序的执行, 收集各种运行时信息, 如函
数调用、内存访问模式、分支预测和指令使用情况等. PIN 的插桩在程序运行时动态完成, 这意味着可以在不重
新编译目标程序的情况下对其行为进行深入分析和调整. 这使得 PIN 成为测试分析、程序调试、软件安全检测等
领域的有力工具, 特别适用于复杂软件系统和闭源应用程序的分析.
虽然代码插桩技术在获取系统运行信息方面表现出色, 但其侵入性质要求测试人员必须能够访问甚至修改待
测分布式系统的源代码或二进制程序, 这对测试对象的控制权要求较高, 从而限制了该技术的应用范围和普适性.
考虑到在许多实际测试场景中无法获得目标源代码或二进制程序, 为了降低测试工具对被测试系统的依赖, 减少
测试的侵入性并提升工具的适用性, 一种可行的策略是利用分布式系统提供的 API 接口来动态捕获关键的系统状
态信息.
3.2.3 动态接口感知
图 8 展示了分布式系统动态测试工具中动态接口状态感知的流程. 首先, 收集待测系统的 API 清单, 并根据测
试目标筛选关键 API. 在测试执行过程中, 状态收集器动态调用这些 API, 实时捕获系统的关键状态信息. 随后, 这
些状态信息用于行为分析, 识别系统行为异常并进行缺陷判断. 通过此方法, 测试工具能够高效监控系统状态, 及
时发现和定位潜在缺陷, 提升测试效率和准确性.

