Lab1还差最后一部分,就是给出具体的调试信息,如下面所示:
K> backtrace
Stack backtrace:
ebp f010ff78 eip f01008ae args 00000001 f010ff8c 00000000 f0110580 00000000
kern/monitor.c:143: monitor+106
ebp f010ffd8 eip f0100193 args 00000000 00001aac 00000660 00000000 00000000
kern/init.c:49: i386_init+59
ebp f010fff8 eip f010003d args 00000000 00000000 0000ffff 10cf9a00 0000ffff
kern/entry.S:70: <unknown>+0
K>
和上次的montacktrace相比,增加了eip所在的源文件、对应的源文件行数、函数名以及在相对于该函数地址后的汇编代码的地址偏移。
首先明确,这个功能既然能实现,那么肯定在某个地方以某种方式地方记录着eip和源文件之间的相互对应的信息。
而这个存储的地方就是stab表。
首先使用objdump -G 查看一下kernel生成的obj(obj/kern/kernel)中stab表中的内容,如下:
前5列是stab,第六列不知道含义,第七列对应stabstr,换句话说这个表会原封不动的读入内存,stab部分的地址就是kdebug.