一、直接确定发生错误的函数 看到这句 “PC is at segment_test_open+0x1c/0x28 [first_drv]”,出现错误时我们最关注的就是PC值,因为它就是发生错误 的指令的地址,这里我们可以看到错误发生在函数 segment_test_open 的0x1c处,0x28代表这个函数的总长度(汇编代码)
二、根据PC值确定发生错误的函数
有时候不会直接告诉你发生在哪个函数,而是只把PC值告诉你: pc : [] 这时你要根据PC值自己找到发生错误的地方,怎么找呢?
现在我们知道发生错误时 PC = 0xbf0d701c,我们首先要确定发生的错误位置是在内核中还是在外面的模块里, 然后根据PC值找出发生的函数及指令。怎么确定?
1. 进入到我们内核源码的根目录下,找到System.map,这个文件指示了所有的内核函数的地址范围, 我们可以观察,发生错误时PC值是不是在这个文件的地址范围内,例如我的这个文件的地址范围是: c0004000 A swapper_pg_dir ~~~ c04ec044 B _end
从这些信息里找到一个与PC值相近的地址 比如找到了: 00000000 a first_drv.c [first_drv] bf0d7000 t $a [first_drv] bf0d7000 t segment_test_open [first_drv] bf0d7024 t $d [first_drv] bf0d7028 t $a [first_drv] bf0d7028 t segment_drv_exit [first_drv]