运维反映某环境宿主机crash,机器已重启恢复,需要尽快查明crash原因,接到任务后,迅速查看crash日志发现是divide error造成的,错误日志如图-1所示,这可是个严重的错误。
图-1
分析了相关错误日志后,定位到错误代码是intel的cpuidle/governors驱动的错误,具体错误位置如图-2所示,thresh被赋值为INT_MAX, 在for循环中比较data->intervals[i]的值时,data->intervals数组中的值都大于INT_MAX, if判断失败,造成sum和divisor都为0;进而造成后续sum/divisor时,除数是0,引发错误。
图-2
分析crash文件,发现出错时data->intervals数组中所有值都是4294967293,大于INT_MAX, 进一步确认出错位置。
图-3
由于出问题的操作系统出自openeuler,查看openeluer对此代码的修改历史,发现此问题已修复,
图-4
但运行的系统的版本是还没有合入此patch时的代码,合入此patch后问题解决。
在分析此patch的进一步前因后果时,发现其实是openeuler在合入patch时漏掉了此patch,后续补上造成的,openeuler在4年前的patch引入了bug(图-6),在2年前修复此patch(图-4)。 提交历史见图-5。
图-5
图-6
而在upstream中是先提交的图-4, 再提交的图-6,所以upstream不存在问题,openeuler由于打patch的顺序存在问题,造成了中间版本存在问题。