list Show the code surrounding the current line of execution.
disassemble Look at the machine code.
show user List all macros.
Example:
(gdb) define print_and_go
Type commands for definition of "print_and_go".
End with a line saying just "end".
>printf $arg0, $arg1
>continue
>end
Stop execution at a point in the code.
save-breakpoints <file> Save current set of breakpoints.
source <file> Load the saved breakpoints.
break <line number> Set a breakpoint at line number in the current file.
break <function> Break on all overloaded functions in the current file.
break filename:line_number
break filename:function
info breakpoints List all information on current breakpoints.
info b
delete {breakpoint #/#s} List without commas. Remove numbered breakpoints.
delete Delete all breakpoints.
clear Clears a breakpoint at the next instruction.
clear function
clear filename:function
clear line_number
clear filename:line_number
disable Disable all breakpoints.
disable ... {function, filename, etc.}
enable Enable all breakpoints.
enable ... {function, filename, etc.}
enable once {breakpoint-list}
tbreak {args} Temporary, single-use breakpoint.
break +offset Break <offset> lines from the executing line.
break *address Useful when source is not available.
hbreak <hardware address>
rbreak <regex> grep-style, not perl-style
break {break-args} if {condition}
Instruct gdb
to take specific actions when hitting a breakpoint.
commands {break-point number}
...
commands
...
end
Examples:
(gdb) commands 1
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
>silent
>printf "fibonacci was passed %d\n", n
>continue
>end
(gdb) commands 1
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
>silent
>print_and_go "fibonacci() was passed %d\n" n
>end
A watchpoint is like a breakpoint, but rather than living at a point in the code it pauses execution whenever an expression changes value.
Three clases of methods for resuming execution:
- next (
n
- execute w/o pause) / step (s
- step into functions) - continue (
c
- just go until the next breakpoint) - finish (
f
- step out) / Until (u
- finish an executing loop)
p <var> Print a variable.
p/x <var> Print in hex.
p/x $pc Print current location in assembly dump.
set x = 12
set args 1 52 19 11 argv[1], argv[2], etc.
Use $1
, $2
, ... to access history values.
Example:
(gdb) set $i = 0
(gdb) p my_array[$i++]
$1 = 12
(gdb) # Just hit enter to repeat the command...
$2 = 5
(gdb)
$3 = 8
Signals indicate exceptional conditions and are reported during program execution to allow the OS or our code to react to a variety of events.
signal raised by impact
------ --------- ------
SIGSEV hardware
SIGFPE hardware
SIGTERM OS
SIGABRT OS
SIGUSR1 User code(?)
SIGUSR2 User code(?)
raise() Process itself.
SIGINT ctrl-C OS interrupts foreground process
It is possible to define custom behavior for the various signals:
#include <signal.h>
//...
if ( choice == 1 )
signal(SIGINT, SIG_IGN); // Ignore control-C
else if ( choice == 2 )
signal(SIGINT, my_sigint_handler);
else if ( choice == 3 )
signal(SIGINT, SIG_DFL);
else if ( choice == 4 )
raise(SIGSEGV);
else
puts("What ever you say, guv'nor.\n\n");
//...
void my_sigint_handler( int signum )
{
printf("I received signal %d (that's 'SIGINT' to you).\n", signum);
puts("Tee Hee! That tickles!\n");
}
The dump size is typically strictly limited. To open it up:
ulimit -c unlimied
Or
ulimit -C n # kB
$ file core.14596
core.14596: Mach-O 64-bit core x86_64
On some OSs, file will tell which program the core came from.
We can use the cores when debugging:
cgdb myExe /cores/core.14826
info threads
thread 3
# n, change to thread nbreak 88 thread 3
# break when thread 3 reaches line 88break 88 thread 3 if x == y
- Go to a new terminal and type "tty" to get its address (e.g.,
/dev/ttys017
), thensleep 10000000
(so keyboard input goes to the program and not the shell). - Launch
gdb
, and typetty <address>
, e.g.,tty /dev/ttys017
. This will direct output to that window.
-
Launch the program, then use ps to figure out the pID:
~$ ps -leaf | grep psax 501 11628 11016 4006 0 31 0 2433232 1032 - S+ 0 ttys019 0:00.00 ./psax 9:32AM
-
Then attach in
gdb
:psax$ cgdb psax (gdb) attach 11628 ... etc.
Also, (c)gdb attach 11628
would work.
- While running:
ctrl-x ctrl-a
- At launch:
gdbtui
orgdb -tui ...
- Switch focus:
ctrl-o
- Refresh the screen:
ctrl-l