user.r
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:25k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. ."           @(#)user.r      1.13 10/29/86
  2. ."
  3. ."           DBUG (Macro Debugger Package) nroff source
  4. ."
  5. ."           nroff -mm user.r >user.t
  6. ."
  7. ." ===================================================
  8. ."
  9. ."           === Some sort of black magic, but I forget...
  10. .tr ~
  11. ."           === Hyphenation control (1 = on)
  12. .".nr Hy 1
  13. ."           === Force all first level headings to start on new page
  14. .nr Ej 1
  15. ."           === Set for breaks after headings for levels 1-3
  16. .nr Hb 3
  17. ."           === Set for space after headings for levels 1-3
  18. .nr Hs 3
  19. ."           === Set standard indent for one/half inch
  20. .nr Si 10
  21. ."           === Set page header
  22. .PH "/DBUG User Manual//*(DT/"
  23. ."           === Set page footer
  24. .PF "// - % - //"
  25. ."           === Set page offset
  26. .".po 0.60i
  27. ."           === Set line length
  28. .".ll 6.5i
  29. .TL
  30. D B U G
  31. .P 0
  32. C Program Debugging Package
  33. .P 0
  34. by
  35. .AU "Fred Fish"
  36. .AF ""
  37. .SA 1
  38. ."           === All paragraphs indented.
  39. .nr Pt 1
  40. .AS 1
  41. This document introduces
  42. .I dbug ,
  43. a macro based C debugging
  44. package which has proven to be a very flexible and useful tool
  45. for debugging, testing, and porting C programs.
  46. .P
  47. All of the features of the
  48. .I dbug
  49. package can be enabled or disabled dynamically at execution time.
  50. This means that production programs will run normally when
  51. debugging is not enabled, and eliminates the need to maintain two
  52. separate versions of a program.
  53. .P
  54. Many of the things easily accomplished with conventional debugging
  55. tools, such as symbolic debuggers, are difficult or impossible with this
  56. package, and vice versa.
  57. Thus the
  58. .I dbug
  59. package should 
  60. .I not
  61. be thought of as a replacement or substitute for
  62. other debugging tools, but simply as a useful
  63. .I addition
  64. to the
  65. program development and maintenance environment.
  66. .AE
  67. .MT 4
  68. .SK
  69. .B
  70. INTRODUCTION
  71. .R
  72. .P
  73. Almost every program development environment worthy of the name
  74. provides some sort of debugging facility.
  75. Usually this takes the form of a program which is capable of
  76. controlling execution of other programs and examining the internal
  77. state of other executing programs.
  78. These types of programs will be referred to as external debuggers
  79. since the debugger is not part of the executing program.
  80. Examples of this type of debugger include the
  81. .B adb
  82. and
  83. .B sdb
  84. debuggers provided with the 
  85. .B UNIX*F
  86. .FS
  87. UNIX is a trademark of AT&T Bell Laboratories.
  88. .FE
  89. operating system.
  90. .P
  91. One of the problems associated with developing programs in an environment
  92. with good external debuggers is that developed programs tend to have 
  93. little or no internal instrumentation.
  94. This is usually not a problem for the developer since he is,
  95. or at least should be, intimately familiar with the internal organization,
  96. data structures, and control flow of the program being debugged.
  97. It is a serious problem for maintenance programmers, who
  98. are unlikely to have such familiarity with the program being
  99. maintained, modified, or ported to another environment.
  100. It is also a problem, even for the developer, when the program is
  101. moved to an environment with a primitive or unfamiliar debugger,
  102. or even no debugger.
  103. .P
  104. On the other hand,
  105. .I dbug
  106. is an example of an internal debugger.
  107. Because it requires internal instrumentation of a program,
  108. and its usage does not depend on any special capabilities of
  109. the execution environment, it is always available and will
  110. execute in any environment that the program itself will
  111. execute in.
  112. In addition, since it is a complete package with a specific
  113. user interface, all programs which use it will be provided
  114. with similar debugging capabilities.
  115. This is in sharp contrast to other forms of internal instrumentation
  116. where each developer has their own, usually less capable, form
  117. of internal debugger.
  118. In summary,
  119. because 
  120. .I dbug
  121. is an internal debugger it provides consistency across operating
  122. environments, 
  123. and because it is available to all developers it provides
  124. consistency across all programs in the same environment.
  125. .P
  126. The
  127. .I dbug
  128. package imposes only a slight speed penalty on executing
  129. programs, typically much less than 10 percent, and a modest size
  130. penalty, typically 10 to 20 percent.
  131. By defining a specific C preprocessor symbol both of these
  132. can be reduced to zero with no changes required to the
  133. source code.
  134. .P
  135. The following list is a quick summary of the capabilities
  136. of the
  137. .I dbug
  138. package.
  139. Each capability can be individually enabled or disabled
  140. at the time a program is invoked by specifying the appropriate
  141. command line arguments.
  142. .SP 1
  143. .ML o 1i
  144. .LI
  145. Execution trace showing function level control flow in a
  146. semi-graphically manner using indentation to indicate nesting
  147. depth.
  148. .LI
  149. Output the values of all, or any subset of, key internal variables.
  150. .LI
  151. Limit actions to a specific set of named functions.
  152. .LI
  153. Limit function trace to a specified nesting depth.
  154. .LI
  155. Label each output line with source file name and line number.
  156. .LI
  157. Label each output line with name of current process.
  158. .LI
  159. Push or pop internal debugging state to allow execution with
  160. built in debugging defaults.
  161. .LI
  162. Redirect the debug output stream to standard output (stdout)
  163. or a named file.
  164. The default output stream is standard error (stderr).
  165. The redirection mechanism is completely independent of
  166. normal command line redirection to avoid output conflicts.
  167. .LE
  168. .SK
  169. .B
  170. PRIMITIVE DEBUGGING TECHNIQUES
  171. .R
  172. .P
  173. Internal instrumentation is already a familiar concept
  174. to most programmers, since it is usually the first debugging
  175. technique learned.
  176. Typically, "print statements" are inserted in the source
  177. code at interesting points, the code is recompiled and executed,
  178. and the resulting output is examined in an attempt to determine
  179. where the problem is.
  180. The procedure is iterative, with each iteration yielding more
  181. and more output, and hopefully the source of the problem is
  182. discovered before the output becomes too large to deal with
  183. or previously inserted statements need to be removed.
  184. Figure 1 is an example of this type of primitive debugging
  185. technique.
  186. .DS I N
  187. .SP 2
  188. .so example1.r
  189. .SP 2
  190. .ll -5
  191. .ce
  192. Figure 1
  193. .ce
  194. Primitive Debugging Technique
  195. .ll +5
  196. .SP 2
  197. .DE
  198. .P
  199. Eventually, and usually after at least several iterations, the
  200. problem will be found and corrected.
  201. At this point, the newly inserted print statements must be 
  202. dealt with.
  203. One obvious solution is to simply delete them all.
  204. Beginners usually do this a few times until they have to
  205. repeat the entire process every time a new bug pops up.
  206. The second most obvious solution is to somehow disable
  207. the output, either through the source code comment facility,
  208. creation of a debug variable to be switched on or off, or by using the
  209. C preprocessor.
  210. Figure 2 is an example of all three techniques.
  211. .DS I N
  212. .SP 2
  213. .so example2.r
  214. .SP 2
  215. .ll -5
  216. .ce
  217. Figure 2
  218. .ce
  219. Debug Disable Techniques
  220. .ll +5
  221. .SP 2
  222. .DE
  223. .P
  224. Each technique has its advantages and disadvantages with respect
  225. to dynamic vs static activation, source code overhead, recompilation
  226. requirements, ease of use, program readability, etc.
  227. Overuse of the preprocessor solution quickly leads to problems with
  228. source code readability and maintainability when multiple 
  229. .B #ifdef
  230. symbols are to be defined or undefined based on specific types
  231. of debug desired.
  232. The source code can be made slightly more readable by suitable indentation
  233. of the 
  234. .B #ifdef
  235. arguments to match the indentation of the code, but
  236. not all C preprocessors allow this.
  237. The only requirement for the standard 
  238. .B UNIX
  239. C preprocessor is for the '#' character to appear
  240. in the first column, but even this seems
  241. like an arbitrary and unreasonable restriction.
  242. Figure 3 is an example of this usage.
  243. .DS I N
  244. .SP 2
  245. .so example3.r
  246. .SP 2
  247. .ll -5
  248. .ce
  249. Figure 3
  250. .ce
  251. More Readable Preprocessor Usage
  252. .ll +5
  253. .SP 2
  254. .DE
  255. .SK
  256. .B
  257. FUNCTION TRACE EXAMPLE
  258. .R
  259. .P
  260. We will start off learning about the capabilities of the
  261. .I dbug
  262. package by using a simple minded program which computes the
  263. factorial of a number.
  264. In order to better demonstrate the function trace mechanism, this
  265. program is implemented recursively.
  266. Figure 4 is the main function for this factorial program.
  267. .DS I N
  268. .SP 2
  269. .so main.r
  270. .SP 2
  271. .ll -5
  272. .ce
  273. Figure 4
  274. .ce
  275. Factorial Program Mainline
  276. .ll +5
  277. .SP 2
  278. .DE
  279. .P
  280. The 
  281. .B main
  282. function is responsible for processing any command line
  283. option arguments and then computing and printing the factorial of
  284. each non-option argument.
  285. .P
  286. First of all, notice that all of the debugger functions are implemented
  287. via preprocessor macros.
  288. This does not detract from the readability of the code and makes disabling
  289. all debug compilation trivial (a single preprocessor symbol, 
  290. .B DBUG_OFF ,
  291. forces the macro expansions to be null).
  292. .P
  293. Also notice the inclusion of the header file
  294. .B dbug.h
  295. from the local header file directory.
  296. (The version included here is the test version in the dbug source
  297. distribution directory).
  298. This file contains all the definitions for the debugger macros, which
  299. all have the form 
  300. .B DBUG_XX...XX .
  301. .P
  302. The 
  303. .B DBUG_ENTER 
  304. macro informs that debugger that we have entered the
  305. function named 
  306. .B main .
  307. It must be the very first "executable" line in a function, after
  308. all declarations and before any other executable line.
  309. The 
  310. .B DBUG_PROCESS
  311. macro is generally used only once per program to
  312. inform the debugger what name the program was invoked with.
  313. The
  314. .B DBUG_PUSH
  315. macro modifies the current debugger state by
  316. saving the previous state and setting a new state based on the
  317. control string passed as its argument.
  318. The
  319. .B DBUG_PRINT
  320. macro is used to print the values of each argument
  321. for which a factorial is to be computed.
  322. The 
  323. .B DBUG_RETURN
  324. macro tells the debugger that the end of the current
  325. function has been reached and returns a value to the calling
  326. function.
  327. All of these macros will be fully explained in subsequent sections.
  328. .P
  329. To use the debugger, the factorial program is invoked with a command
  330. line of the form:
  331. .DS CB N
  332. factorial -#d:t 1 2 3
  333. .DE
  334. The 
  335. .B main
  336. function recognizes the "-#d:t" string as a debugger control
  337. string, and passes the debugger arguments ("d:t") to the 
  338. .I dbug
  339. runtime support routines via the
  340. .B DBUG_PUSH 
  341. macro.
  342. This particular string enables output from the
  343. .B DBUG_PRINT
  344. macro with the 'd' flag and enables function tracing with the 't' flag.
  345. The factorial function is then called three times, with the arguments
  346. "1", "2", and "3".
  347. Note that the DBUG_PRINT takes exactly
  348. .B two
  349. arguments, with the second argument (a format string and list
  350. of printable values) enclosed in parenthesis.
  351. .P
  352. Debug control strings consist of a header, the "-#", followed
  353. by a colon separated list of debugger arguments.
  354. Each debugger argument is a single character flag followed
  355. by an optional comma separated list of arguments specific
  356. to the given flag.
  357. Some examples are:
  358. .DS CB N
  359. -#d:t:o
  360. -#d,in,out:f,main:F:L
  361. .DE
  362. Note that previously enabled debugger actions can be disabled by the
  363. control string "-#".
  364. .P
  365. The definition of the factorial function, symbolized as "N!", is
  366. given by:
  367. .DS CB N
  368. N! = N * N-1 * ... 2 * 1
  369. .DE
  370. Figure 5 is the factorial function which implements this algorithm
  371. recursively.
  372. Note that this is not necessarily the best way to do factorials
  373. and error conditions are ignored completely.
  374. .DS I N
  375. .SP 2
  376. .so factorial.r
  377. .SP 2
  378. .ll -5
  379. .ce
  380. Figure 5
  381. .ce
  382. Factorial Function
  383. .ll +5
  384. .SP 2
  385. .DE
  386. .P
  387. One advantage (some may not consider it so) to using the
  388. .I dbug
  389. package is that it strongly encourages fully structured coding
  390. with only one entry and one exit point in each function.
  391. Multiple exit points, such as early returns to escape a loop,
  392. may be used, but each such point requires the use of an
  393. appropriate 
  394. .B DBUG_RETURN
  395. or
  396. .B DBUG_VOID_RETURN
  397. macro.
  398. .P
  399. To build the factorial program on a 
  400. .B UNIX
  401. system, compile and
  402. link with the command:
  403. .DS CB N
  404. cc -o factorial main.c factorial.c -ldbug
  405. .DE
  406. The "-ldbug" argument tells the loader to link in the
  407. runtime support modules for the
  408. .I dbug
  409. package.
  410. Executing the factorial program with a command of the form:
  411. .DS CB N
  412. factorial 1 2 3 4 5
  413. .DE
  414. generates the output shown in figure 6.
  415. .DS I N
  416. .SP 2
  417. .so output1.r
  418. .SP 2
  419. .ll -5
  420. .ce
  421. Figure 6
  422. .ce
  423. factorial 1 2 3 4 5
  424. .ll +5
  425. .SP 2
  426. .DE
  427. .P
  428. Function level tracing is enabled by passing the debugger
  429. the 't' flag in the debug control string.
  430. Figure 7 is the output resulting from the command
  431. "factorial -#t:o 3 2".
  432. .DS I N
  433. .SP 2
  434. .so output2.r
  435. .SP 2
  436. .ll -5
  437. .ce
  438. Figure 7
  439. .ce
  440. factorial -#t:o 3 2
  441. .ll +5
  442. .SP 2
  443. .DE
  444. .P
  445. Each entry to or return from a function is indicated by '>' for the
  446. entry point and '<' for the exit point, connected by
  447. vertical bars to allow matching points to be easily found
  448. when separated by large distances.
  449. .P
  450. This trace output indicates that there was an initial call
  451. to factorial from main (to compute 2!), followed by
  452. a single recursive call to factorial to compute 1!.
  453. The main program then output the result for 2! and called the
  454. factorial function again with the second argument, 3.
  455. Factorial called itself recursively to compute 2! and 1!, then
  456. returned control to main, which output the value for 3! and exited.
  457. .P
  458. Note that there is no matching entry point "main>" for the
  459. return point "<main" because at the time the 
  460. .B DBUG_ENTER
  461. macro was reached in main, tracing was not enabled yet.
  462. It was only after the macro
  463. .B DBUG_PUSH
  464. was executing that tracing became enabled.
  465. This implies that the argument list should be processed as early as
  466. possible since all code preceding the first call to
  467. .B DBUG_PUSH 
  468. is
  469. essentially invisible to 
  470. .B dbug
  471. (this can be worked around by
  472. inserting a temporary 
  473. .B DBUG_PUSH(argv[1])
  474. immediately after the
  475. .B DBUG_ENTER("main")
  476. macro.
  477. .P
  478. One last note,
  479. the trace output normally comes out on the standard error.
  480. Since the factorial program prints its result on the standard
  481. output, there is the possibility of the output on the terminal
  482. being scrambled if the two streams are not synchronized.
  483. Thus the debugger is told to write its output on the standard
  484. output instead, via the 'o' flag character.
  485. Note that no 'o' implies the default (standard error), a 'o' 
  486. with no arguments means standard output, and a 'o' 
  487. with an argument means used the named file.
  488. I.E, "factorial -#t:o,logfile 3 2" would write the trace
  489. output in "logfile".
  490. Because of 
  491. .B UNIX
  492. implementation details, programs usually run
  493. faster when writing to stdout rather than stderr, though this
  494. is not a prime consideration in this example.
  495. .SK
  496. .B
  497. USE OF DBUG_PRINT MACRO
  498. .R
  499. .P
  500. The mechanism used to produce "printf" style output is the
  501. .B DBUG_PRINT
  502. macro.
  503. .P
  504. To allow selection of output from specific macros, the first argument
  505. to every 
  506. .B DBUG_PRINT
  507. macro is a 
  508. .I dbug
  509. keyword.
  510. When this keyword appears in the argument list of the 'd' flag in
  511. a debug control string, as in "-#d,keyword1,keyword2,...:t",
  512. output from the corresponding macro is enabled.
  513. The default when there is no 'd' flag in the control string is to
  514. enable output from all 
  515. .B DBUG_PRINT
  516. macros.
  517. .P
  518. Typically, a program will be run once, with no keywords specified,
  519. to determine what keywords are significant for the current problem
  520. (the keywords are printed in the macro output line).
  521. Then the program will be run again, with the desired keywords,
  522. to examine only specific areas of interest.
  523. .P
  524. The second argument to a
  525. .B DBUG_PRINT 
  526. macro is a standard printf style
  527. format string and one or more arguments to print, all
  528. enclosed in parenthesis so that they collectively become a single macro
  529. argument.
  530. This is how variable numbers of printf arguments are supported.
  531. Also note that no explicit newline is required at the end of the format string.
  532. As a matter of style, two or three small 
  533. .B DBUG_PRINT
  534. macros are preferable
  535. to a single macro with a huge format string.
  536. Figure 8 shows the output for default tracing and debug.
  537. .DS I N
  538. .SP 2
  539. .so output3.r
  540. .SP 2
  541. .ll -5
  542. .ce
  543. Figure 8
  544. .ce
  545. factorial -#d:t:o 3
  546. .ll +5
  547. .SP 2
  548. .DE
  549. .P
  550. The output from the 
  551. .B DBUG_PRINT
  552. macro is indented to match the trace output
  553. for the function in which the macro occurs.
  554. When debugging is enabled, but not trace, the output starts at the left
  555. margin, without indentation.
  556. .P
  557. To demonstrate selection of specific macros for output, figure
  558. 9 shows the result when the factorial program is invoked with
  559. the debug control string "-#d,result:o".
  560. .DS I N
  561. .SP 2
  562. .so output4.r
  563. .SP 2
  564. .ll -5
  565. .ce
  566. Figure 9
  567. .ce
  568. factorial -#d,result:o 4
  569. .ll +5
  570. .SP 2
  571. .DE
  572. .P
  573. It is sometimes desirable to restrict debugging and trace actions
  574. to a specific function or list of functions.
  575. This is accomplished with the 'f' flag character in the debug
  576. control string.
  577. Figure 10 is the output of the factorial program when run with the
  578. control string "-#d:f,factorial:F:L:o".
  579. The 'F' flag enables printing of the source file name and the 'L'
  580. flag enables printing of the source file line number.
  581. .DS I N
  582. .SP 2
  583. .so output5.r
  584. .SP 2
  585. .ll -5
  586. .ce
  587. Figure 10
  588. .ce
  589. factorial -#d:f,factorial:F:L:o 3
  590. .ll +5
  591. .SP 2
  592. .DE
  593. .P
  594. The output in figure 10 shows that the "find" macro is in file
  595. "factorial.c" at source line 8 and the "result" macro is in the same
  596. file at source line 12.
  597. .SK
  598. .B
  599. SUMMARY OF MACROS
  600. .R
  601. .P
  602. This section summarizes the usage of all currently defined macros
  603. in the 
  604. .I dbug
  605. package.
  606. The macros definitions are found in the user include file
  607. .B dbug.h
  608. from the standard include directory.
  609. .SP 2
  610. .BL 20
  611. .LI DBUG_ENTER 
  612. Used to tell the runtime support module the name of the function
  613. being entered.
  614. The argument must be of type "pointer to character".
  615. The 
  616. DBUG_ENTER
  617. macro must precede all executable lines in the
  618. function just entered, and must come after all local declarations.
  619. Each 
  620. DBUG_ENTER
  621. macro must have a matching 
  622. DBUG_RETURN 
  623. or
  624. DBUG_VOID_RETURN
  625. macro 
  626. at the function exit points.
  627. DBUG_ENTER 
  628. macros used without a matching 
  629. DBUG_RETURN 
  630. or 
  631. DBUG_VOID_RETURN
  632. macro 
  633. will cause warning messages from the 
  634. .I dbug
  635. package runtime support module.
  636. .SP 1
  637. EX: DBUG_ENTER ("main");
  638. .SP 1
  639. .LI DBUG_RETURN 
  640. Used at each exit point of a function containing a 
  641. DBUG_ENTER 
  642. macro
  643. at the entry point.
  644. The argument is the value to return.
  645. Functions which return no value (void) should use the 
  646. DBUG_VOID_RETURN
  647. macro.
  648. It 
  649. is an error to have a 
  650. DBUG_RETURN 
  651. or 
  652. DBUG_VOID_RETURN 
  653. macro in a function
  654. which has no matching 
  655. DBUG_ENTER 
  656. macro, and the compiler will complain
  657. if the macros are actually used (expanded).
  658. .SP 1
  659. EX: DBUG_RETURN (value);
  660. .br
  661. EX: DBUG_VOID_RETURN;
  662. .SP 1
  663. .LI DBUG_PROCESS 
  664. Used to name the current process being executed.
  665. A typical argument for this macro is "argv[0]", though
  666. it will be perfectly happy with any other string.
  667. .SP 1
  668. EX: DBUG_PROCESS (argv[0]);
  669. .SP 1
  670. .LI DBUG_PUSH 
  671. Sets a new debugger state by pushing the current
  672. .B dbug
  673. state onto an
  674. internal stack and setting up the new state using the debug control
  675. string passed as the macro argument.
  676. The most common usage is to set the state specified by a debug
  677. control string retrieved from the argument list.
  678. Note that the leading "-#" in a debug control string specified
  679. as a command line argument must
  680. .B not
  681. be passed as part of the macro argument.
  682. The proper usage is to pass a pointer to the first character
  683. .B after
  684. the "-#" string.
  685. .SP 1
  686. EX: DBUG_PUSH (&(argv[i][2]));
  687. .br
  688. EX: DBUG_PUSH ("d:t");
  689. .br
  690. EX: DBUG_PUSH ("");
  691. .SP 1
  692. .LI DBUG_POP 
  693. Restores the previous debugger state by popping the state stack.
  694. Attempting to pop more states than pushed will be ignored and no
  695. warning will be given.
  696. The 
  697. DBUG_POP 
  698. macro has no arguments.
  699. .SP 1
  700. EX: DBUG_POP ();
  701. .SP 1
  702. .LI DBUG_FILE 
  703. The 
  704. DBUG_FILE 
  705. macro is used to do explicit I/O on the debug output
  706. stream.
  707. It is used in the same manner as the symbols "stdout" and "stderr"
  708. in the standard I/O package.
  709. .SP 1
  710. EX: fprintf (DBUG_FILE, "Doing my own I/O!n");
  711. .SP 1
  712. .LI DBUG_EXECUTE 
  713. The DBUG_EXECUTE macro is used to execute any arbitrary C code.
  714. The first argument is the debug keyword, used to trigger execution
  715. of the code specified as the second argument.
  716. This macro must be used cautiously because, like the 
  717. DBUG_PRINT 
  718. macro,
  719. it is automatically selected by default whenever the 'd' flag has
  720. no argument list (I.E., a "-#d:t" control string).
  721. .SP 1
  722. EX: DBUG_EXECUTE ("abort", abort ());
  723. .SP 1
  724. .LI DBUG_N 
  725. These macros, where N is in the range 2-5, are currently obsolete
  726. and will be removed in a future release.
  727. Use the new DBUG_PRINT macro.
  728. .LI DBUG_PRINT 
  729. Used to do printing via the "fprintf" library function on the
  730. current debug stream,
  731. DBUG_FILE.
  732. The first argument is a debug keyword, the second is a format string
  733. and the corresponding argument list.
  734. Note that the format string and argument list are all one macro argument
  735. and
  736. .B must
  737. be enclosed in parenthesis.
  738. .SP 1
  739. EX: DBUG_PRINT ("eof", ("end of file found"));
  740. .br
  741. EX: DBUG_PRINT ("type", ("type is %x", type));
  742. .br
  743. EX: DBUG_PRINT ("stp", ("%x -> %s", stp, stp -> name));
  744. .LI DBUG_SETJMP 
  745. Used in place of the setjmp() function to first save the current
  746. debugger state and then execute the standard setjmp call.
  747. This allows to the debugger to restore it's state when the
  748. DBUG_LONGJMP macro is used to invoke the standard longjmp() call.
  749. Currently all instances of DBUG_SETJMP must occur within the
  750. same function and at the same function nesting level.
  751. .SP 1
  752. EX: DBUG_SETJMP (env);
  753. .LI DBUG_LONGJMP 
  754. Used in place of the longjmp() function to first restore the
  755. previous debugger state at the time of the last DBUG_SETJMP
  756. and then execute the standard longjmp() call.
  757. Note that currently all DBUG_LONGJMP macros restore the state
  758. at the time of the last DBUG_SETJMP.
  759. It would be possible to maintain separate DBUG_SETJMP and DBUG_LONGJMP
  760. pairs by having the debugger runtime support module use the first
  761. argument to differentiate the pairs.
  762. .SP 1
  763. EX: DBUG_LONGJMP (env,val);
  764. .LE
  765. .SK
  766. .B
  767. DEBUG CONTROL STRING
  768. .R
  769. .P
  770. The debug control string is used to set the state of the debugger
  771. via the 
  772. .B DBUG_PUSH 
  773. macro.
  774. This section summarizes the currently available debugger options
  775. and the flag characters which enable or disable them.
  776. Argument lists enclosed in '[' and ']' are optional.
  777. .SP 2
  778. .BL 22
  779. .LI d[,keywords]
  780. Enable output from macros with specified keywords.
  781. A null list of keywords implies that all keywords are selected.
  782. .LI D[,time]
  783. Delay for specified time after each output line, to let output drain.
  784. Time is given in tenths of a second (value of 10 is one second).
  785. Default is zero.
  786. .LI f[,functions]
  787. Limit debugger actions to the specified list of functions.
  788. A null list of functions implies that all functions are selected.
  789. .LI F
  790. Mark each debugger output line with the name of the source file
  791. containing the macro causing the output.
  792. .LI L
  793. Mark each debugger output line with the source file line number of
  794. the macro causing the output.
  795. .LI n
  796. Mark each debugger output line with the current function nesting depth.
  797. .LI N
  798. Sequentially number each debugger output line starting at 1.
  799. This is useful for reference purposes when debugger output is
  800. interspersed with program output.
  801. .LI o[,file]
  802. Redirect the debugger output stream to the specified file.
  803. The default output stream is stderr.
  804. A null argument list causes output to be redirected to stdout.
  805. .LI p[,processes]
  806. Limit debugger actions to the specified processes.
  807. A null list implies all processes.
  808. This is useful for processes which run child processes.
  809. Note that each debugger output line can be marked with the name of
  810. the current process via the 'P' flag.
  811. The process name must match the argument passed to the
  812. .B DBUG_PROCESS
  813. macro.
  814. .LI P
  815. Mark each debugger output line with the name of the current process.
  816. Most useful when used with a process which runs child processes that
  817. are also being debugged.
  818. Note that the parent process must arrange for the debugger control
  819. string to be passed to the child processes.
  820. .LI r
  821. Used in conjunction with the 
  822. .B DBUG_PUSH 
  823. macro to reset the current
  824. indentation level back to zero.
  825. Most useful with 
  826. .B DBUG_PUSH 
  827. macros used to temporarily alter the
  828. debugger state.
  829. .LI t[,N]
  830. Enable function control flow tracing.
  831. The maximum nesting depth is specified by N, and defaults to
  832. 200.
  833. .LE
  834. .SK
  835. .B
  836. HINTS AND MISCELLANEOUS
  837. .R
  838. .P
  839. One of the most useful capabilities of the 
  840. .I dbug 
  841. package is to compare the executions of a given program in two
  842. different environments.
  843. This is typically done by executing the program in the environment
  844. where it behaves properly and saving the debugger output in a
  845. reference file.
  846. The program is then run with identical inputs in the environment where 
  847. it misbehaves and the output is again captured in a reference file.
  848. The two reference files can then be differentially compared to
  849. determine exactly where execution of the two processes diverges.
  850. .P
  851. A related usage is regression testing where the execution of a current
  852. version is compared against executions of previous versions.
  853. This is most useful when there are only minor changes.
  854. .P
  855. It is not difficult to modify an existing compiler to implement
  856. some of the functionality of the 
  857. .I dbug
  858. package automatically, without source code changes to the
  859. program being debugged.
  860. In fact, such changes were implemented in a version of the
  861. Portable C Compiler by the author in less than a day.
  862. However, it is strongly encouraged that all newly
  863. developed code continue to use the debugger macros
  864. for the portability reasons noted earlier.
  865. The modified compiler should be used only for testing existing
  866. programs.
  867. .SK
  868. .B
  869. CAVEATS
  870. .R
  871. .P
  872. The 
  873. .I dbug
  874. package works best with programs which have "line oriented"
  875. output, such as text processors, general purpose utilities, etc.
  876. It can be interfaced with screen oriented programs such as
  877. visual editors by redefining the appropriate macros to call
  878. special functions for displaying the debugger results.
  879. Of course, this caveat is not applicable if the debugger output
  880. is simply dumped into a file for post-execution examination.
  881. .P
  882. Programs which use memory allocation functions other than
  883. .B malloc
  884. will usually have problems using the standard
  885. .I dbug
  886. package.
  887. The most common problem is multiply allocated memory.
  888. .SP 2
  889. ." .DE nroff dident like this. davida 900108
  890. .CS