422 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			422 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
.\" $Header$
 | 
						|
.TH GRIND 1
 | 
						|
.SH NAME
 | 
						|
grind \- source-level debugger for ACK
 | 
						|
.SH SYNOPSIS
 | 
						|
.B grind
 | 
						|
[
 | 
						|
.I <ACK object file>
 | 
						|
]
 | 
						|
[
 | 
						|
.I <object file>
 | 
						|
]
 | 
						|
.SH DESCRIPTION
 | 
						|
.B Grind
 | 
						|
is a utility for source-level debugging and execution of
 | 
						|
programs written in C, Modula-2, or Pascal.
 | 
						|
Its operation resembles the operation of 
 | 
						|
.IR dbx ,
 | 
						|
a source-level debugger
 | 
						|
available on many Unix systems. However, some
 | 
						|
.B grind
 | 
						|
commands are not available in
 | 
						|
.IR dbx ,
 | 
						|
some
 | 
						|
.I dbx
 | 
						|
commands are not available in
 | 
						|
.BR grind ,
 | 
						|
and some things are just different.
 | 
						|
.LP
 | 
						|
.I <object file>
 | 
						|
is an object file, produced by
 | 
						|
.IR ack (1)
 | 
						|
with the
 | 
						|
.B \-g
 | 
						|
option to include a symbol table.
 | 
						|
.LP
 | 
						|
If no
 | 
						|
.I <object file>
 | 
						|
is specified, "a.out" is used.
 | 
						|
.LP
 | 
						|
For some machines, the debugger does not recognize the object file
 | 
						|
format. For these machines, the result of the
 | 
						|
.IR led (6)
 | 
						|
program must be saved and offered to
 | 
						|
.BR grind .
 | 
						|
.SH USAGE
 | 
						|
Some
 | 
						|
.B grind
 | 
						|
commands take an expression argument.
 | 
						|
.SS Expressions
 | 
						|
.B Grind
 | 
						|
expressions are combinations of variables, constants, and operators.
 | 
						|
The syntax and the operators depend on the source language of the program
 | 
						|
being debugged. However, the type rules are probably less strict than the
 | 
						|
rules of this language. For instance, in Modula-2 one cannot combine
 | 
						|
values of type INTEGER with values of type REAL in an expression without
 | 
						|
using conversion routines. In
 | 
						|
.BR grind ,
 | 
						|
the conversions needed are performed automatically.
 | 
						|
.LP
 | 
						|
Expressions whose value is to be printed can be given a "format" by appending
 | 
						|
a `\e', followed by a format. A format consists of a string of letters.
 | 
						|
The following letters are available:
 | 
						|
.LP
 | 
						|
.nf
 | 
						|
c	print all integer values as a char
 | 
						|
d	print all integer values in signed decimal format
 | 
						|
o	print all integer values in octal format
 | 
						|
x	print all integer values in hexadecimal format
 | 
						|
h	print all integer values in hexadecimal format
 | 
						|
u	print all integer values in unsigned decimal format
 | 
						|
s	for "pointer to char" types, make an attempt to print
 | 
						|
	the indicated string
 | 
						|
.fi
 | 
						|
.SS Operators
 | 
						|
.LP
 | 
						|
.B Grind
 | 
						|
supports operators for addition, subtraction, multiplication, division,
 | 
						|
remainder, bitwise or, bitwise xor, bitwise and, boolean or,
 | 
						|
boolean and, left-shift, right-shift, address-of, dereference, less than,
 | 
						|
less than or equal, equal, not equal, greater than, greater than or equal,
 | 
						|
selection, array subscripting.
 | 
						|
.LP
 | 
						|
The syntax and priority of these operators depends on the source language.
 | 
						|
Parentheses can be used for grouping.
 | 
						|
.SS "Scope Rules"
 | 
						|
.LP
 | 
						|
.B Grind
 | 
						|
uses the current file and function to resolve scope conflicts.
 | 
						|
Their values are updated as files and functions are entered and exited
 | 
						|
during execution.
 | 
						|
Names can also be qualified with procedure- or module names, as in
 | 
						|
\fImodule\fP`\fIprocedure\fP`\fIname\fP.
 | 
						|
.B Grind
 | 
						|
tries to be intelligent about names; qualification is only needed when
 | 
						|
names are used for more than one object in a program and the current scope
 | 
						|
does not help.
 | 
						|
.SS "Positions"
 | 
						|
In general, there are two ways to specify a position; the first way is
 | 
						|
to specify file name and line number, in a so-called at-clause, like this:
 | 
						|
.RS
 | 
						|
\fBat\fP [ "\fIfilename\fP": ] \fIlinenumber\fP
 | 
						|
.RE
 | 
						|
The
 | 
						|
.I filename
 | 
						|
part is optional.
 | 
						|
The second way is to specify a function name, like this:
 | 
						|
.RS
 | 
						|
\fBin \fIfunction\fP
 | 
						|
.RE
 | 
						|
This indicates the first statement within the named function (except for
 | 
						|
the trace command discussed later).
 | 
						|
The following way is also accepted:
 | 
						|
.RS
 | 
						|
\fBin\fP \fIfunction\fP \fBat\fP [ "\fIfilename\fP": ] \fIlinenumber\fP
 | 
						|
.RE
 | 
						|
In this case, consistency of the information given is checked. This last
 | 
						|
form is useful for "stuffing" output from the status command described later.
 | 
						|
.SS "Command numbers"
 | 
						|
.LP
 | 
						|
Some command numbers have a command number associated with them. Other commands
 | 
						|
refer to these command numbers. These command numbers can either be given as
 | 
						|
an absolute number, or as a negative number. In the last case, the number
 | 
						|
is interpreted relative to the last number assigned. This feature is normally
 | 
						|
only used for commands that are put in a log file, so that "sourceing" these
 | 
						|
log files is safer (see also the description of the \fBsource\fP and \fBlog\fP
 | 
						|
commands).
 | 
						|
 | 
						|
.SS "Commands"
 | 
						|
.TP
 | 
						|
.B ^C
 | 
						|
Interrupt.  Stop the program being debugged and enter
 | 
						|
.BR grind .
 | 
						|
.TP
 | 
						|
\fBrun\fP [ \fIargs\fP ] [ < \fIinfile\fP ] [ > \fIoutfile\fP ]
 | 
						|
Start executing
 | 
						|
.I <object file>
 | 
						|
with command line arguments
 | 
						|
.IR args ,
 | 
						|
and possible redirection of standard input and/or standard output.
 | 
						|
.TP
 | 
						|
.B rerun
 | 
						|
Repeats the last
 | 
						|
.B run
 | 
						|
command.
 | 
						|
.TP
 | 
						|
.B "rerun ?"
 | 
						|
Prints the last 
 | 
						|
.B run
 | 
						|
command.
 | 
						|
.TP
 | 
						|
\fBcont\fP [ \fIcount\fP ] [ \fBat\fP \fIsourceline\fP ]
 | 
						|
.ti -0.5i
 | 
						|
\fBc\fP [ \fIcount\fP ] [ \fBat\fP \fIsourceline\fP ]
 | 
						|
.br
 | 
						|
Continue execution from where it stopped, or, if \fIsourceline\fP is
 | 
						|
given, at that source line. If \fIcount\fP is given, pass \fIcount\fP-1
 | 
						|
breakpoints. \fIsourceline\fP must be in the same function.
 | 
						|
.TP
 | 
						|
\fBtrace\fP [ \fBon\fP \fIexpression\fP ] [ \fIposition\fP ] [ \fBif\fP \fIcondition\fP ]
 | 
						|
.ti -0.5i
 | 
						|
\fBt\fP [ \fBon\fP \fIexpression\fP ] [ \fIposition\fP ] [ \fBif\fP \fIcondition\fP ]
 | 
						|
.br
 | 
						|
Display tracing information.
 | 
						|
If no argument is specified, each source line is displayed before
 | 
						|
execution.
 | 
						|
In addition, if an \fBon\fP-clause is given, the value of the expression
 | 
						|
is printed.
 | 
						|
If a position is given there are two possibilities: if the position is
 | 
						|
given as \fBin\fP \fIfunction\fP, then the tracing information is
 | 
						|
displayed only while executing the function or
 | 
						|
procedure
 | 
						|
.IR function .
 | 
						|
If the position is given as \fBat\fP \fIlinenumber\fP,
 | 
						|
then the tracing information is displayed only whenever the source line
 | 
						|
indicated is reached.
 | 
						|
If the position is given as \fBat\fP \fIlinenumber\fP \fBin\fP \fIfunction\fP,
 | 
						|
the behavior is as if it was given as \fBat\fP \fIlinenumber\fP.
 | 
						|
If a condition is given, tracing information is only displayed when
 | 
						|
.I condition
 | 
						|
is true.
 | 
						|
.TP
 | 
						|
\fBstop\fP [ \fIposition\fP ] [ \fBif\fP \fIcondition\fP ]
 | 
						|
Stop execution when the
 | 
						|
.I position
 | 
						|
is reached, and then when
 | 
						|
.I condition
 | 
						|
becomes true.
 | 
						|
If no position is given, stop when
 | 
						|
.I condition
 | 
						|
becomes true.
 | 
						|
If no condition is given, stop when
 | 
						|
.I position
 | 
						|
is reached.
 | 
						|
Either a position or a condition (or both) must be given.
 | 
						|
.TP
 | 
						|
\fBwhen\fP [ \fIposition\fP ] [ \fBif\fP \fIcondition\fP ] { \fIcommand\fP [ ; \fIcommand\fP ] ... }
 | 
						|
Execute the
 | 
						|
.B grind
 | 
						|
.IR command (s)
 | 
						|
when the
 | 
						|
.I position
 | 
						|
is reached, and then when
 | 
						|
.I condition
 | 
						|
becomes true.
 | 
						|
If no position is given, do this when
 | 
						|
.I condition
 | 
						|
becomes true.
 | 
						|
If no condition is given, do this when
 | 
						|
.I position
 | 
						|
is reached.
 | 
						|
Either a position or a condition (or both) must be given.
 | 
						|
.TP
 | 
						|
\fBprint\fP [ \fIexpression\fP [ , \fIexpression\fP ] ... ]
 | 
						|
.ti -0.5i
 | 
						|
\fBp\fP [ \fIexpression\fP [ , \fIexpression\fP ] ... ]
 | 
						|
.br
 | 
						|
Print the value of each expression. If no argument is given, repeat the
 | 
						|
last
 | 
						|
.B print
 | 
						|
command.
 | 
						|
.TP
 | 
						|
\fBdisplay\fP \fIexpression\fP [ , \fIexpression\fP ] ...
 | 
						|
Print the value of each expression whenever the program stops.
 | 
						|
.TP
 | 
						|
.B dump
 | 
						|
Saves the data (global data + stack) of the program. These data can
 | 
						|
be restore with the
 | 
						|
.B restore
 | 
						|
command discussed later.
 | 
						|
.B Dump
 | 
						|
and
 | 
						|
.B restore
 | 
						|
combinations can be used as a poor man's implementation of an "undo"
 | 
						|
facility.
 | 
						|
.TP
 | 
						|
.B status
 | 
						|
Display active
 | 
						|
.BR trace ,
 | 
						|
.BR stop ,
 | 
						|
.BR when ,
 | 
						|
and
 | 
						|
.B display
 | 
						|
commands, and associated command numbers.
 | 
						|
Also display current
 | 
						|
.B dump
 | 
						|
records.
 | 
						|
.TP
 | 
						|
\fBdelete\fP [ \fIcommandnumber\fP [ , \fIcommandnumber\fP ... ] ]
 | 
						|
.ti -0.5i
 | 
						|
\fBd\fP [ \fIcommandnumber\fP [ , \fIcommandnumber\fP ... ] ]
 | 
						|
.br
 | 
						|
Remove the commands corresponding to the \fIcommandnumber\fP's given
 | 
						|
(as displayed by
 | 
						|
.BR status ).
 | 
						|
If no argument is given and there is a "current" breakpoint, remove that
 | 
						|
breakpoint.
 | 
						|
.TP
 | 
						|
\fBrestore\fP [ \fIcommandnumber\fP ]
 | 
						|
.ti -0.5i
 | 
						|
\fBr\fP [ \fIcommandnumber\fP ]
 | 
						|
.br
 | 
						|
Restore the data corresponding to the dump of \fIcommandnumber\fP
 | 
						|
(as displayed by
 | 
						|
.BR status ).
 | 
						|
This restores the values of all variables of the program to the values
 | 
						|
at the time the dump was made. The program counter is also restored.
 | 
						|
This effectively puts the program back into the state it was when the
 | 
						|
dump was made, except for file-handling: the state of the files that
 | 
						|
the program handles is not changed.
 | 
						|
Apart from this,
 | 
						|
.B restore
 | 
						|
even works when the program is finished.
 | 
						|
If no \fIcommandnumber\fP is given, the last dump is restored.
 | 
						|
.TP
 | 
						|
\fBstep\fP [ \fIn\fP ]
 | 
						|
.ti -0.5i
 | 
						|
\fBs\fP [ \fIn\fP ]
 | 
						|
.br
 | 
						|
Execute the next
 | 
						|
.I n
 | 
						|
source lines.
 | 
						|
If omitted,
 | 
						|
.I n
 | 
						|
is taken to be 1.
 | 
						|
This command steps into functions.
 | 
						|
.TP
 | 
						|
\fBnext\fP [ \fIn\fP ]
 | 
						|
.ti -0.5i
 | 
						|
\fBn\fP [ \fIn\fP ]
 | 
						|
.br
 | 
						|
Execute the next
 | 
						|
.I n
 | 
						|
source lines.
 | 
						|
If omitted,
 | 
						|
.I n
 | 
						|
is taken to be 1.
 | 
						|
.B Next
 | 
						|
steps past function-calls.
 | 
						|
.TP
 | 
						|
\fBwhich\fP \fIname\fP
 | 
						|
Print the fully-qualified name of the given name.
 | 
						|
.TP
 | 
						|
\fBfind\fP \fIname\fP
 | 
						|
Print the fully qualified name of all symbols matching
 | 
						|
.IR name .
 | 
						|
.TP
 | 
						|
\fBset\fP \fIexpression\fP \fBto\fP \fIexpression\fP
 | 
						|
Assign the value of the second
 | 
						|
.I expression
 | 
						|
to the designator indicated by the first
 | 
						|
.IR expression .
 | 
						|
Needless to say, the first
 | 
						|
.I expression
 | 
						|
must indicate a designator (something that can be assigned to).
 | 
						|
If the types do not match,
 | 
						|
.B grind
 | 
						|
tries to apply conversions.
 | 
						|
.TP
 | 
						|
\fBwhere\fP [ \fIn\fP | -\fIn\fP ]
 | 
						|
.ti -0.5i
 | 
						|
\fBw\fP [ \fIn\fP | -\fIn\fP ]
 | 
						|
.br
 | 
						|
List all, or the top
 | 
						|
.IR n ,
 | 
						|
or the bottom
 | 
						|
.IR n ,
 | 
						|
active functions on the stack.
 | 
						|
.TP
 | 
						|
\fBfile\fP [ \fIfilename\fP ]
 | 
						|
Print the name of the current source file, or
 | 
						|
change the current source file to
 | 
						|
.IR filename .
 | 
						|
.TP
 | 
						|
\fBlist\fP [ \fIstartline\fP | \fIfunction\fP ] [ , \fIcount\fP | - [ \fIendline\fP ] ]
 | 
						|
.ti -0.5i
 | 
						|
\fBl\fP [ \fIstartline\fP | \fIfunction\fP ] [ , \fIcount\fP | - [ \fIendline\fP ] ]
 | 
						|
.br
 | 
						|
If no arguments are given, list the next \fIws\fP (default 10) lines from current source file,
 | 
						|
if a
 | 
						|
.I startline
 | 
						|
is given, list from
 | 
						|
.IR startline ,
 | 
						|
if a
 | 
						|
.I function
 | 
						|
is given, list from the first statement of
 | 
						|
.IR function .
 | 
						|
If a \fIcount\fP is given, list \fIcount\fP lines and set \fIws\fP to \fIcount\fP.
 | 
						|
If an \fIendline\fP is given, list up until this line; if a - is given without
 | 
						|
an \fIendline\fP, list up until the end of the file.
 | 
						|
.TP
 | 
						|
\fBhelp\fP [ \fIcommand\fP ]
 | 
						|
.ti -0.5i
 | 
						|
\fB?\fP [ \fIcommand\fP ]
 | 
						|
.br
 | 
						|
Print a summary of \fBgrind\fP commands, or print a message explaining
 | 
						|
\fIcommand\fP.
 | 
						|
.TP
 | 
						|
\fBsource\fP \fIfilename\fP
 | 
						|
.br
 | 
						|
Read and execute \fBgrind\fP commands from \fIfilename\fP. This is useful for
 | 
						|
executing \fBgrind\fP log files created with the \fBlog\fP command.
 | 
						|
.TP
 | 
						|
\fBlog\fP [ \fIfilename\fP | off ]
 | 
						|
.br
 | 
						|
Start logging the \fBgrind\fP commands given on file \fIfilename\fP, or
 | 
						|
stop logging. If no argument is given, the current log file is printed.
 | 
						|
In logged commands, an absolute command number is replaced by a relative one.
 | 
						|
.TP
 | 
						|
\fBdisable\fP [ \fIcommandnumber\fP [ , \fIcommandnumber\fP ... ] ]
 | 
						|
.br
 | 
						|
Disable the commands corresponding to the \fIcommandnumber\fP's given
 | 
						|
(as displayed by
 | 
						|
.BR status ).
 | 
						|
If no argument is given and there is a "current" breakpoint, disable that
 | 
						|
breakpoint.
 | 
						|
Disabling commands keeps them in the status, but makes them inoperative.
 | 
						|
Disabled commands can be enabled again with the \fBenable\fP command.
 | 
						|
.TP
 | 
						|
\fBenable\fP [ \fIcommandnumber\fP [ , \fIcommandnumber\fP ... ] ]
 | 
						|
.br
 | 
						|
Enable the commands corresponding to the \fIcommandnumber\fP's given
 | 
						|
(as displayed by
 | 
						|
.BR status ).
 | 
						|
If no argument is given and there is a "current" breakpoint, enable that
 | 
						|
breakpoint.
 | 
						|
.TP
 | 
						|
\fB!\fP \fIshellcommand\fP
 | 
						|
.br
 | 
						|
Invoke the shell with \fIshellcommand\fP. \fIshellcommand\fP extends to the
 | 
						|
end of the line. In the command, the characters `%' and `!' are replaced
 | 
						|
with the current file name and the previous shell command respectively.
 | 
						|
The sequences `\e%' and `\e!' are replaced by `%' and `!' respectively.
 | 
						|
.TP
 | 
						|
\fBframe\fP [ \fIcount\fP | + \fIcount\fP | - \fIcount\fP ]
 | 
						|
.br
 | 
						|
The currently active procedure has frame number 0, the one that invoked this
 | 
						|
one has frame number 1, etc. The \fBframe\fP command allows the user to
 | 
						|
examine stack frames beyond the current one. For instance, after giving the
 | 
						|
command `frame 1', variables of the frame invoking the currently active
 | 
						|
procedure can be examined. There is a relative and an absolute version of this
 | 
						|
command.
 | 
						|
.TP
 | 
						|
.B quit
 | 
						|
.br
 | 
						|
Exit
 | 
						|
.BR grind .
 | 
						|
.LP
 | 
						|
Some commands can be repeated without arguments by entering an empty command line:
 | 
						|
step, next, list, cont.
 | 
						|
.SH SEE ALSO
 | 
						|
.IR ack (1).
 | 
						|
.IR led (6).
 | 
						|
.SH REMARKS
 | 
						|
.LP
 | 
						|
.B Grind
 | 
						|
does not understand the scope of WITH statements. The scope information needed
 | 
						|
is not available in the symbol table.
 | 
						|
.SH BUGS
 | 
						|
.LP
 | 
						|
.B Grind
 | 
						|
does not correctly handle bit-fields.
 |