1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 *
24 * mdbug.h
25 *
26 * Include file for the mdbug class.
27 */
28
29 #pragma ident "%Z%%M% %I% %E% SMI"
30 /* Copyright (c) 1994 by Sun Microsystems, Inc. */
31
32 /*
33 * .LIBRARY base
34 * .NAME mdbug - macros for debugging C++ programs.
35 * .FILE dbug.cc
36 * .FILE mdbug.h
37 */
38
39 /*
40 * .SECTION Description
41 * The mdbug package provides a set of macros for debugging C++ programs.
42 * Features include tracing function entry and exit points, printing
43 * of debug messages, and heap corruption detection. All features can
44 * be selectively enabled at run time using command line options. Also
45 * defining the macro DBUG_OFF removes all mdbug code from the compilation.
46 */
47
48 #ifndef MDBUG_H
49 #define MDBUG_H
50
51 #define DBUG_STMT(A) do { A } while (0)
52
53 #ifndef DBUG_OFF
54 #define DBUG_LENGTH 64
55 typedef struct dbug_object {
56 char d_func[DBUG_LENGTH]; /* Name of current function. */
57 char d_file[DBUG_LENGTH]; /* Name of current file. */
58 struct dbug_object *d_prev; /* dbug_routine object */
59 int d_leaveline; /* Exit line from routine. */
60 } dbug_object_t;
61
62 void dbug_object_create();
63 void dbug_object_destroy(char *function_name, int line);
64 int db_keyword(dbug_object_t *dbug_object_p, const char *keyword);
65 void db_pargs(dbug_object_t *dbug_object_p, int line, char *keyword);
66 void db_printf(char *keyword, char *format, ...);
67 void db_traceprint(int line, const char *keyword);
68 void db_assert(dbug_object_t *dbug_object_p, int line, const char *msgp);
69 void db_precond(dbug_object_t *dbug_object_p, int line, const char *msgp);
70 char *db_push(const char *control);
71 void db_pop();
72 void db_process(const char *namep);
73 void dbug_thread_exit(void *data);
74 dbug_object_t *db_get_dbug_object_p();
75 void doabort();
76
77
78 #define dbug_enter(A) dbug_object_create(__LINE__, __FILE__, A)
79 #define dbug_leave(A) dbug_object_destroy(A, __LINE__)
80 #define dbug_traceprint(KEY) db_traceprint(__LINE__, KEY)
81 #define dbug_push(A) db_push(A)
82 void dbug_pop();
83 #define dbug_process(A) db_process(A)
84 void dbug_assert();
85 #define dbug_assert(A)\
86 if (!(A)) { db_assert(db_get_dbug_object_p(), __LINE__, ""); }
87 #define dbug_precond(A)\
88 if (!(A)) { db_precond(db_get_dbug_object_p(), __LINE__, ""); }
89 void dbug_execute();
90 #define dbug_print(A) db_printf A
91 int db_debugon();
92
93 #else /* if DBUG_OFF */
94
95 #define dbug_enter(A) 0
96 #define dbug_leave(A) 0
97 #define dbug_traceprint(KEY) 0
98 #define dbug_push(A) 0
99 #define dbug_pop() 0
100 #define dbug_process(A) 0
101 #define dbug_execute(KEY, CODE) 0
102 #define dbug_print(A)
103 #define dbug_assert(A) 0
104 #define dbug_precond(A) 0
105 #define db_debugon() 0
106
107 #endif /* DBUG_OFF */
108 #endif /* MDBUG_H */