背景:
在使用llvm libtooling库解析cpp代码的时候,会出现字符串解析为invalid的情况,初步排查是编译数据库command命令的影响,command有很多个编译选项,要确定哪个编译选项影响的呢?这时候就可以用到二分法定位
什么是二分法定位bug?
二分查找算法大家都知道,二分法定位也是同样的解决思路,每次把问题缩小到一半,这样定位的次数就是log2n的次数,大大减少了定位的次数,节省了时间。
-
确定范围:首先确定程序中可能存在问题的代码段或模块。
-
二分划分:将可能存在问题的代码段分成两部分,尝试分别运行这两部分代码。
-
观察结果:运行第一部分代码,观察程序是否出现错误。如果错误出现,说明问题可能在这一部分;如果没有错误,问题可能在第二部分。
-
缩小范围:根据上一步的观察结果,将问题范围缩小到前半部分或后半部分。
-
重复二分:在确定问题所在的大致范围后,继续将这一部分再次二分,并重复步骤3和4。
-
细化定位:逐步缩小问题范围,直到能够精确定位到具体的函数调用、代码行或条件判断。
举个例子
背景说明了遇到的问题,以下这些是编译选项
-std=c++14
-Wall
-Wextra
-Werror
-O0
-O1
-O2
-O3
-Os
-g
-D
-U
-I
-L
-l
-pthread
-fPIC
-fpic
-fopenmp
-fexceptions
-nostdinc
-static
我们第一次定位问题,就把上面的编译选项缩减到一半,如下
-std=c++14
-Wall
-Wextra
-Werror
-O0
-O1
-O2
-O3
-Os
-g
-D
如果解析的字符串依然是invalid,那么说明问题出现在留下来的编译选项里,继续留一半,如此下去,就可以确定哪个编译选项影响了。
结论:
用二分法定位bug,一般是只有单个因素影响的,如果是多个因素,就需要逐个排查配合二分法使用了