V7M/doc/adb/tut1
.sp 100
.nr PS 9
.nr VS 11
. \" START OF Figures
.de P1
.nf
.in +.5i
.ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i
.sp
.ps 9
.vs 11p
..
.de P2
.sp
.fi
.ps \\n(PS
.vs \\n(VS
.in -.5i
..
.SH
Figure 1: C program with pointer bug
.LP
.P1
struct buf {
int fildes;
int nleft;
char *nextp;
char buff[512];
}bb;
struct buf *obuf;
char *charp "this is a sentence.";
main(argc,argv)
int argc;
char **argv;
{
char cc;
if(argc < 2) {
printf("Input file missing\\n");
exit(8);
}
if((fcreat(argv[1],obuf)) < 0){
printf("%s : not found\\n", argv[1]);
exit(8);
}
charp = \'T\';
printf("debug 1 %s\\n",charp);
while(cc= *charp++)
putc(cc,obuf);
fflush(obuf);
}
.P2
.sp 100
.SH
Figure 2: ADB output for C program of Figure 1
.LP
.P1
.ft B
adb a.out core
$c
.ft R
~main(02,0177762)
.ft B
$C
.ft R
~main(02,0177762)
argc: 02
argv: 0177762
cc: 02124
.ft B
$r
.ft R
ps 0170010
pc 0204 ~main+0152
sp 0177740
r5 0177752
r4 01
r3 0
r2 0
r1 0
r0 0124
~main+0152: mov _obuf,(sp)
.ft B
$e
.ft R
savr5: 0
_obuf: 0
_charp: 0124
_errno: 0
_fout: 0
.ft B
$m
.ft R
text map \`ex1\'
b1 = 0 e1 = 02360 f1 = 020
b2 = 0 e2 = 02360 f2 = 020
data map \`core1\'
b1 = 0 e1 = 03500 f1 = 02000
b2 = 0175400 e2 = 0200000 f2 = 05500
.ft B
*charp/s
.ft R
0124: TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTLx Nh@x&_
~
.ft B
charp/s
.ft R
_charp: T
_charp+02: this is a sentence.
_charp+026: Input file missing
.ft B
main.argc/d
.ft R
0177756: 2
.ft B
*main.argv/3o
.ft R
0177762: 0177770 0177776 0177777
.ft B
0177770/s
.ft R
0177770: a.out
.ft B
*main.argv/3o
.ft R
0177762: 0177770 0177776 0177777
.ft B
*"/s
.ft R
0177770: a.out
.ft B
.=o
.ft R
0177770
.ft B
.\(mi10/d
.ft R
0177756: 2
.ft B
$q
.P2
.sp 100
.SH
Figure 3: Multiple function C program for stack trace illustration
.LP
.P1
int fcnt,gcnt,hcnt;
h(x,y)
{
int hi; register int hr;
hi = x+1;
hr = x\(miy+1;
hcnt++ ;
hj:
f(hr,hi);
}
g(p,q)
{
int gi; register int gr;
gi = q\(mip;
gr = q\(mip+1;
gcnt++ ;
gj:
h(gr,gi);
}
f(a,b)
{
int fi; register int fr;
fi = a+2*b;
fr = a+b;
fcnt++ ;
fj:
g(fr,fi);
}
main()
{
f(1,1);
}
.P2
.sp 100
.SH
Figure 4: ADB output for C program of Figure 3
.LP
.P1
.ft B
adb
$c
.ft R
~h(04452,04451)
~g(04453,011124)
~f(02,04451)
~h(04450,04447)
~g(04451,011120)
~f(02,04447)
~h(04446,04445)
~g(04447,011114)
~f(02,04445)
~h(04444,04443)
.ft B
HIT DEL KEY
.ft R
adb
.ft B
,5$C
.ft R
~h(04452,04451)
x: 04452
y: 04451
hi: ?
~g(04453,011124)
p: 04453
q: 011124
gi: 04451
gr: ?
~f(02,04451)
a: 02
b: 04451
fi: 011124
fr: 04453
~h(04450,04447)
x: 04450
y: 04447
hi: 04451
hr: 02
~g(04451,011120)
p: 04451
q: 011120
gi: 04447
gr: 04450
.ft B
fcnt/d
.ft R
_fcnt: 1173
.ft B
gcnt/d
.ft R
_gcnt: 1173
.ft B
hcnt/d
.ft R
_hcnt: 1172
.ft B
h.x/d
.ft R
022004: 2346
.ft B
$q
.P2
.sp 100
.SH
Figure 5: C program to decode tabs
.LP
.P1
#define MAXLINE 80
#define YES 1
#define NO 0
#define TABSP 8
.sp .5
char input[] "data";
char ibuf[518];
int tabs[MAXLINE];
.sp .5
main()
{
int col, *ptab;
char c;
.sp .5
ptab = tabs;
settab(ptab); /*Set initial tab stops */
col = 1;
if(fopen(input,ibuf) < 0) {
printf("%s : not found\\n",input);
exit(8);
}
while((c = getc(ibuf)) != \(mi1) {
switch(c) {
case \(fm\\t\(fm: /* TAB */
while(tabpos(col) != YES) {
putchar(\(fm \(fm); /* put BLANK */
col++ ;
}
break;
case \(fm\\n\(fm: /*NEWLINE */
putchar(\(fm\\n\(fm);
col = 1;
break;
default:
putchar(c);
col++ ;
}
}
}
.sp .5
/* Tabpos return YES if col is a tab stop */
tabpos(col)
int col;
{
if(col > MAXLINE)
return(YES);
else
return(tabs[col]);
}
.sp .5
/* Settab - Set initial tab stops */
settab(tabp)
int *tabp;
{
int i;
.sp .5
for(i = 0; i<= MAXLINE; i++)
(i%TABSP) ? (tabs[i] = NO) : (tabs[i] = YES);
}
.P2
.sp 100
.SH
Figure 6a: ADB output for C program of Figure 5
.LP
.P1
.ft B
adb a.out \(mi
settab+4:b
fopen+4:b
getc+4:b
tabpos+4:b
$b
.ft R
breakpoints
count bkpt command
1 ~tabpos+04
1 _getc+04
1 _fopen+04
1 ~settab+04
.ft B
settab,5?ia
.ft R
~settab: jsr r5,csv
~settab+04: tst \(mi(sp)
~settab+06: clr 0177770(r5)
~settab+012: cmp $0120,0177770(r5)
~settab+020: blt ~settab+076
~settab+022:
.ft B
settab,5?i
.ft R
~settab: jsr r5,csv
tst \(mi(sp)
clr 0177770(r5)
cmp $0120,0177770(r5)
blt ~settab+076
.ft B
:r
.ft R
a.out: running
breakpoint ~settab+04: tst \(mi(sp)
.ft B
settab+4:d
:c
.ft R
a.out: running
breakpoint _fopen+04: mov 04(r5),nulstr+012
.ft B
$C
.ft R
_fopen(02302,02472)
~main(01,0177770)
col: 01
c: 0
ptab: 03500
.ft B
tabs,3/8o
.ft R
03500: 01 0 0 0 0 0 0 0
01 0 0 0 0 0 0 0
01 0 0 0 0 0 0 0
.P2
.sp 100
.SH
Figure 6b: ADB output for C program of Figure 5
.LP
.P1
.ft B
:c
.ft R
a.out: running
breakpoint _getc+04: mov 04(r5),r1
.ft B
ibuf+6/20c
.ft R
__cleanu+0202: This is a test of
.ft B
:c
.ft R
a.out: running
breakpoint ~tabpos+04: cmp $0120,04(r5)
.ft B
tabpos+4:d
settab+4:b settab,5?ia
settab+4:b settab,5?ia; 0
getc+4,3:b main.c?C; 0
settab+4:b settab,5?ia; ptab/o; 0
$b
.ft R
breakpoints
count bkpt command
1 ~tabpos+04
3 _getc+04 main.c?C;0
1 _fopen+04
1 ~settab+04 settab,5?ia;ptab?o;0
~settab: jsr r5,csv
~settab+04: bpt
~settab+06: clr 0177770(r5)
~settab+012: cmp $0120,0177770(r5)
~settab+020: blt ~settab+076
~settab+022:
0177766: 0177770
0177744: @\`
T0177744: T
h0177744: h
i0177744: i
s0177744: s
.P2
.sp 100
.SH
Figure 7: ADB output for C program with breakpoints
.LP
.in +.5i
.nf
.ps 8
.vs 9
.ft B
adb ex3 \(mi
h+4:b hcnt/d; h.hi/; h.hr/
g+4:b gcnt/d; g.gi/; g.gr/
f+4:b fcnt/d; f.fi/; f.fr/
:r
.ft R
ex3: running
_fcnt: 0
0177732: 214
symbol not found
.ft B
f+4:b fcnt/d; f.a/; f.b/; f.fi/
g+4:b gcnt/d; g.p/; g.q/; g.gi/
h+4:b hcnt/d; h.x/; h.y/; h.hi/
:c
.ft R
ex3: running
_fcnt: 0
0177746: 1
0177750: 1
0177732: 214
_gcnt: 0
0177726: 2
0177730: 3
0177712: 214
_hcnt: 0
0177706: 2
0177710: 1
0177672: 214
_fcnt: 1
0177666: 2
0177670: 3
0177652: 214
_gcnt: 1
0177646: 5
0177650: 8
0177632: 214
.ft B
HIT DEL
f+4:b fcnt/d; f.a/"a = "d; f.b/"b = "d; f.fi/"fi = "d
g+4:b gcnt/d; g.p/"p = "d; g.q/"q = "d; g.gi/"gi = "d
h+4:b hcnt/d; h.x/"x = "d; h.y/"h = "d; h.hi/"hi = "d
:r
.ft R
ex3: running
_fcnt: 0
0177746: a = 1
0177750: b = 1
0177732: fi = 214
_gcnt: 0
0177726: p = 2
0177730: q = 3
0177712: gi = 214
_hcnt: 0
0177706: x = 2
0177710: y = 1
0177672: hi = 214
_fcnt: 1
0177666: a = 2
0177670: b = 3
0177652: fi = 214
.ft B
HIT DEL
$q
.in -.5i
.sp 100
.SH
Figure 8: ADB address maps
.LP
.de l1
.tc
.ta 1.20i +1.6i +2.5i
..
.de l3
.tc
.ta 1.6i +2.80i +.2i +1.55i
..
.de l2
.tc
.ti 1.0i
.ta +0.5i +3.0i +1.75i
.tc _
..
.de l5
.tc
.ti 1.0i
.ta +0.75i +3.0i +1.5i
.tc _
..
.de l6
.tc
.ti 1.0i
.ta +.8i +2.85i +0.4i +1.1i
..
.de l8
.tc
.ti 1.0i
.ta +0.5i +3.0i +1.75i
.tc _
..
.de la
.tc
.ta 1.20i +1.25i +1.7i
..
.de lc
.tc
.ti 1.0i
.ta +.85i +1.6i +.35i +1.1i
..
.de lb
.tc
.ti 1.0i
.ta +0.75i +1.75i +1.5i
.tc _
..
.ul
407 files
.sp
.l1
a.out hdr text+data
.l2
| | |
.l3
0 D
.sp
.l1
core hdr text+data stack
.l5
| | ......| |
.l6
0 D S E
.sp 2
.ul
410 files (shared text)
.sp
.l1
a.out hdr text data
.l2
| | | |
.l3
0 T B D
.sp
.la
core hdr data stack
.lb
| | ......| |
.lc
B D S E
.sp 2
.ul
411 files (separated I and D space)
.sp
.l1
a.out hdr text data
.l2
| | | |
.l3
0 T 0 D
.sp
.la
core hdr data stack
.lb
| | ......| |
.lc
0 D S E
.sp 2
The following
.ul
adb
variables are set.
.nf
.ta .75i 1.5i 3.5i 4.5i 5.5i
.sp
407 410 411
.sp
b base of data 0 B 0
d length of data D D\(miB D
s length of stack S S S
t length of text 0 T T
.sp 100
.SH
Figure 9: ADB output for maps
.LP
.nf
.in +.5i
.ft B
adb map407 core407
$m
.ft R
text map \`map407\'
b1 = 0 e1 = 0256 f1 = 020
b2 = 0 e2 = 0256 f2 = 020
data map \`core407\'
b1 = 0 e1 = 0300 f1 = 02000
b2 = 0175400 e2 = 0200000 f2 = 02300
.ft B
$v
.ft R
variables
d = 0300
m = 0407
s = 02400
.ft B
$q
.sp 2
adb map410 core410
$m
.ft R
text map \`map410\'
b1 = 0 e1 = 0200 f1 = 020
b2 = 020000 e2 = 020116 f2 = 0220
data map \`core410\'
b1 = 020000 e1 = 020200 f1 = 02000
b2 = 0175400 e2 = 0200000 f2 = 02200
.ft B
$v
.ft R
variables
b = 020000
d = 0200
m = 0410
s = 02400
t = 0200
.ft B
$q
.sp 2
adb map411 core411
$m
.ft R
text map \`map411\'
b1 = 0 e1 = 0200 f1 = 020
b2 = 0 e2 = 0116 f2 = 0220
data map \`core411\'
b1 = 0 e1 = 0200 f1 = 02000
b2 = 0175400 e2 = 0200000 f2 = 02200
.ft B
$v
.ft R
variables
d = 0200
m = 0411
s = 02400
t = 0200
.ft B
$q
.in -.5i
.sp 100
.SH
Figure 10: Simple C program for illustrating formatting and patching
.LP
.P1
char str1[] "This is a character string";
int one 1;
int number 456;
long lnum 1234;
float fpt 1.25;
char str2[] "This is the second character string";
main()
{
one = 2;
}
.P2
.sp 100
.SH
Figure 11: ADB output illustrating fancy formats
.LP
.nf
.ps 9
.vs 11p
.ft B
adb map410 core410
<b,\(mi1/8ona
.ft R
020000: 0 064124 071551 064440 020163 020141 064143 071141
.sp .5
_str1+016: 061541 062564 020162 072163 064562 063556 0 02
.sp .5
_number:
_number: 0710 0 02322 040240 0 064124 071551 064440
.sp .5
_str2+06: 020163 064164 020145 062563 067543 062156 061440 060550
.sp .5
_str2+026: 060562 072143 071145 071440 071164 067151 0147 0
.sp .5
savr5+02: 0 0 0 0 0 0 0 0
.sp .5
.ft B
<b,20/4o4^8Cn
.ft R
020000: 0 064124 071551 064440 @\`@\`This i
020163 020141 064143 071141 s a char
061541 062564 020162 072163 acter st
064562 063556 0 02 ring@\`@\`@b@\`
.sp .5
_number: 0710 0 02322 040240 H@a@\`@\`R@d @@
0 064124 071551 064440 @\`@\`This i
020163 064164 020145 062563 s the se
067543 062156 061440 060550 cond cha
060562 072143 071145 071440 racter s
071164 067151 0147 0 tring@\`@\`@\`
0 0 0 0 @\`@\`@\`@\`@\`@\`@\`@\`
0 0 0 0 @\`@\`@\`@\`@\`@\`@\`@\`
data address not found
.ft B
<b,20/4o4^8t8cna
.ft R
020000: 0 064124 071551 064440 This i
_str1+06: 020163 020141 064143 071141 s a char
_str1+016: 061541 062564 020162 072163 acter st
_str1+026: 064562 063556 0 02 ring
_number:
_number: 0710 0 02322 040240 HR
_fpt+02: 0 064124 071551 064440 This i
_str2+06: 020163 064164 020145 062563 s the se
_str2+016: 067543 062156 061440 060550 cond cha
_str2+026: 060562 072143 071145 071440 racter s
_str2+036: 071164 067151 0147 0 tring
savr5+02: 0 0 0 0
savr5+012: 0 0 0 0
data address not found
.ft B
<b,10/2b8t^2cn
.ft R
020000: 0 0
.sp .5
_str1: 0124 0150 Th
0151 0163 is
040 0151 i
0163 040 s
0141 040 a
0143 0150 ch
0141 0162 ar
0141 0143 ac
0164 0145 te
.ft B
$Q
.sp 100
.SH
Figure 12: Directory and inode dumps
.LP
.nf
.ft B
adb dir \(mi
=nt"Inode"t"Name"
0,\(mi1?ut14cn
.ft R
Inode Name
0: 652 .
82 ..
5971 cap.c
5323 cap
0 pp
.sp 4
.ft B
adb /dev/src \(mi
.ft B
02000>b
?m<b
.ft R
new map \`/dev/src\'
b1 = 02000 e1 = 0100000000 f1 = 0
b2 = 0 e2 = 0 f2 = 0
.ft B
$v
.ft R
variables
b = 02000
.ft B
<b,\(mi1?"flags"8ton"links,uid,gid"8t3bn"size"8tbrdn"addr"8t8un"times"8t2Y2na
.ft R
02000: flags 073145
links,uid,gid 0163 0164 0141
size 0162 10356
addr 28770 8236 25956 27766 25455 8236 25956 25206
times 1976 Feb 5 08:34:56 1975 Dec 28 10:55:15
02040: flags 024555
links,uid,gid 012 0163 0164
size 0162 25461
addr 8308 30050 8294 25130 15216 26890 29806 10784
times 1976 Aug 17 12:16:51 1976 Aug 17 12:16:51
02100: flags 05173
links,uid,gid 011 0162 0145
size 0147 29545
addr 25972 8306 28265 8308 25642 15216 2314 25970
times 1977 Apr 2 08:58:01 1977 Feb 5 10:21:44
.\"
.\" Start of Summary
.sp 100
.TL
ADB Summary
.LP
.LP
.if t .2C
.nr VS 9
.nr VS 11
.SH
Command Summary
.LP
.ta .7i
a) formatted printing
.sp .5
.IP "\fB? \fIformat\fR" .7i
print from \fIa.out\fR file according to \fIformat\fR
.IP "\fB/ \fIformat\fR" .7i
print from \fIcore\fR file according to \fIformat\fR
.IP "\fB= \fIformat\fR" .7i
print the value of \fIdot\fR
.sp .5
.IP "\fB?w\fR expr" .7i
write expression into \fIa.out\fR file
.IP "\fB/w\fR expr" .7i
write expression into \fIcore\fR file
.sp .5
.IP "\fB?l\fR expr" .7i
locate expression in \fIa.out\fR file
.LP
.ta .7i
b) breakpoint and program control
.LP
.ta .7i
.nf
.ta .7i
\fB:b\fR set breakpoint at \fIdot\fR
\fB:c\fR continue running program
\fB:d\fR delete breakpoint
\fB:k\fR kill the program being debugged
\fB:r\fR run \fIa.out\fR file under ADB control
\fB:s\fR single step
.LP
.ta .7i
c) miscellaneous printing
.LP
.ta .7i
.nf
\fB$b\fR print current breakpoints
\fB$c\fR C stack trace
\fB$e\fR external variables
\fB$f\fR floating registers
\fB$m\fR print ADB segment maps
\fB$q\fR exit from ADB
\fB$r\fR general registers
\fB$s\fR set offset for symbol match
\fB$v\fR print ADB variables
\fB$w\fR set output line width
.LP
.ta .7i
d) calling the shell
.LP
.ta .7i
.nf
\fB!\fR call \fIshell\fP to read rest of line
.LP
.ta .7i
e) assignment to variables
.LP
.ta .7i
.nf
\fB>\fIname\fR assign dot to variable or register \fIname\fR
.sp 100
.SH
Format Summary
.LP
.ta .7i
.nf
\fBa \fRthe value of dot
\fBb \fRone byte in octal
\fBc \fRone byte as a character
\fBd \fRone word in decimal
\fBf \fRtwo words in floating point
\fBi \fRPDP 11 instruction
\fBo \fRone word in octal
\fBn \fRprint a newline
\fBr \fRprint a blank space
\fBs \fRa null terminated character string
\fIn\fBt \fRmove to next \fIn\fR space tab
\fBu \fRone word as unsigned integer
\fBx \fRhexadecimal
\fBY \fRdate
\fB^ \fRbackup dot
\fB"..."\fR print string
.LP
.ta .7i
.SH
Expression Summary
.LP
.ta .7i
a) expression components
.LP
.ta .1.1i
.nf
\fBdecimal integer \fRe.g. 256
\fBoctal integer \fRe.g. 0277
\fBhexadecimal \fRe.g. #ff
\fBsymbols \fRe.g. flag _main main.argc
\fBvariables \fRe.g. <b
\fBregisters \fRe.g. <pc <r0
\fB(expression) \fRexpression grouping
.LP
.ta .7i
b) dyadic operators
.LP
.ta .7i
.nf
\fB+\fP add
\fB\(mi\fP subtract
\fB*\fP multiply
\fB%\fP integer division
\fB&\fP bitwise and
\fB|\fP bitwise or
\fB#\fP round up to the next multiple
.LP
.ta .7i
c) monadic operators
.LP
.ta .7i
.nf
\v'.25m'\s+2\fB~\fP\s0\v'-.25m' not
\fB*\fR contents of location
\fB\(mi\fR integer negate
.fi