NAME
dbx —
debugger
SYNOPSIS
Dbx |
[-r] [-i]
[-k] [-I
dir] [-c
file] [objfile
[coredump]] |
DESCRIPTION
Dbx is a tool for source level debugging and execution
of programs under Unix. The
objfile is an object file produced by a compiler with
the appropriate flag (usually -g) specified to produce
symbol information in the object file. Currently,
cc(1),
f77(1), pc(1), and the DEC Western Research Laboratory Modula-2 compiler,
mod(l), produce the appropriate source information. The machine level
facilities of dbx can be used on any program.
The object file contains a symbol table that includes the names of all the source files translated by the compiler to create it. These files are available for perusal while using the debugger.
If a file named core exists in the current
directory or a coredump file is specified,
dbx can be used to examine the state of the program
when it faulted.
If the file .dbxinit exists in the current
directory then the debugger commands in it are executed.
Dbx also checks for a
.dbxinit in the user's home directory if there isn't
one in the current directory.
The command line options and their meanings are:
-r- Execute objfile immediately. If it terminates
successfully
dbxexits. Otherwise the reason for termination will be reported and the user offered the option of entering the debugger or letting the program fault.Dbxwill read from /dev/tty when-ris specified and standard input is not a terminal. -i- Force
dbxto act as though standard input is a terminal. -k- Map memory addresses, useful for kernel debugging.
-Idir- Add dir to the list of directories that are searched
when looking for a source file. Normally
dbxlooks for source files in the current directory and in the directory where objfile is located. The directory search path can also be set with theusecommand. -cfile- Execute the
dbxcommands in the file before reading from standard input.
Unless -r is specified,
dbx just prompts and waits for a command.
Execution and Tracing Commands
run[args] [< filename] [> filename]rerun[args] [< filename] [> filename]- Start executing objfile, passing
args as command line arguments;
< or > can be used to redirect
input or output in the usual manner. When
rerunis used without any arguments the previous argument list is passed to the program; otherwise it is identical torun. If objfile has been written since the last time the symbolic information was read in,dbxwill read in the new information. trace[inprocedure/function] [ifcondition]tracesource-line-number [ifcondition]traceprocedure/function [inprocedure/function] [ifcondition]traceexpressionatsource-line-number [ifcondition]tracevariable [inprocedure/function] [ifcondition]- Have tracing information printed when the program is executed. A number is
associated with the command that is used to turn the tracing off (see the
deletecommand).The first argument describes what is to be traced. If it is a source-line-number, then the line is printed immediately prior to being executed. Source line numbers in a file other than the current one must be preceded by the name of the file in quotes and a colon, e.g. "mumble.p":17.
If the argument is a procedure or function name then every time it is called, information is printed telling what routine called it, from what source line it was called, and what parameters were passed to it. In addition, its return is noted, and if it's a function then the value it is returning is also printed.
If the argument is an expression with an
atclause then the value of the expression is printed whenever the identified source line is reached.If the argument is a variable then the name and value of the variable is printed whenever it changes. Execution is substantially slower during this form of tracing.
If no argument is specified then all source lines are printed before they are executed. Execution is substantially slower during this form of tracing.
The clause
inprocedure/function restricts tracing information to be printed only while executing inside the given procedure or function.Condition is a boolean expression and is evaluated prior to printing the tracing information; if it is false then the information is not printed.
stop ifconditionstop atsource-line-number [ifcondition]stop insource-line-number [ifcondition]stopvariable [ifcondition]- Stop execution when the given line is reached, procedure or function called, variable changed, or condition true.
status[>filename]- Print out the currently active
traceandstopcommands. deletecommand-number ...- The traces or stops corresponding to the given numbers are removed. The
numbers associated with traces and stops are printed by the
statuscommand. catchnumbercatchsignal-nameignorenumberignoresignal-name- Start or stop trapping a signal before it is sent to the program. This is
useful when a program being debugged handles signals such as interrupts. A
signal may be specified by number or by a name (e.g.,
SIGINT). Signal names are case insensitive and the “SIG” prefix is optional. By default all signals are trapped exceptSIGCONT,SIGCHILD,SIGALRMandSIGKILL. contintegercontsignal-name- Continue execution from where it stopped. If a signal is specified, the
process continues as though it received the signal. Otherwise, the process
is continued as though it had not been stopped.
Execution cannot be continued if the process has ``finished'', that is, called the standard procedure ``exit''.
Dbxdoes not allow the process to exit, thereby letting the user to examine the program state. step- Execute one source line.
next- Execute up to the next source line. The difference between this and
stepis that if the line contains a call to a procedure or function thestepcommand will stop at the beginning of that block, while thenextcommand will not. return[procedure]- Continue until a return to procedure is executed, or until the current procedure returns if none is specified.
callprocedure(parameters)- Execute the object code associated with the named procedure or function.
Printing Variables and Expressions
Names are resolved first using the static scope of the current
function, then using the dynamic scope if the name is not defined in the
static scope. If static and dynamic searches do not yield a result, an
arbitrary symbol is chosen and the message
“[using qualified
name]” is printed. The name resolution procedure may be
overridden by qualifying an identifier with a block name, e.g.,
“module.variable” For C, source files
are treated as modules named by the file name without ``.c''.
Expressions are specified with an approximately common subset of C and Pascal (or equivalently Modula-2) syntax. Indirection can be denoted using either a prefix ``*'' or a postfix ``^'' and array expressions are subscripted by brackets (“[]”) The field reference operator (``.'') can be used with pointers as well as records, making the C operator ``->'' unnecessary (although it is supported).
Types of expressions are checked; the type of an expression may be overridden by using “type-name(expression)”. When there is no corresponding named type the special constructs “&type-name” and “$$tag-name” can be used to represent a pointer to a named type or C structure tag.
assignvariable=expression- Assign the value of the expression to the variable.
dump[procedure] [>filename]- Print the names and values of variables in the given procedure, or the current one if none is specified. If the procedure given is ``.'', then the all active variables are dumped.
printexpression [,expression ...]- Print out the values of the expressions.
whatisname- Print the declaration of the given name, which may be qualified with block names as above.
whichidentifier- Print the full qualification of the given identifer, i.e. the outer blocks that the identifier is associated with.
up[count]down[count]- Move the current function, which is used for resolving names, up or down the stack count levels. The default count is 1.
where- Print out a list of the active procedures and function.
whereisidentifier- Print the full qualification of all the symbols whose name matches the given identifier. The order in which the symbols are printed is not meaningful.
Accessing Source Files
- / regular expression[/]
- ? regular expression[]?
- Search forward or backward in the current source file for the given pattern.
edit[filename]editprocedure/function-name- Invoke an editor on filename or the current source
file if none is specified. If a procedure or
function name is specified, the editor is invoked on
the file that contains it. Which editor is invoked by default depends on
the installation. The default can be overridden by setting the environment
variable
EDITORto the name of the desired editor. file[filename]- Change the current source file name to filename. If none is specified then the current source file name is printed.
func[procedure/function]- Change the current function. If none is specified then print the current function. Changing the current function implicitly changes the current source file to the one that contains the function; it also changes the current scope used for name resolution.
list[source-line-number [,source-line-number]]listprocedure/function- List the lines in the current source file from the first line number to the second inclusive. If no lines are specified, the next 10 lines are listed. If the name of a procedure or function is given lines n-k to n+k are listed where n is the first statement in the procedure or function and k is small.
usedirectory-list- Set the list of directories to be searched when looking for source files.
Command Aliases and Variables
aliasname namealiasname stringaliasname (parameters) “string”- When commands are processed, dbx first checks to see if the word is an
alias for either a command or a string. If it is an alias, then dbx treats
the input as though the corresponding string (with values substituted for
any parameters) had been entered. For example, to define an alias ``rr''
for the command ``rerun'', one can say
alias rr rerunTo define an alias called ``b'' that sets a stop at a particular line one can say
alias b(x) ``stop at x''Subsequently, the command ``b(12)'' will expand to ``stop at 12''.
setname [= expression]- The
setcommand defines values for debugger variables. The names of these variables cannot conflict with names in the program being debugged, and are expanded to the corresponding expression within other commands. The following variables have a special meaning:$frame- Setting this variable to an address causes dbx to use the stack frame pointed to by the address for doing stack traces and accessing local variables. This facility is of particular use for kernel debugging.
$hexchars$hexints$hexoffsets$hexstrings- When set, dbx prints out out characters, integers, offsets from registers, or character pointers respectively in hexadecimal.
$listwindow- The value of this variable specifies the number of lines to list
around a function or when the
listcommand is given without any parameters. Its default value is 10. $mapaddrs- Setting (unsetting) this variable causes dbx to start (stop) mapping addresses. As with ``$frame'', this is useful for kernel debugging.
$unsafecall$unsafeassign- When ``$unsafecall'' is set, strict type checking is turned off for
arguments to subroutine or function calls ( e
.g. in the
callstatement). When ``$unsafeassign'' is set, strict type checking between the two sides of anassignstatement is turned off. These variables should be used only with great care, because they severely limit dbx's usefulness for detecting errors.
unaliasname- Remove the alias with the given name.
unsetname- Delete the debugger variable associated with name.
Machine Level Commands
tracei[address] [ifcond]tracei[variable] [ataddress] [ifcond]stopi[address] [ifcond]stopi[at] [address] [ifcond]- Turn on tracing or set a stop using a machine instruction address.
stepinexti- Single step as in
stepornext, but do a single instruction rather than source line. - address,address/[mode]
- address/[count] [mode]
- Print the contents of memory starting at the first
address and continuing up to the second
address or until count items
are printed. If the address is ``.'', the address following the one
printed most recently is used. The mode specifies
how memory is to be printed; if it is omitted the previous mode specified
is used. The initial mode is ``X''. The following modes are supported:
i- Print the machine instruction.
d- Print a short word in decimal.
D- Print a long word in decimal.
o- Print a short word in octal.
O- Print a long word in octal.
x- Print a short word in hexadecimal.
X- Print a long word in hexadecimal.
b- Print a byte in octal.
c- Print a byte as a character.
s- Print a string of characters terminated by a null byte.
f- Print a single precision real number.
g- Print a double precision real number.
Symbolic addresses are specified by preceding the name with an ``&''. Registers are denoted by ``$rN'' where N is the number of the register. Addresses may be expressions made up of other addresses and the operators ``+'', ``-'', and indirection (unary ``*'').
Miscellaneous Commands
gripe- Invoke a mail program to send a message to the person in charge of
dbx. help- Print out a synopsis of
dbxcommands. quit- Exit
dbx. shcommand-line- Pass the command line to the shell for execution. The
SHELLenvironment variable determines which shell is used. sourcefilename- Read
dbxcommands from the given filename.
ENVIRONMENT
Dbx examines the following environment
variables:
FILES
- a.out
- Object file.
- .dbxinit
- Initial commands.
SEE ALSO
HISTORY
The dbx command appeared in
4.2BSD.
BUGS
Dbx suffers from the same ``multiple
include'' malady as did sdb. If you have a program
consisting of a number of object files and each is built from source files
that include header files, the symbolic information for the header files is
replicated in each object file. Since about one debugger start-up is done
for each link, having the linker
ld(1)
re-organize the symbol information would not save much time, though it would
reduce some of the disk space used.
This problem is an artifact of the unrestricted semantics of #include's in C; for example an include file can contain static declarations that are separate entities for each file in which they are included. However, even with Modula-2 there is a substantial amount of duplication of symbol information necessary for inter-module type checking.
Some problems remain with the support for individual languages. Fortran problems include: inability to assign to logical, logical*2, complex and double complex variables; inability to represent parameter constants which are not type integer or real; peculiar representation for the values of dummy procedures (the value shown for a dummy procedure is actually the first few bytes of the procedure text; to find the location of the procedure, use ``&'' to take the address of the variable).