Gdb 软件中断异常或未定义指令异常?

Gdb 软件中断异常或未定义指令异常?,gdb,arm,jtag,bare-metal,Gdb,Arm,Jtag,Bare Metal,我正在裸金属臂上运行一个程序(v5TE兼容),带有JTAG连接器和gdb。该程序在监控模式下从某些SDRAM运行,并且仅使用arm指令 在某一点上会发生异常。使用ctrl+C停止gdb我可以看到CPSR指示未定义的异常模式,但是程序计数器指示软件中断异常(0xffff0008)。根据ARM,当发生未定义的指令异常时,PC\u und应为0xffff0004或0x00000004。我的程序发生了什么,是发生了SWI还是未定义的指令异常 编辑以使我的问题更清楚: 我的程序目的是测试定制板的硬件。当出

我正在裸金属臂上运行一个程序(v5TE兼容),带有JTAG连接器和gdb。该程序在监控模式下从某些SDRAM运行,并且仅使用arm指令

在某一点上会发生异常。使用ctrl+C停止gdb我可以看到CPSR指示未定义的异常模式,但是程序计数器指示软件中断异常(
0xffff0008
)。根据ARM,当发生未定义的指令异常时,
PC\u und
应为
0xffff0004
0x00000004
。我的程序发生了什么,是发生了SWI还是未定义的指令异常

编辑以使我的问题更清楚:

我的程序目的是测试定制板的硬件。当出现硬件问题时,RAM中的程序可能会损坏(如下所示),这是产生异常的原因。当硬件正常时,测试软件运行没有问题。我的RAM地址范围为0到0x40000000,程序加载范围为0x1000到0x2000。管理器模式堆栈指针设置为0xff0。中断向量仅由断点组成

(gdb) c
Continuing.
^C^C
Program received signal SIGTRAP, Trace/breakpoint trap.
0xffff0008 in ?? ()
来自未定义异常模式的寄存器:

(gdb) i r 
r0             0x52878  338040
r1             0x2020000    33685504
r2             0x2020000    33685504
r3             0x2020000    33685504
r4             0x2020000    33685504
r5             0x2020000    33685504
r6             0x2020000    33685504
r7             0x2020000    33685504
r8             0x2020000    33685504
r9             0x2020000    33685504
r10            0x2020000    33685504
r11            0x2020000    33685504
r12            0x2020000    33685504
sp             0x2020000    0x2020000
lr             0xffff0008   4294901768
pc             0xffff0008   0xffff0008
fps            0x0  0
cpsr           0x800000db   2147483867
从管理器模式注册:

(gdb) set $cpsr=0xd3
(gdb) i r
r0             0x52878  338040
r1             0x2020000    33685504
r2             0x2020000    33685504
r3             0x2020000    33685504
r4             0x2020000    33685504
r5             0x2020000    33685504
r6             0x2020000    33685504
r7             0x2020000    33685504
r8             0x2020000    33685504
r9             0x2020000    33685504
r10            0x2020000    33685504
r11            0x2020000    33685504
r12            0x2020000    33685504
sp             0xff3ffffe   0xff3ffffe
lr             0x1020   4128
pc             0xffff0008   0xffff0008
fps            0x0  0
cpsr           0xd3 211 
以下是RAM中的(损坏)程序,位于supervisor link寄存器指向的地址周围:

(gdb) x/5i 0x1020-8
0x1018 <_start+24>: bic r0, r0, #135168 ; 0x21000
0x101c <_start+28>: strbcs  r0, [r0], #1025
0x1020 <_start+32>: mcr 15, 0, r0, cr1, cr0, {0}
0x1024 <_start+36>: ldr r1, [pc, #120]  ; 0x10a4 <skip_intreg_reset+100>
0x1028 <_start+40>: ldr r2, [r1, #8]

(gdb) x/4w 0x1018
0x1018 <_start+24>: 0xe3c00a01  
0x101C <_start+28>: 0xfec00401
0x1020 <_start+32>: 0xee010f10  
0x1024 <_start+36>: 0xe59f1078
(gdb)x/5i 0x1020-8
0x1018:bicr0,r0,#135168;0x21000
0x101c:strbcs r0,[r0],#1025
0x1020:MCR15,0,r0,cr1,cr0,{0}
0x1024:ldr r1[pc,#120];0x10a4
0x1028:ldr r2[r1,#8]
(gdb)x/4w 0x1018
0x1018:0xe3c00a01
0x101C:0xfec00401
0x1020:0xee010f10
0x1024:0xe59f1078
从程序对象文件转储:

  18:   e3c00a01    bic r0, r0, #4096   ; 0x1000
  1c:   e3c00001    bic r0, r0, #1  ; 0x1
  20:   ee010f10    mcr 15, 0, r0, cr1, cr0, {0}
  24:   e59f1078    ldr r1, [pc, #120]  ; a4 <skip_intreg_reset+0x64>
  28:   e5912000    ldr r2, [r1]
18:e3c00a01 bic r0,r0,#4096;0x1000
1c:e3c00001 bic r0,r0,#1;0x1
20:ee010f10 mcr 15,0,r0,cr1,cr0,{0}
24:e59f1078 ldr r1,[pc,#120];a4
28:e5912000 ldr r2[r1]
这是一个社区维基答案

该问题由两个不同的问题引起:

  • 正在初始化错误的向量表。ARM具有可选择的高和低向量,高
    0xffff0000
    是默认值,而代码初始化时就好像向量表位于
    0x00000000
    。高向量表包含以下指令(异常情况下的无限循环):
  • 板上的SDRAM问题导致RAM中的程序内容损坏,并生成未定义的异常。随后,程序停止响应,因为它处于无限循环中,OP停止了gdb。使用的JTAG调试器(peedi)实际上在gdb使用
    ctrl+C
    停止时跳到下一条指令,这就是为什么
    pc
    0xffff0008
    ,即使
    cpsr
    指示位于
    0xFF0004
    的未定义异常

发生swi时是在thumb模式还是arm模式下?您能在发生异常的地方转储/发布代码吗?可能只是GDB故障。尝试在向量的分支的目标上设置断点,而不是在向量本身上。你对向量的分支是什么意思?要在中断向量中使用分支指令并将断点放在I分支的位置?您已经验证了mcr在该内核上的协处理器是有效的操作吗?也许用nop替换它。ldr在对齐的边界上?(如果为0x2020000,则可以)
0xffff0000: b 0xffff0020 
0xffff0004: b 0xffff0004 
0xffff0008: b 0xffff0008 
0xffff000c: b 0xffff000c 
0xffff0010: b 0xffff0010 
0xffff0014: b 0xffff0014 
0xffff0018: b 0xffff0018 
0xffff001c: b 0xffff001c