< Day Day Up > |
GDB can be thought of as a specialized programming language. It has variables and operators similar to those of C, and special features for debugging. This section looks at the different kinds of expressions that GDB understands. 17.4.1. The Value HistoryEvery time you print a value with print, GDB saves the value in the value history . You can reference these saved values by their numeric place in the history, preceded with a $. GDB reminds you of this by printing $n = val. For example: $ gdb whizprog ... (gdb) print stopped_early $1 = 0 (gdb) print whiny_users $2 = TRUE (gdb) A plain $ refers to the most recent value in the value history. This can save considerable typing. If you've just looked at a pointer variable, you can use: (gdb) print *$ to print the contents of whatever the pointer is pointing to. $$ refers to the next most recent value in the history, and $$n refers to the value n places from the end. (Thus, $n counts from the beginning, while $$n counts from the end.) You can use show values to see the values in the history. Whenever GDB reloads the executable (rereads the symbol table), it clears the value history. This is because the value history may have contained pointers into the symbol table and such pointers become invalid when the symbol table is reloaded. 17.4.2. Convenience Variables and Machine RegistersGDB lets you create convenience variables . These are variables you can use to store values as you need them. Their names begin with a $ and consist of alphanumeric characters and underscores. They should start with a letter or underscore. (Note that values in the value history have names that are numeric.) You might want to use a convenience variable as an array index: (gdb) set $j = 0 (gdb) print data[$j++] After these two commands, simply hitting the ENTER key repeats the last command, stepping through the array one element at a time. GDB predefines several convenience variables. It also enables you to access the machine registers using predefined register names. Register names vary with machine architecture, of course, but there are four predefined registers available on every architecture. The following list summarizes the convenience variables and predefined registers. The last four entries in the list are the registers that are always available.
17.4.3. Special ExpressionsGDB understands the syntax (types, operators, operator precedence) of the language being debugged. You can use the same syntax to enter expressions as you do to modify GDB convenience variables (such $i++). GDB also understands several special syntaxes that let you do things that are not in the target language, as follows:
|
< Day Day Up > |