昨天遇到一个bug,通过检查日志初步推断是condition A造成的,gcore 之后,通过检查core文件,发现“确实”是condition A照成的。
于是就各种查是什么原因导致了 condition A。
然而,一个小时过去了,并没有发现代码中的任何分支会照成condition A。TCP机制也不太可能造成 condition A。
于是,再次回头检查了一下core文件,发现 condition A并不存在,最后仔细检查 core文件,发现是另外一种 condition B造成了这个bug。
接下来,仔细分析condition B发生的原因,最终找到了bug发生的根本原因。
两次检查core文件,诊断结果不同,是因为我对系统不够了解,不了解 redis aeEventLoop实现的底层细节,就根据自己的理解擅意 condition A是存在的。
这次调试有两点经验:
1.了解系统,不了解的地方不要擅意猜想。
2. 随时检查插头。我们的猜想一般是建立在某些假设的前提上的,当发现自己的猜想不正确的时候,可以检一下这些前提是否存在。