gdb在地址处设置断点,但不是停止

时间:2014-08-22 22:28:31

标签: assembly gdb

我使用gdb从可执行代码中检查程序集转储。我设置了两个断点。一直受到打击,但下一个突破点不是。我不知道为什么。我用:

   (gdb) b phase_2   
   (gdb) b *0x400ec0

设置断点,注意到* 0x400ec0是< + 52>从第2阶段开始。 这是disas的结果:

         Dump of assembler code for function phase_2:
=> 0x0000000000400e8c <+0>:     mov    %rbx,-0x20(%rsp)
   0x0000000000400e91 <+5>:     mov    %rbp,-0x18(%rsp)
   0x0000000000400e96 <+10>:    mov    %r12,-0x10(%rsp)
   0x0000000000400e9b <+15>:    mov    %r13,-0x8(%rsp)
   0x0000000000400ea0 <+20>:    sub    $0x48,%rsp
   0x0000000000400ea4 <+24>:    mov    %rsp,%rsi
   0x0000000000400ea7 <+27>:    callq  0x401743 <read_six_numbers>
   0x0000000000400eac <+32>:    mov    %rsp,%rbp
   0x0000000000400eaf <+35>:    lea    0xc(%rsp),%r13
   0x0000000000400eb4 <+40>:    mov    $0x0,%r12d
   0x0000000000400eba <+46>:    mov    %rbp,%rbx
   0x0000000000400ebd <+49>:    mov    0xc(%rbp),%eax
   0x0000000000400ec0 <+52>:    cmp    %eax,0x0(%rbp)
   0x0000000000400ec3 <+55>:    je     0x400eca <phase_2+62>
   0x0000000000400ec5 <+57>:    callq  0x40163d <explode_bomb>
   0x0000000000400eca <+62>:    add    (%rbx),%r12d
   0x0000000000400ecd <+65>:    add    $0x4,%rbp
   0x0000000000400ed1 <+69>:    cmp    %r13,%rbp
   0x0000000000400ed4 <+72>:    jne    0x400eba <phase_2+46>
   0x0000000000400ed6 <+74>:    test   %r12d,%r12d
   0x0000000000400ed9 <+77>:    jne    0x400ee0 <phase_2+84>
   0x0000000000400edb <+79>:    callq  0x40163d <explode_bomb>
   0x0000000000400ee0 <+84>:    mov    0x28(%rsp),%rbx
   0x0000000000400ee5 <+89>:    mov    0x30(%rsp),%rbp
   0x0000000000400eea <+94>:    mov    0x38(%rsp),%r12
   0x0000000000400eef <+99>:    mov    0x40(%rsp),%r13
   0x0000000000400ef4 <+104>:   add    $0x48,%rsp
   0x0000000000400ef8 <+108>:   retq   
End of assembler dump.

为什么我在第一次休息时间后输入“c”,它没有在第二个休息点停止?在第二个破发点之前我没有看到任何可能的跳跃。谢谢!

1 个答案:

答案 0 :(得分:1)

我明白了。该函数将有条件地跳转到phase_2函数的末尾。这就是该计划在第2个突破点没有停止的原因。