Page 92 - 《软件学报》2021年第9期
P. 92
2716 Journal of Software 软件学报 Vol.32, No.9, September 2021
2 问题定义
日志打印位置决策的目的是从系统源码中选择需要添加日志打印语句的位置(代码行),但是现有的软件系
统规模极其庞大,代码量巨大,导致需要添加日志打印语句的位置占所有日志代码行的比例小于 1%,这会导致
训练数据极度不平衡,难以构建机器学习模型.为解决该问题,本文首先定义了代码块(CodeBlock)的概念,并使
用代码块作为日志打印位置决策的基本单位,即,将该问题转化为对代码块中是否添加日志打印语句进行决策.
代码块是一段不包含任何层次或嵌套结构的代码片段.代码块的提取可以通过两种标识符切割,包括分支
或循环的起点和分支或循环的终点.以图 1 为例,该图截取了 Hadoop-YARN 项目中 RMAppManager.java 文件中
的一个函数,通过“{”和“}”对该函数进行切分,共获取了 5 个代码块.本质上讲,代码块是一段顺序执行的代码行
的集合,以代码块为基本决策单位,能够有效降低日志打印位置决策问题的复杂性,大大降低训练数据的不均衡
程度.通常而言,一个代码块内部的日志打印语句通常表征该代码块的功能或执行结果,因此大多数情况下,一
个代码块中通常只包含一个日志打印语句,且这个日志打印语句的具体位置不重要.经过对 hadoop 2.8.1 源代码
的统计分析发现:在包含日志打印语句的所有代码块中,有 12 812 个代码块仅包含一条日志打印语句(占比
95.1%),658 个代码块包含多于一条日志打印语句(占比 4.9%).以图 1 中代码块 1 的日志打印语句为例,不论该语
句位于代码块 1 中的哪一行,该日志打印语句所表达的信息不受影响.另外,代码块作为一个抽象的概念,具备较
强的通用性,能够适配不同的程序开发语言编写的软件系统.代码块不同于程序基本块(BasicBlock):基本块的
划分以程序功能为依据,包括一个单一入口和出口;代码块则是以程序结构为划分依据,其粒度小于基本块.经
过对 hadoop 2.8.1 源代码中所有代码块包含的代码行数进行统计,结果表明,平均每个代码块包含 4.443 行代码.
因此,对于日志打印位置决策任务而言,以代码块为粒度决策日志打印位置,能够有效地辅助程序开发人员打印
日志.
Code B lock 1
{logged}
Code B lock 2
{unlogged}
Code B lock 3
{unlogged}
Code B lock 4
{unlogged}
Code B lock 5
{logged}
Fig.1 Example of program and code block
图 1 程序片段与代码块示例
以代码块为基础,这里明确本文的研究目标.
令某代码块为 cb i ∈{cb x |0≤x≤p},其中,p 代表所有代码块的数量.本文旨在构建一个日志打印位置决策模
型 F(~),预测代码块 cb i 的标签类型为 logged 或 unlogged,形式化如下:
label i =F(cb i ).
其中,label i ∈{logged,unlogged}.
3 方法概述
图 2 给出了本文所述方法的整体流程和框架.