对于简单的ARM反汇编,gdb没有达到断点

时间:2015-11-18 02:53:02

标签: assembly gdb arm breakpoints

我在uni学习ARM程序集,我编写了一个简单的程序来调试gdb以获得乐趣。问题是当我设置一个断点时,它表示断点已经设定但实际上并没有停在它上面 ARM源代码在这里:http://pastebin.com/skwnniLy它应该对开始时移入r0 r1和r2的三个值进行排序,从较大的较低位置开始。 我用arm-none-eabi-as -gdwarf-2 -o sort.o sort.s编译它,所以它确实有调试选项,obj转储显示这个:
(TL; DR:反汇编一切都很好)

qreon@Trillian:~$ arm-none-eabi-objdump -d sort.o
sort.o:     file format elf32-littlearm
Disassembly of section .text:

00000000 <init>:
   0:   e3a00491    mov r0, #-1862270976    ; 0x91000000
   4:   e3a0131a    mov r1, #1744830464     ; 0x68000000
   8:   e3a0232a    mov r2, #-1476395008    ; 0xa8000000

0000000c <compare>:
   c:   e1500001    cmp r0, r1
  10:   51a04000    movpl   r4, r0
  14:   51a03001    movpl   r3, r1
  18:   41a04001    movmi   r4, r1
  1c:   41a03000    movmi   r3, r0
  20:   e1520004    cmp r2, r4
  24:   51a07002    movpl   r7, r2
  28:   51a06004    movpl   r6, r4
  2c:   51a05003    movpl   r5, r3
  30:   5a000007    bpl 54 <end>
  34:   41530002    cmpmi   r3, r2
  38:   51a07004    movpl   r7, r4
  3c:   51a06003    movpl   r6, r3
  40:   51a05002    movpl   r5, r2
  44:   5a000002    bpl 54 <end>
  48:   41a07004    movmi   r7, r4
  4c:   41a06002    movmi   r6, r2
  50:   41a05003    movmi   r5, r3

00000054 <end>:
  54:   e1a00007    mov r0, r7
  58:   e1a01006    mov r1, r6
  5c:   e1a02005    mov r2, r5
  60:   e3a03000    mov r3, #0
  64:   e3a04000    mov r4, #0
  68:   e3a05000    mov r5, #0
  6c:   e3a06000    mov r6, #0
  70:   e3a07000    mov r7, #0

然后我启动gdb

qreon@Trillian:~$ arm-none-eabi-gdb sort.o
GNU gdb (7.8-0ubuntu1+6) 7.8 [...]
Reading symbols from sort.o...done.
(gdb) target sim
Connected to the simulator.
(gdb) load
Loading section .text, size 0x74 vma 0x0
Start address 0x0
Transfer rate: 928 bits in <1 sec.
(gdb) b init
Breakpoint 1 at 0x4: file sort.s, line 4.
(gdb) run
Starting program: /home/qreon/sort.o 
[Inferior 1 (process 42000) exited normally]

我注意到我设置为标签init的断点实际上设置为line 4,这是源代码中init标签下面的第二条指令。但即使它不在正确的位置,我也会在指令上设置断点,所以程序应该停止,而且它不会。我认为这可能是因为两个分支,但它们位于compare标签的中间,而不是init ......

有什么想法吗? :(

0 个答案:

没有答案