从虚拟化前端Bug学习分析Kernel Dump( 五 )

在 symbol 安装完之后 , 就可以通过 crash 载入 corefile 和 symbol 了 。

通过 crash 载入 corefile 的时候 , crash 会自动输出一段信息 , 这段信息包含了系统的一些基本信息 , 如 CPU、内存、架构等 。 如果后面分析的时候还想看这部分信息 , 可以通过 sys 命令来查看 。 这里我们需要重点关注的信息是
PANIC: \"kernel BUG at drivers/virtio/virtio_ring.c:278!\"
这个信息告诉我们 , 系统触发了位于 drivers/virtio/virtio_ring.c 这个文件的第 278 行的 Bug , 这里系统之所以知道是 Bug , 是因为编写这段代码的大佬在这里埋了一个检测的点 , 这个待会我们会在源码里看到 。
在看完上面的信息后 , 我的习惯是先看看当时系统在做什么 , 通过 bt 命令可以看到当时的调用堆栈:

上图打印的信息包含函数调用堆栈和各寄存器的值 , 这里挑几个比较重要的寄存器讲一下 。 RIP 指向正在执行的指令地址 , 在发生宕机之前 , 系统最后执行的函数是 virtqueue_add , 导致宕机的语句位于 virtqueue_add+1186 。 根据 x86_64 Linux 系统的函数调用约定 , RDI RSI RDX RCX R8 R9为传入函数的前六个参数 , 如果参数超过六个 , 第七个以上的参数将通过栈传递 。 注意在实际函数执行的过程中 , 寄存器的值可能会改变 。

推荐阅读