最近一段时间,一个诡异的内核问题困扰着格蠹的内核开发团队。在测试幽兰的系统镜像时,有一个随机的内核oops。
一旦这个oops发生,那么便产生一系列连锁的不良反应:比如声音无法播放,reboot失败等等。
内存越界
7月30日那天,我一边准备关于Windows 719大蓝屏的讲义,一边看这个oops,并在直播中提到了这个诡异的oops。
这个oops与719大蓝屏类似,也是非法访问内存,也就是通常所说的越界。内存是软件的舞台,内存问题就是人类社会的住房问题,千头万绪,盘根错节。
有趣的是,越界访问的内存地址非常奇怪,不是一般的0指针,也不是明显的小指针(小于4096的地址),而是一个很长的地址:
003a72656c646e69
根据多年的经验,我一眼看出这个地址中包含很多可读的ASCII字符,使用windbg的.formats命令转换,果然如此:
0:000> .formats 203a72656c646e69
Evaluate expression:
Hex: 203a7265`6c646e69
Decimal: 2322294337798696553
Octal: 0200723446255431067151
Binary: 00100000 00111010 01110010 01100101 01101100 01100100 01101110 01101001
Chars: :reldni
Time: Wed Jan 23 00:02:59.869 8960 (UTC + 8:00)
Float: low 1.10463e+027 high 1.57927e-019
Double: 1.9725e-153
也就是错误地址刚好对应的是" :reldni"这8个字符。把字节序调整一下,就是"indler: "。注意冒号后面还有一个空格(在栈上找到,有时体现在寄存器里)。