Commit | Line | Data |
---|---|---|
d1836466 | 1 | .\" -*-nroff-*- |
c4ccbbf9 MW |
2 | .\" |
3 | .\" Manual for tracing | |
4 | .\" | |
5 | .\" (c) 1999, 2001, 2005, 2009, 2017, 2023, 2024 Straylight/Edgeware | |
6 | .\" | |
7 | . | |
8 | .\"----- Licensing notice --------------------------------------------------- | |
9 | .\" | |
10 | .\" This file is part of the mLib utilities library. | |
11 | .\" | |
12 | .\" mLib is free software: you can redistribute it and/or modify it under | |
13 | .\" the terms of the GNU Library General Public License as published by | |
14 | .\" the Free Software Foundation; either version 2 of the License, or (at | |
15 | .\" your option) any later version. | |
16 | .\" | |
17 | .\" mLib is distributed in the hope that it will be useful, but WITHOUT | |
18 | .\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
19 | .\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public | |
20 | .\" License for more details. | |
21 | .\" | |
22 | .\" You should have received a copy of the GNU Library General Public | |
23 | .\" License along with mLib. If not, write to the Free Software | |
24 | .\" Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |
25 | .\" USA. | |
26 | . | |
27 | .\"-------------------------------------------------------------------------- | |
28 | .so ../defs.man \" @@@PRE@@@ | |
29 | . | |
30 | .\"-------------------------------------------------------------------------- | |
31 | .TH trace 3mLib "21 October 1999" "Straylight/Edgeware" "mLib utilities library" | |
d1836466 | 32 | .\" @trace |
33 | .\" @trace_block | |
34 | .\" @trace_on | |
0680be67 | 35 | .\" @trace_custom |
d1836466 | 36 | .\" @trace_level |
37 | .\" @tracing | |
38 | .\" @traceopt | |
39 | .\" @NTRACE | |
40 | .\" @T | |
b1a20bee | 41 | .\" @IF_TRACING |
c4ccbbf9 MW |
42 | . |
43 | .\"-------------------------------------------------------------------------- | |
44 | .SH "NAME" | |
45 | trace \- configurable tracing output | |
46 | . | |
47 | .\"-------------------------------------------------------------------------- | |
d1836466 | 48 | .SH "SYNOPSIS" |
c4ccbbf9 | 49 | . |
d1836466 | 50 | .nf |
51 | .B "#include <mLib/trace.h>" | |
d056fbdf | 52 | .PP |
d1836466 | 53 | .BI "void trace(unsigned " l ", const char *" f ", ...);" |
adec5584 MW |
54 | .ta \w'\fBvoid trace_block('u |
55 | .BI "void trace_block(unsigned " l ", const char *" s , | |
56 | .BI " const void *" b ", size_t " sz ); | |
d056fbdf | 57 | .PP |
d1836466 | 58 | .BI "void trace_on(FILE *" fp ", unsigned " l ); |
adec5584 MW |
59 | .ta \w'\fBvoid trace_custom('u +\w'\fBvoid (*\,\fIfunc\/\fB)('u |
60 | .BI "void trace_custom(void (*" func ")(const char *" buf , | |
61 | .BI " size_t " sz ", void *" v ), | |
62 | .BI " void *" v ); | |
d1836466 | 63 | .BI "void trace_level(unsigned " l ); |
64 | .BI "unsigned tracing(void);" | |
d056fbdf | 65 | .PP |
adec5584 MW |
66 | .ta \w'\fBunsigned traceopt('u |
67 | .BI "unsigned traceopt(const trace_opt *" t ", const char *" p , | |
68 | .BI " unsigned " f ", unsigned " bad ); | |
d056fbdf | 69 | .PP |
d1836466 | 70 | .BI T( statements\fR... ) |
71 | .BI "IF_TRACING(unsigned " l ", " statements\fR... ) | |
72 | .fi | |
c4ccbbf9 MW |
73 | . |
74 | .\"-------------------------------------------------------------------------- | |
d1836466 | 75 | .SH "DESCRIPTION" |
c4ccbbf9 | 76 | . |
d1836466 | 77 | The |
78 | .B <mLib/trace.h> | |
79 | header declares some functions and macros for handling trace output. | |
80 | The emphasis for this system is primarily on user configurability of | |
81 | what gets traced rather than where the output goes. That's a project | |
82 | for later. | |
83 | .SS "Trace levels" | |
84 | Each trace message is assigned a | |
85 | .I level | |
86 | by the programmer. A tracing level is set during program | |
87 | initialization, usually by the user. A trace message is output if there | |
88 | is a trace destination set, and the result of a bitwise AND between the | |
89 | message level and the overall tracing level is nonzero. The idea is | |
90 | that the programmer assigns a different bit to each group of trace | |
91 | messages, and allows a user to select which ones are wanted. | |
c4ccbbf9 | 92 | . |
d1836466 | 93 | .SS "Producing trace output" |
94 | The basic function is | |
95 | .BR trace . | |
96 | It is passed an integer message level and a | |
97 | .BR printf (3)-style | |
98 | format string together with arguments for the placeholders and emits the | |
99 | resulting message. | |
100 | .PP | |
101 | The function | |
102 | .B trace_block | |
103 | formats an arbitrary block of memory as a hex dump. The arguments are, | |
104 | in order, the message level, a pointer to the header string for the hex | |
105 | dump, the base address of the block to dump, and the size of the block | |
106 | in bytes. | |
c4ccbbf9 | 107 | . |
d1836466 | 108 | .SS "Configuring trace output" |
109 | The tracing destination is set with the function | |
110 | .BR trace_on : | |
111 | it is passed a | |
112 | .B stdio | |
113 | stream and a trace level to set. The stream may be null to disable | |
114 | tracing completely (which is the default). The trace level may be set | |
115 | on its own using | |
116 | .BR trace_level , | |
117 | which takes the new level as its single argument. The function | |
118 | .B tracing | |
119 | returns the current trace level, or zero if there is no trace | |
120 | destination set. | |
0680be67 | 121 | .PP |
122 | For more advanced programs, a custom output function may be provided by | |
123 | .B trace_custom | |
124 | and passing a function which will write a buffer of data somewhere | |
125 | sensible. | |
c4ccbbf9 | 126 | . |
d1836466 | 127 | .SS "Parsing user trace options" |
128 | The function | |
129 | .B traceopt | |
130 | may be used to allow a user to set the trace level. It is passed a | |
131 | table describing the available trace level bits, and some other | |
132 | information, and returns a new trace level. The table consists of a | |
133 | number of | |
134 | .B trace_opt | |
135 | structures, each of which describes a bit or selection of bits which may | |
136 | be controlled. The structure contains the following members, in order: | |
137 | .TP | |
138 | .B "char ch;" | |
139 | The character used to select this bit or collection of bits. | |
140 | .TP | |
141 | .B "unsigned f;" | |
142 | The level bits for this option. | |
143 | .TP | |
144 | .B "const char *help;" | |
145 | A help string describing this option. | |
146 | .PP | |
147 | The table is terminated by an entry whose | |
148 | .B ch | |
149 | member is zero. | |
150 | .PP | |
151 | The arguments to | |
152 | .B traceopt | |
153 | are: | |
154 | .TP | |
155 | .BI "trace_opt *" t | |
156 | Pointer to the trace options table. | |
157 | .TP | |
158 | .BI "const char *" p | |
159 | Pointer to the user's option string. | |
160 | .TP | |
161 | .BI "unsigned " f | |
162 | The default trace options, or the previously-set options. | |
163 | .TP | |
164 | .BI "unsigned " bad | |
165 | A bitmask of level bits which should be disallowed. | |
166 | .PP | |
167 | If the option string | |
168 | .I p | |
169 | is a null pointer or contains only a | |
170 | .RB ` ? ' | |
171 | character, a help message is printed and the default is returned. Only | |
172 | trace options which contain non-bad bits are displayed. Otherwise the | |
173 | string contains option characters together with | |
174 | .RB ` + ' | |
175 | and | |
176 | .RB ` \- ' | |
177 | which respectively turn on or off the following options; the default is | |
178 | to turn options on. Again, only options which contain non-bad bits are | |
179 | allowed. | |
180 | .PP | |
181 | The `bad bit' mechanism is provided for setuid programs which in their | |
182 | normal configuration deal with privileged information which mustn't be | |
183 | given out to users. However, if run by someone with appropriate | |
184 | privilege such options are safe and may be useful for debugging. The | |
185 | program can set the | |
186 | .I bad | |
187 | mask to prevent access to secret information when running setuid, or to | |
188 | zero when not. | |
c4ccbbf9 | 189 | . |
d1836466 | 190 | .SS "Macro support for tracing" |
191 | The tracing macros are intended to make insertion of tracing information | |
192 | unobtrusive and painless. If the | |
193 | .B NTRACE | |
194 | macro is defined, all of the tracing macros are disabled and generate no | |
195 | code; otherwise they do their normal jobs. | |
196 | .PP | |
197 | The | |
198 | .B T | |
199 | macro simply expands to its argument. It may be wrapped around small | |
200 | pieces of code which is only needed when compiling with tracing | |
201 | enabled. (Larger blocks, of course, should use | |
76809a64 | 202 | .RB ` "#ifndef NTRACE" '/` #endif ' |
d1836466 | 203 | pairs for clarity's sake.) |
204 | .PP | |
205 | For slightly larger code chunks which do some processing to generate | |
206 | trace output, the | |
207 | .B IF_TRACING | |
208 | macro is useful. Its first argument is a message level; if the trace | |
209 | level is set such that the message will be printed, the code in the | |
210 | second argument is executed. If code is being compiled without tracing, | |
211 | of course, the entire contents of the macro is ignored. | |
c4ccbbf9 MW |
212 | . |
213 | .\"-------------------------------------------------------------------------- | |
d1836466 | 214 | .SH "SEE ALSO" |
c4ccbbf9 | 215 | . |
d1836466 | 216 | .BR mLib (3). |
c4ccbbf9 MW |
217 | . |
218 | .\"-------------------------------------------------------------------------- | |
d1836466 | 219 | .SH "AUTHOR" |
c4ccbbf9 | 220 | . |
9b5ac6ff | 221 | Mark Wooding, <mdw@distorted.org.uk> |
c4ccbbf9 MW |
222 | . |
223 | .\"----- That's all, folks -------------------------------------------------- |