I use a mix of both. IMO a debugger (I use gdb) is very convenient. But sometimes you want to get a good overview of everything the program does, then print statements are better.
The only thing I use in debugger (gdb in my case) is backtrace command, which shows the stack trace on where my code has crashed. The rest of debugging is done via numerous asserts to verify the invariants, #define _GLIBCXX_DEBUG to catch out-of-range access and other things like that, and, of course, debug cout's.
show me a code so I can learn to use this gdb properly
What code are you talking about? I just do
$ gdb ./my_program
Then I type run, and if my code crashes, I type backtrace (you can also type bt as a shortcut) to see the stack trace. You can also see all the local variables for all the functions in the stack with backtrace full command.
I use this define too along with some sanitizers (undefined and address). And I just use print statements for all debugging purposes which is basically done by the debug template I took from benq's template and modified it a bit.
The only situation I would like use debuger over printf is when my code get segmentation fault. In that case, one run of gdb and I know which line cause this problem. Super convenient.
This is one of the questions where I really want to see the ratings of the respondents.
Can you please comment what is your opinion and why? Orz
I use a mix of both. IMO a debugger (I use gdb) is very convenient. But sometimes you want to get a good overview of everything the program does, then print statements are better.
A friend of mine told my about this trick/debugger.h thing and it's really useful.
Click here to check the file
Then you only need to put the file in: C:\mingw-w64\mingw64\lib\gcc\mingw32\5.1.0\include\c++\debug
And writing at the top of your code:
ifdef __LOCAL #include <debug/debugger.h>
endif
The only thing I use in debugger (
gdb
in my case) isbacktrace
command, which shows the stack trace on where my code has crashed. The rest of debugging is done via numerous asserts to verify the invariants,#define _GLIBCXX_DEBUG
to catch out-of-range access and other things like that, and, of course, debugcout
's.Sounds great, can you please show me a code so I can learn to use this gdb properly. Thanks for sharing your experience.
What code are you talking about? I just do
Then I type
run
, and if my code crashes, I typebacktrace
(you can also typebt
as a shortcut) to see the stack trace. You can also see all the local variables for all the functions in the stack withbacktrace full
command.That's great, thank you so much.
I use this define too along with some sanitizers (undefined and address). And I just use print statements for all debugging purposes which is basically done by the debug template I took from benq's template and modified it a bit.
The only situation I would like use debuger over printf is when my code get segmentation fault. In that case, one run of gdb and I know which line cause this problem. Super convenient.
You can also compile with
-g -fsanitize=address
and it will print line and column of the crashCurrently I use gdb from within VSCode. I also use a debug macro that I wrote. It has pretty colors!
Auto comment: topic has been updated by Platanito_Frito (previous revision, new revision, compare).