Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c++

debugging

gdb

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 what does "break" command without argument means?

like image 511
avd Avatar asked Sep 06 '10 06:09

avd


People also ask

How do you set a breakpoint in a function?

To set a breakpoint in all member functions of a specific class, use the stop inclass command. By default, breakpoints are inserted only in the class member functions defined in the class, not those that it might inherit from base classes.

Which GDB command can be used to put a breakpoint at the beginning of the program?

Explanation: None. 8. Which GDB command can be used to put a breakpoint at the beginning of the program? Explanation: None.

What is a break point in GDB?

A breakpoint makes your program stop whenever a certain point in the program is reached. For each breakpoint, you can add conditions to control in finer detail whether your program stops.

How do I skip to the next breakpoint in GDB?

Just press c. It will continue execution until the next breakpoint.


2 Answers

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 <foo+27>    0x000000000040045b <+19>:    cmpl   $0x2,-0xc(%rbp)    0x000000000040045f <+23>:    je     0x40046c <foo+36>    0x0000000000400461 <+25>:    jmp    0x400475 <foo+45>    0x0000000000400463 <+27>:    movl   $0x2,-0x8(%rbp)    0x000000000040046a <+34>:    jmp    0x40047c <foo+52>    0x000000000040046c <+36>:    movl   $0x3,-0x8(%rbp)    0x0000000000400473 <+43>:    jmp    0x40047c <foo+52>    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 
like image 162
Employed Russian Avatar answered Sep 18 '22 11:09

Employed Russian


You can use reverse debugging to find out where function actually returns. Finish executing current frame, do reverse-step and then you should stop at just returned statement.

(gdb) record (gdb) fin (gdb) reverse-step 
like image 37
ks1322 Avatar answered Sep 20 '22 11:09

ks1322