Gdb tips
Today we will start with the concept of Stopping and Continuing the program under Gdb.
Stopping and Continuing
The principal purposes of using a debugger are so that you can stop your program before it terminates, and if it runs into trouble, you can investigate and find out why.
Breakpoints
A breakpoint makes your program stop whenever a certain point in the program is reached, and you can add conditions to control in finer detail you program.
You can use the break command to create a breakpoint, a breakpoint needs a place to know when stops, this address can be the line number, a function name or the exact address in the program.
Watchpoint
A watchpoint is a special breakpoint that stops your program when the value of and expression changes, the commands to manage the wachpoints are the same as for breakpoints.
Gdb assigns an integer number to each breakpoint and watchpoint you create.
In many commands to manage them, is only necessary this integer number to choose the specified break or watchpoint.
Some Gdb commands accept a range of breakpoints on which to operate, like “5-7”, will only operate in breakpoint 5 through 7.
The variable $bpnum records the number of the breakpoint you've set most recently.
break location
Set a breakpoint at the given location
break
When called without arguments, break sets a breakpoint at the next instruction to be executed in the selected stack frame.
break … if cond
Set a breakpoint with condition cond. Evaluate the expression cond each time theh breakpoint is reached, and stop if the condition evaluates to true.
tbreak args
Set a breakpoint that will be deleted once reached.
info breakpoint [n] or i b [n]
The info if all breakpoints and watchpoints the [n] argument is optional and prints the info only only this breakpoint.
The columns displayed are:
Num : Integer number representing the breakpoint
Type : Breakpoint or watchpoint
Disp : Disposition, whether the breakpoint is marked to be disabled or enabled when hit
Enb : Enabled breakpoints are marked with “y”. And the not enabled are with “n”
Address : The address of the breakpoint in your program.
What : Where the breakpoint is in the source of your program
If the breakpoint is conditional, info break shows the condition on the line following the affected breakpoint; breakpoint commands, if any, are listed after that.
Also info break shows how many times the breakpoints has been hit.
Gdb allows you to set any number of breakpoints at the same place in your program. There is nothing silly or meaningless about this, when the breakpoints are conditional, this is even useful.
Setting Watchpoints
You can use watchpoint to stop execution whenever the value of an expression changes without having to predict a particular place where this may happen.
You can set a watchpoint on an expression even if the expression can not be evaluated yet.
watch expr
Set a watchpoint for an expression.
The simplest use of this command is to watch the value of a single variable.
rwatch expr
Set a watchpoint that will break when the value of expr is read by the program.
awatch expr
Set a watchpoint that will break when expr is either read from or written into by the program.
info watchpoints
Prints a list of watchpoints, using the same format as the info break.
To set a watchpoint on an fixed address, you must dereference it, as the addres itself is just a constant number which will never change.
(gdb) watch 0x600850
Cannot watch constant value 0x600850
(gdb) watch *(int *) 0x600850
Watchpoint 1: *(int *) 6293584
Deleting Breakpoints
clear
Delete any breakpoint at the next instruction to be executed
clear [ location | function | linenum ]
Delete any breakpoint set at the specified location or function name or line number.
If you have multiple files, you can specify the filename before the locations above.
delete [breakpoints] [range]
Delete the breakpoints and watchpoints of the breakpoint number, or the range specified.
Disabling Breakpoints
Sometimes we might prefer to disable some break or watchpoints rather do delete it.
The commands used to enable or disable the breakpoints and watchpoints must be used with their respective integer number, that identifies them, you can see it using info breakpoints.
A break or watchpoint can have any of four different states of enablement:
enabled : The breakpoint stops your program, is the default set with the break command
disabled: The breakpoint has no effect.
enabled once: The breakpoint stops your program, but then becomes disabled
enabled for deletion: The breakpoint stops your program but is deleted after it. As tbreak does
The commands to enable or disable breakpoints and watchpoints.
disable [breakpoints] [range] or dis
Disable the specified breakpoints, or all if none are listed.
enable [breakpoints] [range]
Enable the specified breakpoints.
enable [breakpoints] once range...
Enable the specified breakpoints temporarily for one time, then Gdb disables it.
enable [breakpoints] delete range...
Enable the specified breakpoints to work once, then Gdb deletes it.
Break Conditions
The simplest sort of breakpoint break every time your program reaches a specified place.
You can also specify a condition for a breakpoint.
A condition is just a Boolean expression in your programming language that Gdb evaluates each time your program reaches it and stop only if the conditions is true.
Break conditions can be specified when a brekpoint is set, by using 'if' in the arguments to the break command and they can also be changed at any time with the condition command.
condition bnum expression
Specify expression as the break condition for breakpoint, watchpoint identified by bnum.
After you set a condition, breakpoint bnum stops your program only if the value of expression is true.
condition bnum
Remove the condition from breakpoint number bnum.
A special case of a breakpoint condition is to stop only when the breakpoint has been reached a certain number of times. For this we use:
ignore bnum count
Breakpoint Command Lists
You can give any breakpoint a series of commands to execute when your program stopes due to that breakpoint. You might want to print the values of certain expressions, or enable other breakpoints.
commands [range...]
… command-list …
end
Specify a list of commands for the given breakpoint.
Type a line containing just end to terminate the commands.
To remove all commands from a breakpoint, type commands and follow it immediately with end.
With no argument, commands refers to the last breakpoint or watchpoint.
If the first command you specify in a command list is silent, the usual message about stopping at a breakpoint is not printed.
If none of the remaining commands print anythiing, you see no sign that the breakpoint was reached, silent is meaningful only at the beginning of a breakpoint command list.
The commands echo, output, and printf allow you to print precisely controlled output, and are often useful in silent breakpoints, an example:
break foo if x>0
commands
silent
printf “x is %d\n”, x
cont
end
One application for breakpoint commands is to compensate for one bug so you can test for another.
Put a breakpoint just after the erroneous line of code, give it a condition to detect the case in which something erroneous has been done, and give it commands to assign correct values to any variables that need them. End with the continue commands so that your program does not stop, and start with the silent commands so that no output is produced. Here is an example:
break 403
commands
silent
set x = y + 4
cont
end