Differences between version 7 and predecessor to the previous major change of DeBugging.
Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History
Newer page: | version 7 | Last edited on Friday, October 17, 2003 9:30:52 am | by JohnMcPherson | Revert |
Older page: | version 5 | Last edited on Sunday, September 7, 2003 10:43:46 am | by DanielLawson | Revert |
@@ -7,27 +7,30 @@
# Load your program in gdb: "gdb ./''programname''"
# type "run" at the prompt to run the program.
# when the program crashes you should be able to type "bt full" to get a full backtrace of what the program was doing at the time.
-useful gdb(1) commands:
+!!
useful gdb(1) commands:
;bt full: give a complete backtrace of a program. If a program crashes __this__ is what the programmer will want from you.
;print: This lets you print out various expressions, eg: "print node" "print *node" "print node->key" "print node->next->key" etc.
;break: This lets you set breakpoints, eg: "break main"
;run: run a program up until a break point.
;step: step over a function call
;next: step into a function call
;frame: change which frame you are working on. eg: "frame 1" will change the scope to frame 1.
-!Other useful debugging tricks and traps:
-strace(1) lets you see what a program is doing in a corse
kind of way, if you think strace(1) is too quiet, perhaps ltrace(1) is for you. for the bsdites amongst us, I believe these are called struss(1) and sotrace(1). The command for this is:
+!
!Other useful debugging tricks and traps:
+!strace
+strace(1) lets you see what a program is doing in a coarse
kind of way, if you think strace(1) is too quiet, perhaps ltrace(1) is for you. for the bsdites amongst us, I believe these are called struss(1) and sotrace(1). The command for this is:
strace ''programname''
if the program is already running:
strace ''pid''
will also work.
+!signals
If your program hangs, you can press Alt-\ to send it a SIGQUIT and force it to dump core. You can also force them to dump core with the command:
kill -QUIT ''programpid''
+!Core files
To create core files you have to remove the ulimit(1) on them. This can be done with the command:
ulimit -c unlimited
Note, this is for the shell (and all it's children) only.
@@ -35,11 +38,24 @@
gdb ./''program'' ./''corefile''
If you run gdb(1) on your program and it displays the names of the functions but doesn't display their types (eg: what arguments they have or line number information) you probably didn't compile them with -g
+!ddd
ddd(1) appears to be a reasonable [GUI] interface to gdb(1) for those that are afraid of CommandLine's.
+!assert
use assert(3) everywhere. It's much nicer at finding your bugs closer to where the bug actually hides.
+!Electric Fence
Make use of electricfence (libefence) for tracking memory allocation errors. In debian this can be enabled on the fly by setting an LD_PRELOAD variable, like so:
LD_PRELOAD=libefence.so.0.0 your-buggy-programme
+
+! threads
+Note: When using gdb(1) to debug a threaded program, gdb(1) catches two signals ([SIGPWR] & [SIGXCPU]) which are used internally by pthreads on Linux. Use
+ (gdb) handle SIGPWR pass nostop noprint
+ (gdb) handle SIGXCPU pass nostop noprint
+to stop gdb halting on receiving these signals.
+
+!Other useful commands
+* catchsegv - prints out the backtrace of function calls for a program receiving a [SIGSEGV]
+* c++filt(1) - reverses the C++ symbol name-mangling that gcc(1) does, so if the program uses c++ then you can read the function names.