bochs上的一次调试

一次bochs上的调试

3个线程不断的打印,导致GP异常,我开始以为是线程同步问题,访问了25x80显存,

1

如何找到合适的断点?

异常是在3个线程运行一段时候后才产生,那么线程产生附近的代码行的地址怎么得到呢?

比如找到thread_start函数地址,

查看链接出来的内核镜像的符号表

直接显示出编译后的符号的虚拟地址,

nm kernel.bin | grep thread_start

这一步非常好

2

打断点

b 0xc0002e1b

显示外部中断信息

show extint

拿到产生GP异常的指令前的指令数,方便打指令数断点

3

则可以在产生GP异常前一个指令处下断点,

sba (绝对的指令步长断点), sb是相对,既对于当前指令开始

重新执行一次bochs,再来下断点

sba 203754339

来到异常前,c

4

可以看到产生GP异常的指令是mov byte ptr gs:[bx],cl

现在几乎可以确定是访问显存越界了

单步执行看看是不是异常

s:单步执行

果然是进入异常了

5

和我们编写的中断处理程序一样

6

查看ebx寄存器 和 gs 描述符

info gdt +r

7

段界限是0x7fff,访问方式是gs:[bx],则bx作为偏移量已经是9f9e,已经越界了

尝试访问越界地址

8