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?
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.
Explanation: None. 8. Which GDB command can be used to put a breakpoint at the beginning of the program? Explanation: None.
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.
Just press c. It will continue execution until the next breakpoint.
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
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With