How to set a breakpoint in GDB where the function returns?

后端 未结 7 1417
孤独总比滥情好
孤独总比滥情好 2020-11-27 06:10

I have a C++ function which has many return statements at various places. How to set a breakpoint at the return statement where the function actually returns ?

And

7条回答
  •  情深已故
    2020-11-27 06:57

    Contrary to answers so far, most compilers will create a single return assembly instruction, regardless of how many return statements are in the function (it is convenient for the compiler to do that, so there is only a single place to perform all the stack frame cleanup).

    If you wanted to stop on that instruction, all you have to do is disas and look for retq (or whatever the return instruction for your processor is), and set a breakpoint on it. For example:

    int foo(int x)
    {
      switch(x) {
       case 1: return 2;
       case 2: return 3;
       default: return 42;
      }
    }
    
    int main()
    {
      return foo(0);
    }
    
    
    (gdb) disas foo
    Dump of assembler code for function foo:
       0x0000000000400448 <+0>: push   %rbp
       0x0000000000400449 <+1>: mov    %rsp,%rbp
       0x000000000040044c <+4>: mov    %edi,-0x4(%rbp)
       0x000000000040044f <+7>: mov    -0x4(%rbp),%eax
       0x0000000000400452 <+10>:    mov    %eax,-0xc(%rbp)
       0x0000000000400455 <+13>:    cmpl   $0x1,-0xc(%rbp)
       0x0000000000400459 <+17>:    je     0x400463 
       0x000000000040045b <+19>:    cmpl   $0x2,-0xc(%rbp)
       0x000000000040045f <+23>:    je     0x40046c 
       0x0000000000400461 <+25>:    jmp    0x400475 
       0x0000000000400463 <+27>:    movl   $0x2,-0x8(%rbp)
       0x000000000040046a <+34>:    jmp    0x40047c 
       0x000000000040046c <+36>:    movl   $0x3,-0x8(%rbp)
       0x0000000000400473 <+43>:    jmp    0x40047c 
       0x0000000000400475 <+45>:    movl   $0x2a,-0x8(%rbp)
       0x000000000040047c <+52>:    mov    -0x8(%rbp),%eax
       0x000000000040047f <+55>:    leaveq 
       0x0000000000400480 <+56>:    retq   
    End of assembler dump.
    (gdb) b *0x0000000000400480
    Breakpoint 1 at 0x400480
    (gdb) r
    
    Breakpoint 1, 0x0000000000400480 in foo ()
    (gdb) p $rax
    $1 = 42
    

提交回复
热议问题