b
data accessException current instruction address:0x00460c88Machine Status Register:0x0000b030Data Access Register:0x00001314Condition Register:0x40004084Data storage interrupt Register:0x0a000000507d9c vxTaskEntry +68 : shell ()4dc984 shell +190: 4dc9b0 ()4dcbb0 shell +3bc: execute ()4dcd34 execute +d8 : yyparse ()4f055c yyparse +71c: 4ee8f4 ()4eea78 yystart +96c: b ()4d8a48 b +38 : 4d897c ()4d89f0 dbgInit +b4 : wdbDbgArchInit ()508740 wdbDbgArchInit +4c : excVecSet ()shell restarted.
使用 b 命令需要用到Trace异常,在指令执行到b后面的地址是触发异常进入处理程序从而完成跟踪功能。
具体到这个问题,应该是内存的开始部分被保护了,而异常Trace在0xb000就在这部分内,当初始化这部分功能的时候需要写Trace异常的地址,结果由于内存保护,引发了数据写异常。把保护去掉应该就可以了。
需要解释一下断点发生的流程,每次执行 b xxx 命令的时候是把一个断点的地址加到一个断点列表中,当指令地址与任何一个列表中的断点地址匹配时,将触发一个Trace异常,PC指针跳到0xb000执行。所以在0xb000的地方需要预先安装一个异常处理程序,安装的工作以及前面断点列表的初始化都由dbgInstall来完成。dbgInstall 并没有在初始化的时候调用,因为断点调试功能是一个可选的功能,并不是每个系统启动以后都会用到的,只有在使用的时候才会初始化。设计的时候在 dbgInstall里面加了一个静态变量保存状态,如果没有初始化则初始化一次,如果初始化过了就不再做具体事情。本问题发生的时刻应该在第一次使用b 命令的时候。
安装异常处理程序就需要更改0xb000的地址了,有时间可以看一下异常处理的代码,在一定偏移的地方,有一个跳转,所谓安装异常处理程序,实际上就是把异常处理程序的函数首地址写在跳转指令处。这个动作必然会修改内存。
阅读(907) | 评论(0) | 转发(0) |