skyeye-1.2-RC7-3对单步调试的支持问题
ARMul_ICE_debug中用断点列表判断是否state->Emulate=STOP, 单步命令(si)也会在这个列表中放置一个临时的断点, 但是在碰到beq指令的时候, 这个断点列表里面的那个临时断点的值是错误的, 所以会导致arm-linux-gdb的si命令无法得到回应, 表现就和continue命令一样. 事实上, 这个时候state->Emulate=RUN, 确实和continue命令执行时一样.我用的arm-linux-gdb是Denx EDK4.0 for ARM中的.版本: GNU gdb Red Hat Linux (6.3.0.0-1.21_1rh) 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?
页:
[1]