1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Copyright (c) 2012 by Delphix. All rights reserved.
* Copyright (c) 2012 Joyent, Inc. All rights reserved.
*/
#ifndef _MDB_H
#define _MDB_H
#include <mdb/mdb_nv.h>
#include <mdb/mdb_io.h>
#include <mdb/mdb_gelf.h>
#include <mdb/mdb_addrvec.h>
#include <mdb/mdb_argvec.h>
#include <mdb/mdb_target.h>
#include <mdb/mdb_disasm.h>
#include <mdb/mdb_demangle.h>
#include <mdb/mdb_module.h>
#include <mdb/mdb_modapi.h>
#include <mdb/mdb_list.h>
#include <mdb/mdb_vcb.h>
#include <mdb/mdb_ctf.h>
#include <mdb/mdb_tab.h>
#ifdef _KMDB
#include <kmdb/kmdb_wr.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define MDB_ERR_PARSE 1 /* Error occurred in lexer or parser */
#define MDB_ERR_NOMEM 2 /* Failed to allocate needed memory */
#define MDB_ERR_PAGER 3 /* User quit current command from pager */
#define MDB_ERR_SIGINT 4 /* User interrupt: abort current command */
#define MDB_ERR_QUIT 5 /* User request: quit debugger */
#define MDB_ERR_ASSERT 6 /* Assertion failure: abort current command */
#define MDB_ERR_API 7 /* API function error: abort current command */
#define MDB_ERR_ABORT 8 /* User abort or resume: abort to top level */
#define MDB_ERR_OUTPUT 9 /* Write to m_out failed: abort to top level */
#define MDB_ERR_IS_FATAL(err) \
((err) == MDB_ERR_QUIT || (err) == MDB_ERR_ABORT || \
(err) == MDB_ERR_OUTPUT)
#define MDB_DEF_RADIX 16 /* Default output radix */
#define MDB_DEF_NARGS 6 /* Default # of arguments in stack trace */
#define MDB_DEF_HISTLEN 128 /* Default length of command history */
#define MDB_DEF_SYMDIST 0x8000 /* Default symbol distance for addresses */
#define MDB_DEF_ARRMEM 32 /* Default number of array members to print */
#define MDB_DEF_ARRSTR 1024 /* Default number of array chars to print */
#define MDB_ARR_NOLIMIT -1UL /* No limit on number of array elements */
#define MDB_FL_PSYM 0x00001 /* Print dot as symbol + offset when possible */
#define MDB_FL_LOG 0x00002 /* Logging is enabled */
#define MDB_FL_NOMODS 0x00004 /* Skip automatic mdb module loading */
#define MDB_FL_USECUP 0x00008 /* Use terminal cup initialization sequences */
#define MDB_FL_ADB 0x00010 /* Enable stricter adb(1) compatibility */
#define MDB_FL_SHOWLMID 0x00020 /* Always show link map id with symbol names */
#define MDB_FL_IGNEOF 0x00040 /* Ignore EOF as a synonym for ::quit */
#define MDB_FL_REPLAST 0x00080 /* Naked newline repeats previous command */
#define MDB_FL_PAGER 0x00100 /* Enable pager by default */
#define MDB_FL_LATEST 0x00200 /* Replace version string with "latest" */
#define MDB_FL_VCREATE 0x00400 /* Victim process was created by debugger */
#define MDB_FL_JOBCTL 0x00800 /* Victim process jobctl stopped on same tty */
#define MDB_FL_DEMANGLE 0x01000 /* Demangle symbols as part of %a processing */
#define MDB_FL_EXEC 0x02000 /* Debugger exec'd by a previous instance */
#define MDB_FL_NOCTF 0x04000 /* Skip automatic CTF data loading */
#define MDB_FL_BPTNOSYMSTOP 0x08000 /* Stop on deferred bkpts for unk symbols */
#define MDB_FL_TERMGUESS 0x10000 /* m_termtype derived from userland */
#define MDB_FL_READBACK 0x20000 /* Read value back after write */
#ifdef _KMDB
#define MDB_FL_NOUNLOAD 0x40000 /* Don't allow debugger unload */
#endif
#define MDB_FL_LMRAW 0x80000 /* Show unresolved link map object names */
#define MDB_FL_VOLATILE 0x0001 /* Mask of all volatile flags to save/restore */
#define MDB_EM_ASK 0 /* Ask what to do on an exec */
#define MDB_EM_STOP 1 /* Stop after an exec */
#define MDB_EM_FOLLOW 2 /* Follow an exec */
#define MDB_FM_ASK 0 /* Ask what to do on a fork */
#define MDB_FM_PARENT 1 /* Follow parent process on a fork */
#define MDB_FM_CHILD 2 /* Follow child process on a fork */
#define MDB_PROMPTLEN 35 /* Maximum prompt length */
struct kmdb_promif;
typedef struct mdb {
uint_t m_tgtflags; /* Target open flags (see mdb_target.h) */
uint_t m_flags; /* Miscellaneous flags (see above) */
uint_t m_debug; /* Debugging flags (see mdb_debug.h) */
int m_radix; /* Default radix for output formatting */
int m_nargs; /* Default number of arguments in stack trace */
int m_histlen; /* Length of command history */
size_t m_symdist; /* Distance from sym for addr match (0=smart) */
const char *m_pname; /* Program basename from argv[0] */
char m_promptraw[MDB_PROMPTLEN + 1]; /* Un-expanded prompt */
char m_prompt[MDB_PROMPTLEN + 1]; /* Prompt for interactive mode */
size_t m_promptlen; /* Length of prompt in bytes */
const char *m_shell; /* Shell for ! commands and pipelines */
char *m_root; /* Root for path construction */
char *m_ipathstr; /* Path string for include path */
char *m_lpathstr; /* Path string for library path */
const char **m_ipath; /* Path for $< and $<< macro files */
size_t m_ipathlen; /* Length of underlying ipath buffer */
const char **m_lpath; /* Path for :: loadable modules */
size_t m_lpathlen; /* Length of underlying lpath buffer */
mdb_modinfo_t m_rminfo; /* Root debugger module information */
mdb_module_t m_rmod; /* Root debugger module (builtins) */
mdb_module_t *m_mhead; /* Head of module list (in load order) */
mdb_module_t *m_mtail; /* Tail of module list (in load order) */
mdb_list_t m_tgtlist; /* List of active target backends */
mdb_tgt_t *m_target; /* Current debugger target backend */
mdb_nv_t m_disasms; /* Hash of available disassemblers */
mdb_disasm_t *m_disasm; /* Current disassembler backend */
char *m_defdisasm; /* Deferred diassembler selection */
mdb_nv_t m_modules; /* Name/value hash for loadable modules */
mdb_nv_t m_dcmds; /* Name/value hash for extended commands */
mdb_nv_t m_walkers; /* Name/value hash for walk operations */
mdb_nv_t m_nv; /* Name/value hash for named variables */
mdb_var_t *m_dot; /* Variable reference for '.' */
uintmax_t m_incr; /* Current increment */
uintmax_t m_raddr; /* Most recent address specified to a dcmd */
uintmax_t m_dcount; /* Most recent count specified to a dcmd */
mdb_var_t *m_rvalue; /* Most recent value printed */
mdb_var_t *m_roffset; /* Most recent offset from an instruction */
mdb_var_t *m_proffset; /* Previous value of m_roffset */
mdb_var_t *m_rcount; /* Most recent count on $< dcmd */
mdb_iob_t *m_in; /* Input stream */
mdb_iob_t *m_out; /* Output stream */
mdb_iob_t *m_err; /* Error stream */
mdb_iob_t *m_null; /* Null stream */
char *m_termtype; /* Interactive mode terminal type */
mdb_io_t *m_term; /* Terminal for interactive mode */
mdb_io_t *m_log; /* Log file i/o backend (NULL if not logging) */
mdb_module_t *m_lmod; /* Pointer to loading module, if in load */
mdb_list_t m_lastc; /* Last executed command list */
mdb_gelf_symtab_t *m_prsym; /* Private symbol table */
mdb_demangler_t *m_demangler; /* Demangler (see <mdb/mdb_demangle.h>) */
mdb_list_t m_flist; /* Stack of execution frames */
struct mdb_frame *volatile m_frame; /* Current stack frame */
struct mdb_frame *volatile m_fmark; /* Stack marker for pager */
uint_t m_fid; /* Next frame identifier number to assign */
uint_t m_depth; /* Depth of m_frame stack */
volatile uint_t m_intr; /* Don't allow SIGINT if set */
volatile uint_t m_pend; /* Pending SIGINT count */
pid_t m_pgid; /* Debugger process group id */
uint_t m_rdvers; /* Librtld_db version number */
uint_t m_ctfvers; /* Libctf version number */
ulong_t m_armemlim; /* Limit on number of array members to print */
ulong_t m_arstrlim; /* Limit on number of array chars to print */
uchar_t m_execmode; /* Follow exec behavior */
uchar_t m_forkmode; /* Follow fork behavior */
char **m_env; /* Current environment */
mdb_list_t m_cblist; /* List of callbacks */
mdb_nv_t m_macaliases; /* Name/value hash of ADB macro aliases */
ctf_file_t *m_synth; /* Container for synthetic types */
int m_lastret; /* Result of running the last command */
#ifdef _KMDB
struct dpi_ops *m_dpi; /* DPI ops vector */
struct kdi *m_kdi; /* KDI ops vector */
size_t m_pagesize; /* Base page size for this machine */
caddr_t m_dseg; /* Debugger segment address */
size_t m_dsegsz; /* Debugger segment size */
mdb_nv_t m_dmodctl; /* dmod name -> kmdb_modctl hash */
kmdb_wr_t *m_drvwrhead; /* Driver work request queue */
kmdb_wr_t *m_drvwrtail; /* Driver work request queue */
kmdb_wr_t *m_dbgwrhead; /* Debugger request queue */
kmdb_wr_t *m_dbgwrtail; /* Debugger request queue */
struct cons_polledio *m_pio; /* Polled I/O struct from kernel */
struct kmdb_promif *m_promif; /* Debugger/PROM interface state */
#endif
} mdb_t;
#ifdef _MDB_PRIVATE
mdb_t mdb;
#else
extern mdb_t mdb;
#endif
#ifdef _MDB
#define MDB_CONFIG_ENV_VAR "_MDB_CONFIG"
extern void mdb_create(const char *, const char *);
extern void mdb_destroy(void);
extern int mdb_call_idcmd(mdb_idcmd_t *, uintmax_t, uintmax_t, uint_t,
mdb_argvec_t *, mdb_addrvec_t *, mdb_vcb_t *);
extern void mdb_call_tab(mdb_idcmd_t *, mdb_tab_cookie_t *, uint_t, uintmax_t,
mdb_arg_t *);
extern int mdb_call(uintmax_t, uintmax_t, uint_t);
extern int mdb_run(void);
extern const char *mdb_get_prompt(void);
extern int mdb_set_prompt(const char *);
extern void mdb_set_ipath(const char *);
extern void mdb_set_lpath(const char *);
extern const char **mdb_path_alloc(const char *, size_t *);
extern const char **mdb_path_dup(const char *[], size_t, size_t *);
extern void mdb_path_free(const char *[], size_t);
extern uintmax_t mdb_dot_incr(const char *);
extern uintmax_t mdb_dot_decr(const char *);
extern mdb_iwalker_t *mdb_walker_lookup(const char *);
extern mdb_idcmd_t *mdb_dcmd_lookup(const char *);
extern void mdb_dcmd_usage(const mdb_idcmd_t *, mdb_iob_t *);
extern void mdb_pservice_init(void);
extern void mdb_intr_enable(void);
extern void mdb_intr_disable(void);
extern char *mdb_get_config(void);
extern void mdb_set_config(const char *);
extern mdb_module_t *mdb_get_module(void);
#endif /* _MDB */
#ifdef __cplusplus
}
#endif
#endif /* _MDB_H */
|