bochs上的一次调试
一次bochs上的调试
3个线程不断的打印,导致GP异常,我开始以为是线程同步问题,访问了25x80显存,
如何找到合适的断点?
异常是在3个线程运行一段时候后才产生,那么线程产生附近的代码行的地址怎么得到呢?
比如找到thread_start
函数地址,
查看链接出来的内核镜像的符号表
直接显示出编译后的符号的虚拟地址,
nm kernel.bin | grep thread_start
这一步非常好
打断点
b 0xc0002e1b
显示外部中断信息
show extint
拿到产生GP异常的指令前的指令数,方便打指令数断点
则可以在产生GP异常前一个指令处下断点,
sba (绝对的指令步长断点), sb是相对,既对于当前指令开始
重新执行一次bochs,再来下断点
sba 203754339
来到异常前,c
可以看到产生GP异常的指令是mov byte ptr gs:[bx],cl
现在几乎可以确定是访问显存越界了
单步执行看看是不是异常
s
:单步执行
果然是进入异常了
和我们编写的中断处理程序一样
查看ebx寄存器 和 gs 描述符
info gdt
+r
段界限是0x7fff,访问方式是gs:[bx]
,则bx作为偏移量已经是9f9e
,已经越界了
尝试访问越界地址
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!