在进行linux 内核使用jtag ,应用使用gdbserver调试的时候,应用的断点被jtag命中。
发现应用只要bkpt命令,则会导致jtag响应,估计和jtag的驱动监控breakpoint有关。以为是自己内核的断点。
解决方式1:更新驱动,需要中天配合。暂不考虑。
2:修改gdbserver代码(原理:gdbserver修改了断点指令到0(bkpt的指令就是0!),我改为修改为9(trap 1)),
因无gdbserver源码,暂不考虑
3, 内核修改断点使用嵌入点。不使用7的断点,使用trap1(trap0是系统调用,trap2,trap3已经被使用。所以使用trap1).
PTRACE_POKETEXT中截获,当发现本来要改为0的,强制改为9.
case PTRACE_POKETEXT: /* write the word at location addr. */
_flush_cache_all ();
{
//printk("set break!,addr %x data %x\n",addr,data);
}
if((data&0xffff)==0)
{
data+=9;
}
else if((data&0xffff0000)==0)
{
data+=9<<16;
}
{
printk("set datafinish!,addr %x data %x\n",addr,data);
}
ret = generic_ptrace_pokedata(child, addr, data);
break;
测试OK。两边互不影响。
yeh!