Viewing and Visiting Code |
3 |
![]() |
This chapter is organized into the following sections
Basic Concepts
Each time the program stops, dbx prints the source line associated with the stop location. At each program stop, dbx resets the value of the current function to the function in which the program is stopped. Before the program starts running and when it is stopped, you can move to, or visit, functions and files elsewhere in the program.
Mapping to the Location of the Code
dbx must know the location of the source and object code files associated with a program. The default directory for the object files is the one they were in when the program was last linked. The default directory for the source files is the one they were in when last compiled. If you move the source or object files, or copy them to a new location, you must either relink the program or change to the new location before debugging.
pathmap [-c] from to |
If -c is used, the mapping is applied to the current working directory as well.
Visiting Code
You can visit code elsewhere in the program any time the program is not running. You can visit any function or file that is part of the program. Visiting a File
You can visit any file dbx recognizes as part of the program (even if a module or file was not compiled with the -g option.) Visiting a file does not change the current function. To visit a file:
file filename |
Using the file command by itself echoes the file you are currently visiting:
file |
dbx displays the file from its first line unless you specify a line number:
file filename ; list line_number |
Visiting Functions
You can use the func command to visit a function. To visit a function, type the command func followed by the function name. The func command by itself echoes the currently visited function. For example:
(dbx) func adjust_speed |
Selecting from a List of C++ Ambiguous Function Names
If you try to visit a C++ member function with an ambiguous name or an overloaded function name, a list is displayed, showing all functions with the overloaded name.
(dbx) func block::block |
Choosing Among Multiple Occurrences
If multiple symbols are accessible from the same scope level, dbx prints a message reporting the ambiguity:
(dbx) func main (dbx) which block::block Class block has more than one function member named block. |
In the context of the which command, choosing from the list of occurrences does not affect the state of dbx or the program. Whichever occurrence you choose, dbx merely echoes the name.
Printing a Source Listing
Use the list command to print the source listing for a file or function. Once you visit a file, list prints number lines from the top. Once you visit a function, list prints its lines.
list [-i | -instr] [+] [-] number [ function | filename ] |
Walking the Call Stack to Visit Code
Another way to visit code when a live process exists is to "walk the call stack," using the stack commands to view functions currently on the stack.
Qualifying Symbols with Scope Resolution Operators
When using func or file, you may need to use scope resolution operators to qualify the names of the functions that you give as targets. Backquote Operator
The backquote character(`) can be used to find a variable of global scope:
(dbx) print `item |
(dbx) func `file_name`function_name |
C++ Double Colon Scope Resolution Operator
Use the double colon operator (::) to qualify a C++ member function or top level function with:
(dbx) func class::function_name (args) |
For example, if hand is the class name and draw is the function name:
(dbx) func hand::draw |
Block Local Operator
The block local operator (:lineno) is used in conjunction with the backquote operator. It identifies the line number of an expression that references the instance you're interested in.
(dbx) stop in \Qanimate.o\Qchange_glyph:230\Qitem |
Linker Names
dbx provides a special syntax for looking up symbols by their linker names (mangled names in C++). You prefix the symbol name with a # (pound sign) character (use the ksh escape character \ (backslash) before any $ (dollar sign) characters), as in these examples:
(dbx) stop in #.mul (dbx) whatis #\$FEcopyPc (dbx) print \Qfoo.c\Q#staticvar |
Scope Resolution Search Path
When you issue a debugging command with a symbol target name, the search order is as follows:
The output includes the name of the loadable object(s) where the program defines symbol, as well as the kind of entity each object is: class, function, or variable.
Determining Which Symbol dbx Uses
The which command tells you which symbol with a given name it uses if you specify that name (without fully qualifying it) as the target of a debugging command. For example:
(dbx) func wedge::wedge(char*, int, int, const point&, load_bearing_block*) (dbx) which draw \Qblock_draw.cc\Qwedge::draw(unsigned long) |
If a specified symbol name is not in a local scope, the which command searches for the first occurrence of the symbol along the scope resolution search path. If which finds the name, it reports the fully qualified name.
(dbx) which fid \Qexample`file1.c`fid `example`file2.c`fid |
dbx shows the overload display, listing the ambiguous symbols names. In the context of the which command, choosing from the list of occurrences does not affect the state of dbx or the program. Whichever occurrence you choose, dbx merely echoes the name.
Viewing Variables, Members, Types, and Classes
dbx's whatis command prints the declarations or definitions of identifiers, structs, types and C++ classes, or the type of an expression. The identifiers you can look up include variables, functions, fields, arrays, and enumeration constants.
(dbx) whatis identifier |
Qualify the identifier name with file and function information as needed.
(dbx) whatis block::movable |
On a variable, whatis tells you the variable`s type:
(dbx) whatis the_table |
On a field, whatis tells you the field`s type:
(dbx) whatis the_table->draw |
Looking Up Definitions of Types and Classes
To print the declaration of a type or C++ class:
(dbx) whatis -t type_or_class_name |
(dbx) whatis -t -r class_name |
The output from a whatis -r query may be long, depending on the class hierarchy and the size of the classes. The output begins with the list of members inherited from the most ancestral class. Note the inserted comment lines separating the list of members into their respective parent classes.
Using the Auto-Read Facility
In general, you should compile the entire program you want to debug using the -g option. Depending on how the program was compiled, the debugging information generated for each program and shared library module is stored in either the object code file (.o file) for each program and shared library module, and/or the program executable file.
By default, dbx looks for files in the directory where they were when the program was compiled and the .o files in the location from which they were linked. If the files are not there, use the pathmap command to set the search path.
Note - If you archive .o files into .a files, and then link using the archive libraries, you can then remove the associated .o files, but you must keep the .a files.
Disabling Auto-Read with the -xs Compiler Option
Programs compiled with -g -c store debugging information for each module in the module`s .o file. Auto-Read requires the continued presence of the program and shared library .o files. Listing Modules
The dbx modules command and its options help you to keep track of program modules during the course of a debugging session. Use the module command to read in debugging information for one or all modules. Normally, dbx automatically and "lazily" reads in debugging information for modules as needed.
(dbx) module [-f] [-q] name |
To read in debugging information for all modules:
(dbx) module [-f] [-q] -a |
-f |
Forces reading of debugging information, even if the file is newer than the executable |
-q |
Quiet mode |
Command Reference
modules
To list the names of modules containing debugging information that have already been read into dbx:
modules -read |
To list names of all program modules (with or without debugging info):
modules |
To list all program modules with debugging info:
modules -debug |
To print the name of the current module:
module |
whatis
To print out non-type identifiers:
whatis [-n] [-r] |
To print out type identifiers:
whatis -t [-r] |
whatis -e [-r] |
list
The default number of lines listed when no number is specified is controlled by the dbxenv variable output_list_size. Where appropriate, the line number may be $ (dollar sign) which denotes the last line of the file. A comma is optional.
list number |
To print the next number lines, or the previous number lines, use the plus or inus sign:
list [ + | - ] number |
To list lines from one number to another:
list number1 number2 |
To list the start of the file filename:
list filename |
To list the file filename from line number:
list filename:number |
To list the start of the source for function:
list function |
This command changes the current scope.
list -i |
To list number lines, a window, around a line or function:
list -w number |