调试复杂系统时,最大的难点在于定位问题,如果弄清楚了问题产生的机理,那么就能有针对性的进行解决。
调试复杂系统时,遇到不好定位的问题,就要大胆去猜、去怀疑、去假设,尤其是应该重点怀疑多线程访问(读或写)共享变量的逻辑是否正确,比如系统中某个变量的值在时序上只能出现:0, 1, 0, 1, 0, 1
的变化情况,并且任何 1, 1
或 0, 0
的变化序列都会导致出现问题,那么我们应该想方设法去测试这个变量在系统运行的过程中是否出现了不符合预期的变化序列,以此作为解决问题的突破口。
验证某个假设是否成立的任务可以交给 assert()
函数来实现,它能够在出现某种不符合预期的情况时终止程序的运行,这样我们就能更加靠近问题出现的第一现场。在 C/C++
里面,assert()
函数的定义如下:
#include <assert.h>
void assert(scalar expression);
例如,我们可以这样来用 assert()
去保证程序在关键节点时的运行结果是正确的:
#include <stdio.h>
#include <assert.h>
int accumulate(int a, int b) {
int sum = 0;
for (int i = a; i < b; ++i)
sum += i;
return sum;
}
int main(void) {
int ret = accumulate(0, 100);
if (ret != 5050) {
printf("ret = %d\n", ret);
assert(ret == 5050 && "The result of accumulation from 0 to 100 is wrong!");
}
return 0;
}