|
|
1.1 root 1: .TH DMDPI 1 "630 MTG"
2: .SH NAME
3: dmdpi \- 630 MTG process inspector and debugger
4: .SH SYNOPSIS
5: .B dmdpi [ -c ]
6: .SH DESCRIPTION
7: .I Dmdpi
8: is a C language debugger that is bound dynamically to multiple subject
9: processes executing in a 630 MTG window in the layers environment.
10: In order to use dmdpi to its full capabilities, it is necessary to compile
11: the source program with the
12: .I -g
13: option of
14: .IR dmdcc .
15: However, if the target program is not compiled with
16: .I -g,
17: or no symbol tables
18: at all are available, dmdpi works as well as possible with the information
19: provided to it.
20: .PP
21: If the -c option is selected, \f2dmdpi\f1 will be
22: cached in the 630 MTG cache system. This will enable
23: \f2dmdpi\f1 to be executed again without the need for another
24: download.
25: .PP
26: Dmdpi uses a
27: multi-window user interface.
28: There are three types of windows:
29: debugger control windows,
30: which access the global state of the debugger;
31: process control windows (exactly one per process),
32: which start and stop processes and connect to process-specific functions;
33: and process inspection windows,
34: which include viewers for source text and memory, formatted various ways.
35: Initially, there are three debugger control
36: windows available: \fBdmdpi\fR, \fBhelp\fR
37: and \fBpwd/cd\fR.
38: .P
39: One might need to debug some initialization code that would ordinarily be
40: executed before dmdpi has a chance to gain control of the process.
41: The \fI-z\fR
42: of \fIdmdld\fR is useful for this purpose. This allows you to take
43: control of a process before the first statement is executed.
44: See the \fIdmdld(1)\fR manual page for details on using this option.
45:
46: .SS User Interface
47: Button 1 points.
48: Pointing at a window makes it current, noted with a highlighted border;
49: pointing at a line of text makes it current and inverts its video.
50: A scroll bar at the left of each window shows how
51: much of the text of a window is visible;
52: pointing into the scroll region and moving the mouse
53: controls what text is displayed.
54: .PP
55: Button 2 has a menu of operations that apply to the current line.
56: Operations above the
57: .B ~~~~~
58: separator are specific to each line;
59: operations below the separator are generic line operations:
60: .TP 1i
61: .B cut
62: Remove the line.
63: .TP
64: .B sever
65: Remove the line and all lines above it.
66: .TP
67: .B fold
68: Wrap the line, if it extends past the right margin.
69: .TP
70: .B truncate
71: Truncate the line at the right margin.
72: .LP
73: Button 3 has a menu of window-level operations and is in two parts.
74: Operations above the separator are specific to each window.
75: Operations below the separator are the following generic window operations:
76: .TP 1i
77: .B reshape
78: Change the size of a window.
79: .TP
80: .B move
81: Move a window to a different place.
82: .TP
83: .B close
84: Delete a window.
85: .TP
86: .B fold
87: Like button 2 fold above except it applies to all lines in the window.
88: .TP
89: .B truncate
90: Like button 2 truncate above except it applies to all lines in the window.
91: .TP
92: .B top
93: The sub-menu off the \fBtop\fR
94: is a list of windows;
95: selecting one makes it top and current.
96: .LP
97: Button 3 also is also used to sweep out new windows.
98: .PP
99: Keyboard characters accumulate at the bottom of the window.
100: If the current line accepts input, it flashes with each keystroke;
101: otherwise, if the current window accepts input, its border flashes.
102: Carriage return is ignored until a line or window
103: accepts the text, whereupon
104: the input line is sent to the line or window.
105: .PP
106: The following keyboard commands are also available:
107: .TP
108: .B "\'>file\'"
109: This saves the contents of the current line, or current window if there is
110: no current line, into the named file. To achieve the status of no current line
111: in the window, scroll off the top or bottom of the window.
112: .TP
113: .B "\'<file\'"
114: Each line of the named file is sent to the line or window as though it had
115: come from the keyboard.
116: .TP
117: .B ?
118: Each line or window that accepts keyboard input produces
119: some help in response to
120: .BR ? .
121: These messages specify the format of what may be typed.
122: Items in brackets ([]) are optional parameters in the keyboard input expression.
123: Explanations are contained within braces ({}).
124:
125: .PP
126: Special cursor icons occasionally appear:
127: .TP
128: .B arrow-dot-dot-dot
129: The host is completing an operation; the terminal is ready
130: asynchronously.
131: .TP
132: .B coffee cup
133: The terminal is receiving input from the host; the terminal momentarily is blocked.
134: .TP
135: .B exclamation mark
136: Confirm a dangerous menu selection by pressing that menu's button again.
137:
138: .SS Debugger Control Windows
139: .TP
140: .B Dmdpi Window
141: The most important debugger control window is the dmdpi window, which is
142: the first window created after the debugger downloads.
143: Each line within the dmdpi window refers to a specific process running
144: in the terminal.
145: A process is identified by its 630 MTG process table address.
146: Along with each process is a path to
147: its host resident download module (argv[0]).
148: This pathname is used by dmdpi to find the symbol table and debugger
149: information for the process.
150: .RS
151: .P
152: Lines may be introduced to the dmdpi window by running
153: .I list processes
154: from the button 3 menu or by typing a process table address and symbol
155: table path from the keyboard.
156: Typing the information at the keyboard may be useful if one wishes to
157: change the pathname of where the process symbol table might be found.
158: .P
159: Lines are also introduced into the dmdpi window when opening
160: or closing a process control window for a process which is
161: currently not listed in the dmdpi window.
162: .P
163: Note that the list of processes in the dmdpi window is not
164: dynamically updated as new processes are created or deleted,
165: or when application programs exit. This can lead to invalid
166: processes being listed in the dmdpi window until list
167: processes is again chosen from the button 3 menu.
168: .RE
169:
170: .TP
171: .B Pwd/cd Window
172: The pwd/cd window controls
173: the working directory of the debugger.
174: The initial working directory is the directory in which dmdpi is executed.
175: The working directory can be changed either by typing a path from the keyboard
176: or by selecting directory listings in button 2 and button 3 menus.
177:
178:
179: .TP
180: .B Help Window
181: The help window contains a reminder of user interface mechanics.
182:
183: .SS Process Control Windows
184: A process control window is created from the dmdpi window in
185: one of two ways.
186: .I Open process
187: on the button 2 menu opens the process currently highlighted in the dmdpi
188: window.
189: .I Pick process
190: on the button 3 menu causes the mouse cursor to change to a target cursor
191: which can be used to point to a window containing a process to debug.
192: .PP
193: The paths to symbol tables shown in the dmdpi window is not a full path
194: name if the location of the host resident download module for the program
195: being debugged is specified to \fIdmdld\fR as a relative path name. If
196: this is the case, the debugger is not able to find symbol tables
197: unless the working directory of the debugger is the same as the
198: directory in which the application was downloaded. If symbol tables cannot be
199: found, close the process window, change the working directory of the
200: debugger from the pwd/cd window, and then reopen the process window.
201: .PP
202: A process control window indicates the process's state
203: and shows the call stack traceback if the process is halted or dead.
204: The call stack is the dynamic chain of activation records.
205: The process control window also
206: connects to process inspection windows that access source text,
207: local variables within a stack frame,
208: raw memory, and so on.
209: These windows are cross-connected; so, for example,
210: an instruction in a process's assembly language window can
211: be inspected as a hexadecimal opcode in the raw memory window.
212: Closing the process control window closes all the process inspection
213: windows associated with it.
214: .PP
215: States are:
216: .TP 1.5i
217: .PD 0
218: .SM
219: .B RUNNING
220: running normally
221: .TP
222: .SM
223: .B STOPPED
224: stopped asynchronously by the debugger
225: .TP
226: .SM
227: .B BREAKPOINT
228: halted on reaching breakpoint
229: .TP
230: .SM
231: .B STMT STEPPED
232: halted after executing C source statement(s)
233: .TP
234: .SM
235: .B INSTR STEPPED
236: halted after executing machine instruction(s)
237: .TP
238: .SM
239: .B PROCEESS EXCEPTION
240: a process exception has occurred
241: .TP
242: .SM
243: .B ERROR STATE
244: the process has probably exited.
245: .PD
246: .LP
247: When in the \fBRUNNING\fR state, the status of selected bits of the P->state
248: variable is displayed and updated.
249: .PP
250: The menu operations on the process are:
251: .TP 1i
252: .PD 0
253: .B run
254: let the process run
255: .TP
256: .B stop
257: stop the process
258: .TP
259: .B src text
260: open source text window(s)
261: .TP
262: .B Globals
263: open window for evaluating expressions in global scope
264: .TP
265: .B RawMemory
266: open window for editing uninterpreted memory
267: .TP
268: .B Assembler
269: open window for disassembler
270: .TP
271: .B User Types
272: open window for setting user types
273: .TP
274: .B Journal
275: open debugging session journal window
276: .TP
277: .B Bpt List
278: open breakpoint list window
279: .PD
280: .LP
281: Each line of the call stack traceback describes one function.
282: Each function in the traceback can open a stack frame
283: expression evaluator window
284: or display its current source line.
285:
286: .SS Process Inspection Windows
287: .TP
288: .B Source Text Windows
289: The source text window contains a listing of a source file. If there is more
290: than one source file for the process, selecting the
291: .B src text
292: item in the process control window will give you a source files window
293: in which there is a listing of all the source files associated with that
294: process. Library function source files are included in this list, even
295: though one might not actually have the source for these functions.
296: By highlighting a source line and selecting
297: .B open source file
298: in the button 2 menu, you can open a source listing for that file.
299: Each source file is in a separate window, which can be opened when needed.
300: The source files are searched for in the working directory.
301: Entering a pathname from the keyboard (when the Source files window is
302: current) enters a pathname prefix which points to a directory
303: where the source can be found, without changing the working directory.
304: .RS
305: .P
306: When opening a source file,
307: dmdpi
308: checks to see whether the source file is in time sync with the object module.
309: If not, dmdpi gives a message of this fact. One may override this
310: condition with the
311: .B reopen
312: item in the button 3 menu of the source text window.
313: Source lines are displayed on a "per request basis." In other words, only
314: the lines that are currently visible are sent from the host. More lines
315: are sent to be displayed on the terminal as needed.
316: .P
317: Specific strings may be searched for in the source text by
318: using \fI/string\fR, or the \fI?string\fR entered at the
319: keyboard, for searching forward and backward in the source
320: text respectively. The search will begin at the next (previous
321: for backwards search) C language statement rather than at the
322: next source line. Note that repeated reverse searches for the
323: same pattern must be specified as \fI??\fR rather than \fI?\fR
324: due to a conflict with the help operator (?).
325: Line numbers can also be searched
326: for by entering a line number at the keyboard when a line is not current
327: within the window. If a line is current, the number is evaluated as
328: a constant expression (see expressions below). To achieve the
329: status of no current line, scroll the current line off the top or bottom of
330: the window.
331: .P
332: .B Breakpoints
333: are set on source lines. A breakpoint is set by highlighting
334: the line on which you wish to break execution and selecting
335: .B set bpt
336: from the button 2 menu.
337: A breakpoint is denoted by a '>>>' next to the source line.
338: When the process reaches this line the process
339: halts and will not execute the line on which the breakpoint is set.
340: Clearing the breakpoint is done by highlighting the line on which a breakpoint
341: is set and selecting
342: .B clear bpt
343: from the button 2 menu. Clearing the breakpoint can also be done from the
344: breakpoint list
345: window (see below). A
346: .B conditional breakpoint
347: is a breakpoint that is set with a certain condition. When this condition
348: evaluates to TRUE, the process is halted.
349: Any valid dmdpi expression may be used as a condition
350: (see keyboard expressions).
351: To set a conditional breakpoint, select
352: .B cond bpt
353: from the button 2 menu. You are prompted to enter an expression
354: from the keyboard as a condition.
355: An example of a condition would be (x==1). When the variable x becomes
356: equal to 1, then execution breaks. The
357: .B trace on
358: item in the button 2 menu is actually a conditional breakpoint with
359: the condition of 0, meaning that the condition never evaluates to TRUE.
360: This has the effect of tracing a statement but never breaking execution.
361: The conditional breakpoint is removed in the same way a
362: regular breakpoint is removed.
363: .P
364: Once the process has been halted, select \f3run\f1 to start the process running again.
365: You can also
366: .B step
367: (execute) a number of source lines and then stop
368: again after these statements have been executed.
369: When statements are stepped, the debugger will not enter functions
370: unless the
371: .B step into fcn
372: item is actually specified. The current statement can always
373: be seen by selecting
374: the
375: .B current stmt
376: item in the button 3 menu. This highlights the statement currently in the PC.
377: .P
378: Another option that is available in the source text window is the ability
379: to look at the assembly code for a specified line. Highlighting a line and
380: selecting
381: .B assembler
382: in the button 2 menu displays the first assembler instruction of the
383: statement.
384: .RE
385:
386: .TP
387: .B Globals and Stack Frame Windows
388: A stack frame window is opened from a line in the call stack traceback
389: in the process control window or
390: from a line of source text. A globals window is opened from the button 3 menu
391: in the process control window.
392: These windows evaluate expressions with respect to global scope,
393: and scope in a function, respectively.
394: .RS
395: .P
396: .B "Expressions"
397: .P
398: Expressions may be entered from the keyboard or with the mouse.
399: The syntax for expressions in dmdpi is the same as C language expressions,
400: except for differences noted below.
401: The expressions are most commonly used for inspecting values of variables in
402: the program that is being debugged.
403: An example of an expression is
404: .I r.origin.x.
405: This
406: may be typed in order
407: to inspect the x coordinate value of a rectangle origin point if the process
408: has a rectangle
409: .I r.
410: .P
411: A summary of dmdpi's expression syntax is presented here only to
412: aid comprehension, rather than an exact statement of the language.
413: .RE
414: .sp
415: .RS
416: \fI
417: expression :
418: constant
419: primary
420: \(**expression
421: &expression
422: -expression
423: !expression
424: ~expression
425: sizeof expression
426: typeof expression
427: fabs (expression)
428: (type-name) expression /\(** from menu only \(**/
429: {expression} identifier
430: expression binop expression
431: expression = expression
432: expression , expression
433:
434:
435: primary:
436: $
437: identifier
438: ( expression )
439: primary ( [expression-list] )
440: primary[ expression ]
441: lvalue.identifier
442: primary -> identifier
443:
444: lvalue:
445: identifier
446: primary[expression]
447: lvalue.identifier
448: primary -> identifier
449: \(**expression
450: (lvalue)
451:
452: binop:
453: \(** / % + - >> << < > <= >= == != & ^
454: | && ||
455: \fR
456: .P
457: The major differences in the expressions which dmdpi understands and
458: the C expressions are:
459: .IP ""
460: The unary operators \fIfabs\fR and \fItypeof\fR are supported.
461: .I fabs
462: evaluates the absolute value of a floating point number.
463: .I typeof
464: evaluates the type of an expression.
465: Examples are:
466: .br
467: fabs(-2.0)=2
468: .br
469: typeof(r.origin)= struct Point
470: .IP ""
471: The concept of a "current expression" has been introduced with the
472: .B $
473: operator.
474: .B $
475: is equal to the current highlighted expression. For example, if the line
476: containing \fIr.origin\fR is highlighted, one may type
477: .B $.x
478: to see the value of the x coordinate.
479: Another example of the
480: .B $
481: expression is
482: .B $=<expression>.
483: This can be used, for instance if
484: .B $
485: is equal to a variable x and you wish
486: to change the value of x to <expression>.
487: .IP ""
488: Expressions are evaluated within the scope boundaries of the window in
489: which they are typed. One can cross scope boundaries in order to evaluate
490: an expression with the syntax { expression } function-name.
491: This, for example, is useful for using the globals window to look
492: at static variables that are local
493: to a function
494: without having to open up a stack frame window.
495: .IP ""
496: Type casting may only be done through the use of the menu.
497: .IP ""
498: The following is not supported by dmdpi: ++ -- ?: op= string.
499: .IP ""
500: NOTE: expressions are always evaluated internally with a 32-bit precision.
501: Therefore,
502: results may not correspond in all cases with those generated by a C
503: program.
504: .P
505: Expressions are also used to specify the condition in the conditional
506: breakpoint. Note that the C comma operator is very useful in specifying
507: the condition.
508: Expressions separated by a comma are evaluated left-to-right and all but
509: the rightmost expression are discarded.
510: For example, a condition of \fI(x,y,x==y)\fR evaluates all
511: three expressions; however, only the last expression (x==y) determines
512: the result of the overall condition. The result is that the values of
513: x and y are printed but execution halts only when x==y.
514: .P
515: Registers in the stack frame windows are prefixed with the character
516: .B $
517: , for example,
518: .B $d0.
519: The address of a register is the location at which it was saved.
520: Register values are only available after execution has been halted
521: at a breakpoint or after a step. The exception to this rule is that
522: one may look at register variables in calling functions if they happened
523: to be saved in the called function.
524: .P
525: An expression may be made
526: .I spy,
527: in order to observe changes in the expression.
528: The value of a spy expression is evaluated and displayed
529: each time the debugger looks at the process, i.e., when the process calls
530: wait() or sleep().
531: If the value of a spy changes, the expression is updated and a message is
532: given that the expression has changed.
533: If a conditional breakpoint (or trace on) is set, then the process will be
534: halted.
535: The option
536: .B changed spies
537: in the button 2 menu will manually force all spies to be re-evaluated.
538: .P
539: A maximum of 150 global variables will fit into the globals menu. If
540: the targeted program has more than 150 global variables, the remaining
541: variables must be accessed by typing their name from the keyboard.
542: .RE
543: .SK
544: .TP
545: .B Raw Memory Window
546: The raw memory window is
547: a ``memory editor'' in which
548: memory is viewed as a sequence of 1-, 2-, 4- or 8-byte cells.
549: The
550: .B '.'
551: operator is a special symbol which denotes a cell address. Therefore, commands
552: such as
553: .B .+1
554: in the button 2 menu give the next increment of memory after the current
555: cell address. The keyboard command
556: .B .=<expression>
557: displays the cell with address equal to expression.
558: The expression syntax is the same as defined above.
559: The format of the displayed
560: memory cells is
561: .I x/y: <contents>,
562: where x is the cell address, and y is the viewing increment.
563: .RS
564: Some of the functions available are:
565: .RS
566: .TP
567: change cell size and display format
568: Use the \fBsize\fR and \fBformat\fR items in the menu.
569: .TP
570: display cells above and below current cell.
571: Use the \fB.[+-]<amount>\fR options in the menu.
572: .TP
573: indirect to cell
574: Look at the cell using the contents of the current cell as an address.
575: Use the
576: .B \(** thru .
577: option.
578: .TP
579: change cell value
580: This is done with the keyboard expression:
581: .B $=<expression>
582: .TP
583: spy on memory cell
584: If the memory contents change, dmdpi will give notification.
585: .TP
586: disassemble instruction at cell.
587: Display the assembler instruction in the assembler window. Use the
588: .B asmblr
589: option in the button 2 menu.
590: .RE
591: .RE
592: .TP
593: .B (Dis)Assembler Window
594: Allows viewing of memory as a sequence of assembler instructions.
595: The menu options of this window are similar to those in the source text
596: window. The difference is that this window deals with assembler instructions
597: rather than the high-level source code.
598: .RS
599: .P
600: An instruction at a certain address can be displayed by entering the
601: keyboard expression
602: .B .=<expression>.
603: The expression syntax is the same as defined above.
604: More instructions can be viewed in a sequential manner using the
605: .B next
606: options in the button 2 menu. The next 1, 5, or 10 instructions
607: starting from the current instruction can be displayed.
608: .P
609: When setting a breakpoint or stepping into an assembler function, one must
610: step through the link and the movm.l instructions before \fIdmdpi\fR will be
611: able to generate the stack frame for the function.
612: .P
613: Some of the other functions available are:
614: .RS
615: .TP
616: change display format
617: .TP
618: open a stack frame window for instruction's function
619: .TP
620: display instruction as cells in the raw memory window
621: .TP
622: set/clear breakpoint on instruction
623: .TP
624: open stack frame window for instruction's function
625: .TP
626: display instruction at current PC
627: .TP
628: single step instruction(s)
629: .RE
630: .RE
631: .TP
632: .B User Types Window
633: Shows user-defined types and allows the display format of user-defined
634: types displayed in the globals and stack frame windows to be changed.
635: For example, the display format of a structure may be changed so that
636: certain fields are not displayed (hidden) and other fields are displayed
637: (shown).
638: .TP
639: .B Journal Window
640: Keeps a log of significant events in the course of a debugging session.
641: .TP
642: .B Breakpoint List Window
643: Lists all active source and assembler breakpoints.
644: Allows clearing of specified breakpoints or all breakpoints.
645: .RS
646: .P
647: Functions available include:
648: .RS
649: .TP
650: show source or assembler line at which a breakpoint is set
651: .TP
652: clear a single breakpoint
653: .TP
654: clear all breakpoints
655: .SH SEE ALSO
656: .PP
657: dmdcc(1),
658: dmdld(1),
659: ucache(1).
660: .SH WARNINGS
661: Do not use the -O optimizer option of dmdcc when compiling a program
662: to be debugged with dmdpi.
663: This will confuse dmdpi.
664: .P
665: It is possible to receive a message that there is no more memory on the
666: host system. This will happen if the process you are debugging has a very
667: large symbol table, or if you are debugging many processes at the same time.
668: The maximum amount of memory that a UNIX process is allowed to consume
669: can be changed by a system administrator. For a 3B2 host computer running
670: System V Release 2.0, how to change the per process memory limit is
671: documented in the manual \f2AT&T 3B2 Computer Unix System V Release 2.0
672: System Administration Utilities Guide\f1 in the chapter
673: "Administrative Tasks" under "Tunable Parameters." An alternative to
674: changing the host computer's per process memory limit is to use
675: the \fImc68cprs\fR CCS utility to compress the size of process symbol tables
676: before they are opened for debugging with dmdpi.
677: .SH BUGS
678: In switch statements there is no boundary between the last case
679: and the branch code; the program
680: .I appears
681: to jump to the last case (but is really in the branch)
682: and then to the real case.
683: .P
684: The structure P which is of type "struct Proc \(**" within applications is
685: interpreted by \fIdmdpi\fR as "struct proc". This implies that one must
686: type P.state rather than P->state when accessing the structure P from the
687: keyboard.
688: .P
689: If a program contains multiple global structure declarations
690: of the same name, dmdpi will ignore all but the first declaration.
691: .P
692: A breakpoint cannot be set on a goto or return statement.
693: Attempting to do so will set a breakpoint on the following
694: line. Also, stepping onto a goto or return statement will
695: execute the goto or return instead of stopping on the line.
696: .P
697: When stepping past an if statement that is the
698: last statement within a while loop and the if condition fails
699: and does not have an else condition,
700: the program will appear to jump to the last line within the if
701: statement. It is really jumping to the statement that will
702: branch back to the top of the while loop.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.