|
楼主 |
发表于 2006-6-11 14:55:14
|
显示全部楼层
arm-linux-gdb和skyeye之间的交互:
正常的stepi:
<---getpkt:'mc0028000,4'
--->putpkt:'d3f021e3'
<---getpkt:'mc0028000,4'
--->putpkt:'d3f021e3'
<---getpkt:'Z0,c0028004,4'
--->putpkt:'OK'
<---getpkt:'vCont?'
--->putpkt:''
<---getpkt:'Hc0'
--->putpkt:''
<---getpkt:'C01'
--->putpkt:''
<---getpkt:'c'
--->putpkt:'S01'
<---getpkt:'g'
--->putpkt:'000000005b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048002c0d30000000000000000000000000000000000000000000000000000000000000000000000d3000000'
<---getpkt:'z0,c0028004,4'
--->putpkt:'OK'
<---getpkt:'mc0028004,4'
--->putpkt:'510000eb'
当碰到无法停止的beq指令时的stepi:
<---getpkt:'mc0028150,4'
--->putpkt:'4c308fe2'
<---getpkt:'mc0028154,4'
--->putpkt:'600213e8'
<---getpkt:'mc0028158,4'
--->putpkt:'093043e0'
<---getpkt:'mc002815c,4'
--->putpkt:'035085e0'
<---getpkt:'mc0028160,4'
--->putpkt:'036086e0'
<---getpkt:'mc0028164,4'
--->putpkt:'109f10ee'
<---getpkt:'mc0028168,4'
--->putpkt:'180095e8'
<---getpkt:'mc002816c,4'
--->putpkt:'094004e0'
<---getpkt:'mc0028170,4'
--->putpkt:'040033e1'
<---getpkt:'mc0028174,4'
--->putpkt:'0300000a'
<---getpkt:'Z0,c0028178,4'
--->putpkt:'OK'
<---getpkt:'C01'
--->putpkt:''
<---getpkt:'c'
通过包可以看出: 最后那个执行beq指令的stepi无法停下是因为Z0,c0028178,4将断点设置在beq的下一条指令处而非跳转处, 所以无法停下. 那么arm-linux-gdb为什么会设置错误呢?具体原因我还没有搞清楚, 只能猜测: skyeye没有正确的返回CPSR, 所以arm-linux-gdb错误的判断beq不会跳转, 从而将断点放在下一条指令上. 我的猜测是有一些根据的, 在gdb中, arm的register数目定义为26个, 而skyeye的arm_regdefs.h中将ARM_REGNUM定义为18, 所以ARMul_GetCPSR从未被调用过. 但是小弟将 ARM_REGNUM改为26之后, arm-linx-gdb仍然认为cpsr是0, 这个可用info reg看到, 但是从上面的
<---getpkt:'g'
--->putpkt:'000000005b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048002c0d30000000000000000000000000000000000000000000000000000000000000000000000d3000000'
可以看到cpsr的值应该是0xd3才对. 不知道cpsr的register number是不是25?如果是25,那么返回的应该是正确值了, info reg为什么还看到cpsr是0? |
|