I often find myself in a situation when I want to know where a function returns. There's no need to know the return value, as this may be the same for multiple code paths (e.g., nullptr if something went wrong). It is embarrassing, but I sometimes have put fprintf(stderr, "T1"); in my code just to follow which path the execution took. Needless to say, this behavior requires manual editing and recompilation and should be avoided if possible.
Here's a way to elegantly debug where a function returns using lldb from the command line.
Consider this test.cpp program and all you want to do is find out where the function foo returns:
int foo(int argc) {
switch (argc) {
case 1:
return 1;
case 2:
return 2;
case 3:
return 3;
}
return -1;
}
int main(int argc, char *argv[]) { return foo(argc); }
Note that there are five return statements in this code, but we only want to know which of the four inside of foo are being hit.
Let's start by compiling the above program with debug symbols:
clang -g test.cpp
To get to know where foo returns, you can run the following command.
lldb -b -o "br set -X foo -p return" -o r ./a.out -- hello world
- The
-btoggles on batch mode. I find this handy because it lets you execute your program in a fire-and-forget fashion without leaving you in the debugger when your program is done. - The
-o "br set -X foo -p return"sets a breakpoint on the pattern return inside the functionfoo. Note that a breakpoint is limited only to the return statements inside the functionfoo(we have four, not five locations). - The
-o rruns the program and stops at the breakpoint insidefoo. - Everything after the
--is passed to our program./a,outas arguments.
Here you see the effect:
(lldb) target create "./a.out"
Current executable set to './a.out' (x86_64).
(lldb) settings set -- target.run-args "hello" "world"
(lldb) br set -X foo -p return
Breakpoint 1: 4 locations.
(lldb) r
Process 7542 stopped
* thread #1, name = 'a.out', stop reason = breakpoint 1.3
frame #0: 0x0000000000401170 a.out`foo(argc=3) at test.cpp:8:5
5 case 2:
6 return 2;
7 case 3:
-> 8 return 3;
9 }
10 return -1;
11 }
Process 7542 launched: '/home/kkleine/a.out' (x86_64)
I hope you like this tip. For more useful LLDB tips on breakpoints, please visit this page: https://lldb.llvm.org/use/tutorial.html#setting-breakpoints
Last updated: July 1, 2020