It is possible with ADB to combine formatting requests to provide elaborate displays. Below are several examples.
The line:
<b,-1/4o4^8Cn
prints 4 octal words followed by their ASCII interpretation
from the data space of the core image file.
Broken down, the various request pieces mean:
<b The base address of the data segment.
<b,-1 Print from the base address to the end of file.
A negative count is used here and elsewhere to loop indefinitely
or until some error condition (like end of file) is detected.
The format 4o4^8Cn is broken down as follows:
4o Print 4 octal locations.
4^ Backup the current address 4 locations (to the original start of the field).
8C Print 8 consecutive characters using an escape convention;
each character in the range 0 to 037 is printed as @ followed by the corresponding character in the range 0140 to 0177.
An @ is printed as @@.
n Print a newline.
The request:
<b,<d/4o4^8Cn
could have been used instead to allow the printing to stop
at the end of the data segment (<d provides the data segment size in bytes).
The formatting requests can be combined with ADB's ability
to read in a script to produce a core image dump script.
ADB is invoked as:
adb a.out core < dump
to read in a script file,
dump,
of requests.
An example of such a script is:
120$w
4095$s
$v
=3n
$m
=3n"C Stack Backtrace"
$C
=3n"C External Variables"
$e
=3n"Registers"
$r
0$s
=3n"Data Segment"
<b,-1/8ona
The request 120$w sets the width of the output to
120 characters
(normally, the width is 80 characters).
ADB attempts to print addresses as:
symbol + offset
The request 4095$s increases the maximum permissible offset
to the nearest symbolic address from 255 (default) to 4095.
The request = can be used to print literal strings.
Thus,
headings are provided in this
dump
program
with requests of the form:
=3n"C Stack Backtrace"
that spaces three lines and prints the literal
string.
The request $v prints all non-zero ADB variables (see Figure 8).
The request
0$s
sets the maximum offset for symbol matches to zero thus
suppressing the printing of symbolic labels in favor
of octal values.
Note that this is only done for the printing of the data segment.
The request:
<b,-1/8ona
prints a dump from the base of the data segment to the end of file
with an octal address field and eight octal numbers per line.
Figure 11 shows the results of some formatting requests on the C program of Figure 10.
As another illustration (Figure 12) consider a set of requests to dump
the contents of a directory (which is made up
of an integer inumber followed by a 14 character name):
adb dir -
=n8t"Inum"8t"Name"
0,-1? u8t14cn
In this example, the u prints the inumber as an unsigned decimal integer,
the 8t means that ADB will space to the next
multiple of 8 on the output line, and the 14c prints the 14 character file name.
Similarly the contents of the ilist of a file system, (e.g. /dev/src,
on UNIX systems distributed by the UNIX Support Group;
see UNIX Programmer's
Manual Section V) could be dumped with the following set of
requests:
adb /dev/src -
02000>b
?m <b
<b,-1?"flags"8ton"links,uid,gid"8t3bn",size"8tbrdn"addr"8t8un"times"8t2Y2na
In this example the value of the base for the map was changed
to 02000 (by saying ?m<b) since that is the start of an ilist within a file system.
An artifice (brd above) was used to print the 24 bit size field
as a byte, a space, and a decimal integer.
The last access time and last modify time are printed with the
2Y
operator.
Figure 12 shows portions of these requests as applied to a directory
and file system.
ADB may be used to convert values from one representation to
another.
For example:
072 = odx
will print
072 58 #3a
which is the octal, decimal and hexadecimal representations
of 072 (octal).
The format is remembered so that typing
subsequent numbers will print them in the given formats.
Character values may be converted similarly, for example:
'a' = co
prints
a 0141
It may also be used to evaluate expressions but be
warned that all binary operators have
the same precedence which is lower than that for unary operators.