Blob


1 .TH ACID 1
2 .SH NAME
3 acid, acidtypes \- debugger
4 .SH SYNOPSIS
5 .B acid
6 [
7 .BI -l " library
8 ]
9 [
10 .B -wq
11 ] [
12 .B -m
13 .I machine
14 ] [
15 .I pid
16 |
17 .I core
18 ]
19 [
20 .I textfile
21 ]
22 .PP
23 .B acidtypes
24 [
25 .B -p
26 .I prefix
27 ]
28 .I file
29 \&...
30 .\" .PP
31 .\" .B acid
32 .\" .B -l
33 .\" .B truss
34 .\" .I textfile
35 .\" .PP
36 .\" .B acid
37 .\" .B -l
38 .\" .B trump
39 .\" [
40 .\" .I pid
41 .\" ]
42 .\" [
43 .\" .I textfile
44 .\" ]
45 .SH DESCRIPTION
46 .I Acid
47 is a programmable symbolic debugger.
48 It can inspect one or more processes that share an address space.
49 A program to be debugged may be specified by the process id of
50 a running or defunct process,
51 or by the name of the program's text file
52 .RB ( a.out
53 by default).
54 At the prompt,
55 .I acid
56 will store function definitions or print the value of expressions.
57 Options are
58 .TP .9i
59 .B -w
60 Allow the textfile to be modified.
61 .TP
62 .B -q
63 Print variable renamings at startup.
64 .TP
65 .BI -l " library
66 Load from
67 .I library
68 at startup; see below.
69 .TP
70 .BI -m " machine
71 Assume instructions are for the given CPU type
72 (see
73 .MR mach (3) )
74 instead of using the executable header to select
75 the CPU type.
76 .TP
77 .BI -k
78 Debug the kernel state for the process, rather than the user state.
79 .PP
80 At startup,
81 .I acid
82 obtains standard function definitions from the library file
83 .BR \*9/acid/port ,
84 architecture-dependent functions from
85 .BR \*9/acid/$objtype ,
86 user-specified functions from
87 .BR $HOME/lib/acid ,
88 and further functions from
89 .B -l
90 files.
91 Definitions in any file may override previously defined functions.
92 If the function
93 .IR acidinit ()
94 is defined, it will be invoked after all modules have been loaded.
95 Then the function
96 .IR acidmap ()
97 will be invoked if defined.
98 .B \*9/acid/port
99 provides a definition of
100 .I acidmap
101 that attaches all the shared libraries being used by the target process
102 and then runs
103 .I acidtypes
104 .RI ( q.v. )
105 to create
106 .I acid
107 functions for examining data structures.
108 .SS Language
109 Symbols of the program being debugged become integer
110 variables whose values are addresses.
111 Contents of addresses are obtained by indirection.
112 Local variables are qualified by
113 function name, for example
114 .BR main:argv .
115 When program symbols conflict with
116 .I acid
117 words, distinguishing
118 .B $
119 signs are prefixed.
120 Such renamings are reported at startup; option
121 .B -q
122 suppresses them.
123 .PP
124 Variable types
125 .RI ( "integer, float, list, string" )
126 and formats are inferred from assignments.
127 Truth values false/true are attributed to zero/nonzero
128 integers or floats and to empty/nonempty lists or strings.
129 Lists are sequences of expressions surrounded by
130 .BR {\^}
131 and separated by commas.
132 .PP
133 Expressions are much as in C,
134 but yield both a value and a format.
135 Casts to complex types are allowed.
136 Lists admit the following operators, with
137 subscripts counted from 0.
138 .IP
139 .BI head " list
140 .br
141 .BI tail " list
142 .br
143 .BI append " list", " element
144 .br
145 .BI delete " list", " subscript
146 .PP
147 Format codes are the same as in
148 .MR db (1) .
149 Formats may be attached to (unary) expressions with
150 .BR \e ,
151 e.g.
152 .BR (32*7)\eD .
153 There are two indirection operators,
154 .B *
155 to address a core image,
156 .B @
157 to address a text file.
158 The type and format of the result are determined by the format of the operand,
159 whose type must be integer.
160 .PP
161 Statements are
162 .IP
163 .BI if " expr " then " statement " "\fR[ \fPelse\fI statement \fR]
164 .br
165 .BI while " expr " do " statement
166 .br
167 .BI loop " expr" , " expr " do " statement
168 .br
169 .BI defn " name" ( args ") {" " statement \fP}
170 .br
171 .BI defn " name"
172 .br
173 .IB name ( args )
174 .br
175 .BI builtin " name" ( args )
176 .br
177 .BI local " name
178 .br
179 .BI return " expr
180 .br
181 .BR whatis " [ \fI name \fP]
182 .PP
183 The statement
184 .B defn
185 .I name
186 clears the definition for
187 .IR name .
189 .B defn
190 may override a built-in function;
191 prefixing a function call with
192 .B builtin
193 ignores any overriding
194 .BR defn ,
195 forcing the use of the built-in function.
196 .PP
197 Here is a partial list of functions; see the manual for a complete list.
198 .TF asm(address)
199 .TP
200 .B stk()
201 Print a stack trace for current process.
202 .TP
203 .B lstk()
204 Print a stack trace with values of local variables.
205 .TP
206 .B gpr()
207 Print general registers.
208 Registers can also be accessed by name, for example
209 .BR *R0 .
210 .TP
211 .B spr()
212 Print special registers such as program counter and stack pointer.
213 .TP
214 .B fpr()
215 Print floating-point registers.
216 .TP
217 .B regs()
218 Same as
219 .BR spr();gpr() .
220 .TP
221 .BI fmt( expr , format )
222 Expression
223 .I expr
224 with format given by the character value of expression
225 .IR format .
226 .TP
227 .BI src( address )
228 Print 10 lines of source around the program address.
229 .TP
230 .BI Bsrc( address )
231 Get the source line for the program address
232 into a window of a running
233 .MR sam (1)
234 and select it.
235 .TP
236 .BI line( address )
237 Print source line nearest to the program address.
238 .TP
239 .B source()
240 List current source directories.
241 .TP
242 .BI addsrcdir( string )
243 Add a source directory to the list.
244 .TP
245 .BI filepc( where )
246 Convert a string of the form
247 .IB sourcefile : linenumber
248 to a machine address.
249 .TP
250 .BI pcfile( address )
251 Convert a machine address to a source file name.
252 .TP
253 .BI pcline( address )
254 Convert a machine address to a source line number.
255 .TP
256 .BI bptab()
257 List breakpoints set in the current process.
258 .TP
259 .BI bpset( address )
260 Set a breakpoint in the current process at the given address.
261 (Doesn't work on Unix yet.)
262 .TP
263 .BI bpdel( address )
264 Delete a breakpoint from the current process.
265 .TP
266 .B cont()
267 Continue execution of current process and wait for it to stop.
268 .TP
269 .B step()
270 Execute a single machine instruction in the current process.
271 (Doesn't work on Unix yet.)
272 .TP
273 .B func()
274 Step repeatedly until after a function return.
275 .TP
276 .BI stopped( pid )
277 This replaceable function is called automatically when the given process
278 stops.
279 It normally prints the program counter and returns to the prompt.
280 .TP
281 .BI asm( address )
282 Disassemble 30 machine instructions beginning at the given address.
283 .TP
284 .BI mem( address , string )
285 Print a block of memory
286 interpreted according to a string of format codes.
287 .TP
288 .BI dump( address , n , string\fP)
289 Like
290 .BR mem (),
291 repeated for
292 .I n
293 consecutive blocks.
294 .TP
295 .BI print( expr , ... )
296 Print the values of the expressions.
297 .TP
298 .BI newproc( arguments )
299 Start a new process with arguments given as a string
300 and halt at the first instruction.
301 .TP
302 .B new()
303 Like
304 .IR newproc (),
305 but take arguments (except
306 .BR argv[0] )
307 from string variable
308 .BR progargs .
309 .TP
310 .B win()
311 Like
312 .IR new (),
313 but run the process in a separate window.
314 .TP
315 .BI start( pid )
316 Start a stopped process.
317 .TP
318 .BI kill( pid )
319 Kill the given process.
320 .TP
321 .BI setproc( pid )
322 Make the given process current.
323 .TP
324 .BI rc( string )
325 Escape to the shell,
326 .MR rc (1) ,
327 to execute the command string.
328 .TP
329 .BI include( string )
330 Read acid commands from the named file.
331 .TP
332 .BI includepipe( string )
333 Run the command string, reading its standard output as acid commands.
334 .PD 0
335 .SS "Shared library segments
336 When a pid or core file is specified on the command line,
337 .I acid
338 will, as part of its startup, determine the set of shared libraries
339 in use by the process image and map those at appropriate locations.
340 If
341 .I acid
342 is started without a pid or core file
343 and is subsequently attached to a process via
344 .BR setproc ,
345 the shared library maps can be initialized by calling
346 .BR dynamicmap() .
347 .SS "Type information
348 Unix compilers conventionally include detailed type information
349 in the debugging symbol section of binaries.
350 The external program
351 .B acidtypes
352 extracts this information and formats it as
353 .I acid
354 program text.
355 Once the shared libraries have been mapped, the default
356 .I acid
357 startup invokes
358 .B acidtypes
359 (via
360 .BR includepipe )
361 on the set of currently mapped text files.
362 The function
363 .B acidtypes()
364 can be called to rerun the command after changing
365 the set of mapped text files.
366 .SS "Acid Libraries
367 There are a number of
368 .I acid
369 `libraries' that provide higher-level debugging facilities. One notable
370 example is
371 .IR trump ,
372 which uses
373 .I acid
374 to trace memory allocation.
375 .I Trump
376 requires starting
377 .I acid
378 on the program, either by attaching to a running process or by
379 executing
380 .B new()
381 on a binary (perhaps after setting
382 .BR progargs ),
383 stopping the process, and then running
384 .B trump()
385 to execute the program under the scaffolding.
386 The output will be a trace of the memory allocation and free calls
387 executed by the program.
388 When finished tracing, stop the process and execute
389 .B untrump()
390 followed by
391 .B cont()
392 to resume execution.
393 .SH EXAMPLES
394 Start to debug
395 .BR /bin/ls ;
396 set some breakpoints; run up to the first one
397 (this example doesn't work on Unix yet):
398 .IP
399 .EX
400 % acid /bin/ls
401 /bin/ls: mips plan 9 executable
402 /sys/lib/acid/port
403 /sys/lib/acid/mips
404 acid: new()
405 70094: system call _main ADD $-0x14,R29
406 70094: breakpoint main+0x4 MOVW R31,0x0(R29)
407 acid: pid
408 70094
409 acid: argv0 = **main:argv\es
410 acid: whatis argv0
411 integer variable format s
412 acid: *argv0
413 /bin/ls
414 acid: bpset(ls)
415 acid: cont()
416 70094: breakpoint ls ADD $-0x16c8,R29
417 acid:
418 .EE
419 .PP
420 Display elements of a linked list of structures:
421 .IP
422 .EX
423 complex Str { 'D' 0 val; 'X' 4 next; };
424 s = *headstr;
425 while s != 0 do{
426 complex Str s;
427 print(s.val, "\en");
428 s = s.next;
430 .EE
431 .PP
432 Note the use of the
433 .B .
434 operator instead of
435 .BR -> .
436 .PP
437 Display an array of bytes declared in C as
438 .BR "char array[]" .
439 .IP
440 .EX
441 *(array\es)
442 .EE
443 .PP
444 This example gives
445 .B array
446 string format, then prints the string beginning at the address (in
447 .I acid
448 notation)
449 .BR *array .
450 .PP
451 Trace the system calls executed by
452 .MR ls (1)
453 (neither does this one):
454 .IP
455 .EX
456 % acid -l truss /bin/ls
457 /bin/ls:386 plan 9 executable
459 /sys/lib/acid/port
460 /sys/lib/acid/kernel
461 /sys/lib/acid/truss
462 /sys/lib/acid/386
463 acid: progargs = "-l lib/profile"
464 acid: new()
465 acid: truss()
466 open("#c/pid", 0)
467 return value: 3
468 pread(3, 0x7fffeeac, 20, -1)
469 return value: 12
470 data: " 166 "
471 \&...
472 stat("lib/profile", 0x0000f8cc, 113)
473 return value: 65
474 open("/env/timezone", 0)
475 return value: 3
476 pread(3, 0x7fffd7c4, 1680, -1)
477 return value: 1518
478 data: "EST -18000 EDT -14400
479 9943200 25664400 41392800 57718800 73447200 89168400
480 104896800 ..."
481 close(3)
482 return value: 0
483 pwrite(1, "--rw-rw-r-- M 9 rob rob 2519 Mar 22 10:29 lib/profile
484 ", 54, -1)
485 --rw-rw-r-- M 9 rob rob 2519 Mar 22 10:29 lib/profile
486 return value: 54
487 \&...
488 166: breakpoint _exits+0x5 INTB $0x40
489 acid: cont()
490 .EE
491 .SH FILES
492 .B \*9/acid/$objtype
493 .br
494 .B \*9/acid/port
495 .br
496 .B \*9/acid/kernel
497 .br
498 .B \*9/acid/trump
499 .br
500 .B \*9/acid/truss
501 .br
502 .B $HOME/lib/acid
503 .SH SOURCE
504 .B \*9/src/cmd/acid
505 .SH "SEE ALSO"
506 .MR mk (1) ,
507 .MR db (1)
508 .br
509 Phil Winterbottom,
510 ``Acid Manual''.
511 .SH DIAGNOSTICS
512 At termination, kill commands are proposed
513 for processes that are still active.
514 .SH BUGS
515 There is no way to redirect the standard input and standard output
516 of a new process.
517 .PP
518 Source line selection near the beginning of a file may pick
519 an adjacent file.
520 .PP
521 With the extant stepping commands, one cannot step through instructions
522 outside the text segment and it is hard to debug across process forks.
523 .PP
524 Breakpoints do not work yet.
525 Therefore, commands such as
526 .BR step ,
527 .BR new ,
528 and
529 .B truss
530 do not work either.
531 .B New
532 in particular will need some help to cope with dynamic libraries.