VirtualBox

source: vbox/trunk/src/VBox/Debugger/DBGCInternal.h@ 37989

Last change on this file since 37989 was 35694, checked in by vboxsync, 14 years ago

Debugger console: more cleanup.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.3 KB
Line 
1/* $Id: DBGCInternal.h 35694 2011-01-24 17:35:59Z vboxsync $ */
2/** @file
3 * DBGC - Debugger Console, Internal Header File.
4 */
5
6/*
7 * Copyright (C) 2006-2011 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19#ifndef ___Debugger_DBGCInternal_h
20#define ___Debugger_DBGCInternal_h
21
22
23/*******************************************************************************
24* Header Files *
25*******************************************************************************/
26#include <VBox/dbg.h>
27
28
29/*******************************************************************************
30* Defined Constants And Macros *
31*******************************************************************************/
32/* to err.h! */
33#define VERR_DBGC_QUIT (-11999)
34#define VERR_PARSE_FIRST (-11000)
35#define VERR_PARSE_TOO_FEW_ARGUMENTS (VERR_PARSE_FIRST - 0)
36#define VERR_PARSE_TOO_MANY_ARGUMENTS (VERR_PARSE_FIRST - 1)
37#define VERR_PARSE_ARGUMENT_OVERFLOW (VERR_PARSE_FIRST - 2)
38#define VERR_PARSE_ARGUMENT_TYPE_MISMATCH (VERR_PARSE_FIRST - 3)
39#define VERR_PARSE_NO_RANGE_ALLOWED (VERR_PARSE_FIRST - 4)
40#define VERR_PARSE_UNBALANCED_QUOTE (VERR_PARSE_FIRST - 5)
41#define VERR_PARSE_UNBALANCED_PARENTHESIS (VERR_PARSE_FIRST - 6)
42#define VERR_PARSE_EMPTY_ARGUMENT (VERR_PARSE_FIRST - 7)
43#define VERR_PARSE_UNEXPECTED_OPERATOR (VERR_PARSE_FIRST - 8)
44#define VERR_PARSE_INVALID_NUMBER (VERR_PARSE_FIRST - 9)
45#define VERR_PARSE_NUMBER_TOO_BIG (VERR_PARSE_FIRST - 10)
46#define VERR_PARSE_INVALID_OPERATION (VERR_PARSE_FIRST - 11)
47#define VERR_PARSE_FUNCTION_NOT_FOUND (VERR_PARSE_FIRST - 12)
48#define VERR_PARSE_NOT_A_FUNCTION (VERR_PARSE_FIRST - 13)
49#define VERR_PARSE_NO_MEMORY (VERR_PARSE_FIRST - 14)
50#define VERR_PARSE_INCORRECT_ARG_TYPE (VERR_PARSE_FIRST - 15)
51#define VERR_PARSE_VARIABLE_NOT_FOUND (VERR_PARSE_FIRST - 16)
52#define VERR_PARSE_CONVERSION_FAILED (VERR_PARSE_FIRST - 17)
53#define VERR_PARSE_NOT_IMPLEMENTED (VERR_PARSE_FIRST - 18)
54#define VERR_PARSE_BAD_RESULT_TYPE (VERR_PARSE_FIRST - 19)
55#define VERR_PARSE_WRITEONLY_SYMBOL (VERR_PARSE_FIRST - 20)
56#define VERR_PARSE_NO_ARGUMENT_MATCH (VERR_PARSE_FIRST - 21)
57#define VINF_PARSE_COMMAND_NOT_FOUND (VERR_PARSE_FIRST - 22)
58#define VINF_PARSE_INVALD_COMMAND_NAME (VERR_PARSE_FIRST - 23)
59#define VERR_PARSE_LAST (VERR_PARSE_FIRST - 30)
60
61#define VWRN_DBGC_CMD_PENDING 12000
62#define VWRN_DBGC_ALREADY_REGISTERED 12001
63#define VERR_DBGC_COMMANDS_NOT_REGISTERED (-12002)
64#define VERR_DBGC_BP_NOT_FOUND (-12003)
65#define VERR_DBGC_BP_EXISTS (-12004)
66#define VINF_DBGC_BP_NO_COMMAND 12005
67#define VERR_DBGC_COMMAND_FAILED (-12006)
68
69
70/*******************************************************************************
71* Structures and Typedefs *
72*******************************************************************************/
73
74/**
75 * Debugger console per breakpoint data.
76 */
77typedef struct DBGCBP
78{
79 /** Pointer to the next breakpoint in the list. */
80 struct DBGCBP *pNext;
81 /** The breakpoint identifier. */
82 uint32_t iBp;
83 /** The size of the command. */
84 size_t cchCmd;
85 /** The command to execute when the breakpoint is hit. */
86 char szCmd[1];
87} DBGCBP;
88/** Pointer to a breakpoint. */
89typedef DBGCBP *PDBGCBP;
90
91
92/**
93 * Named variable.
94 *
95 * Always allocated from heap in one single block.
96 */
97typedef struct DBGCNAMEDVAR
98{
99 /** The variable. */
100 DBGCVAR Var;
101 /** Its name. */
102 char szName[1];
103} DBGCNAMEDVAR;
104/** Pointer to named variable. */
105typedef DBGCNAMEDVAR *PDBGCNAMEDVAR;
106
107
108/** The max length of a plug-in name, zero terminator included. */
109#define DBGCPLUGIN_MAX_NAME 32
110
111/**
112 * Plug-in tracking record.
113 */
114typedef struct DBGCPLUGIN
115{
116 /** Pointer to the next plug-in. */
117 struct DBGCPLUGIN *pNext;
118 /** The loader handle. */
119 RTLDRMOD hLdrMod;
120 /** The plug-in entry point. */
121 PFNDBGCPLUGIN pfnEntry;
122 /** The plug-in name (variable length). */
123 char szName[DBGCPLUGIN_MAX_NAME];
124} DBGCPLUGIN;
125/** Pointer to plug-in tracking record. */
126typedef DBGCPLUGIN *PDBGCPLUGIN;
127
128
129/**
130 * Debugger console status
131 */
132typedef enum DBGCSTATUS
133{
134 /** Normal status, .*/
135 DBGC_HALTED
136
137} DBGCSTATUS;
138
139
140/**
141 * Debugger console instance data.
142 */
143typedef struct DBGC
144{
145 /** Command helpers. */
146 DBGCCMDHLP CmdHlp;
147 /** Wrappers for DBGF output. */
148 DBGFINFOHLP DbgfOutputHlp;
149 /** Pointer to backend callback structure. */
150 PDBGCBACK pBack;
151
152 /** Pointer to the current VM. */
153 PVM pVM;
154 /** The ID of current virtual CPU. */
155 VMCPUID idCpu;
156 /** The current address space handle. */
157 RTDBGAS hDbgAs;
158 /** The current debugger emulation. */
159 const char *pszEmulation;
160 /** Pointer to the command and functions for the current debugger emulation. */
161 PCDBGCCMD paEmulationCmds;
162 /** The number of commands paEmulationCmds points to. */
163 unsigned cEmulationCmds;
164 /** Log indicator. (If set we're writing the log to the console.) */
165 bool fLog;
166
167 /** Indicates whether we're in guest (true) or hypervisor (false) register context. */
168 bool fRegCtxGuest;
169 /** Indicates whether the register are terse or sparse. */
170 bool fRegTerse;
171 /** Counter use to suppress the printing of the headers. */
172 uint8_t cPagingHierarchyDumps;
173
174 /** Current disassembler position. */
175 DBGCVAR DisasmPos;
176 /** Current source position. (flat GC) */
177 DBGCVAR SourcePos;
178 /** Current memory dump position. */
179 DBGCVAR DumpPos;
180 /** Size of the previous dump element. */
181 unsigned cbDumpElement;
182 /** Points to DisasmPos, SourcePos or DumpPos depending on which was
183 * used last. */
184 PCDBGCVAR pLastPos;
185
186 /** Number of variables in papVars. */
187 unsigned cVars;
188 /** Array of global variables.
189 * Global variables can be referenced using the $ operator and set
190 * and unset using command with those names. */
191 PDBGCNAMEDVAR *papVars;
192
193 /** The list of plug-in. (singly linked) */
194 PDBGCPLUGIN pPlugInHead;
195
196 /** The list of breakpoints. (singly linked) */
197 PDBGCBP pFirstBp;
198
199 /** Save search pattern. */
200 uint8_t abSearch[256];
201 /** The length of the search pattern. */
202 uint32_t cbSearch;
203 /** The search unit */
204 uint32_t cbSearchUnit;
205 /** The max hits. */
206 uint64_t cMaxSearchHits;
207 /** The address to resume searching from. */
208 DBGFADDRESS SearchAddr;
209 /** What's left of the original search range. */
210 RTGCUINTPTR cbSearchRange;
211
212 /** @name Parsing and Execution
213 * @{ */
214
215 /** Input buffer. */
216 char achInput[2048];
217 /** To ease debugging. */
218 unsigned uInputZero;
219 /** Write index in the input buffer. */
220 unsigned iWrite;
221 /** Read index in the input buffer. */
222 unsigned iRead;
223 /** The number of lines in the buffer. */
224 unsigned cInputLines;
225 /** Indicates that we have a buffer overflow condition.
226 * This means that input is ignored up to the next newline. */
227 bool fInputOverflow;
228 /** Indicates whether or we're ready for input. */
229 bool fReady;
230 /** Scratch buffer position. */
231 char *pszScratch;
232 /** Scratch buffer. */
233 char achScratch[16384];
234 /** Argument array position. */
235 unsigned iArg;
236 /** Array of argument variables. */
237 DBGCVAR aArgs[100];
238
239 /** rc from the last dbgcHlpPrintfV(). */
240 int rcOutput;
241 /** The last character we wrote. */
242 char chLastOutput;
243
244 /** rc from the last command. */
245 int rcCmd;
246 /** @} */
247} DBGC;
248/** Pointer to debugger console instance data. */
249typedef DBGC *PDBGC;
250
251/** Converts a Command Helper pointer to a pointer to DBGC instance data. */
252#define DBGC_CMDHLP2DBGC(pCmdHlp) ( (PDBGC)((uintptr_t)(pCmdHlp) - RT_OFFSETOF(DBGC, CmdHlp)) )
253
254
255/**
256 * Chunk of external commands.
257 */
258typedef struct DBGCEXTCMDS
259{
260 /** Number of commands descriptors. */
261 unsigned cCmds;
262 /** Pointer to array of command descriptors. */
263 PCDBGCCMD paCmds;
264 /** Pointer to the next chunk. */
265 struct DBGCEXTCMDS *pNext;
266} DBGCEXTCMDS;
267/** Pointer to chunk of external commands. */
268typedef DBGCEXTCMDS *PDBGCEXTCMDS;
269
270
271
272/**
273 * Unary operator handler function.
274 *
275 * @returns 0 on success.
276 * @returns VBox evaluation / parsing error code on failure.
277 * The caller does the bitching.
278 * @param pDbgc Debugger console instance data.
279 * @param pArg The argument.
280 * @param pResult Where to store the result.
281 */
282typedef DECLCALLBACK(int) FNDBGCOPUNARY(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
283/** Pointer to a unary operator handler function. */
284typedef FNDBGCOPUNARY *PFNDBGCOPUNARY;
285
286
287/**
288 * Binary operator handler function.
289 *
290 * @returns 0 on success.
291 * @returns VBox evaluation / parsing error code on failure.
292 * The caller does the bitching.
293 * @param pDbgc Debugger console instance data.
294 * @param pArg1 The first argument.
295 * @param pArg2 The 2nd argument.
296 * @param pResult Where to store the result.
297 */
298typedef DECLCALLBACK(int) FNDBGCOPBINARY(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
299/** Pointer to a binary operator handler function. */
300typedef FNDBGCOPBINARY *PFNDBGCOPBINARY;
301
302
303/**
304 * Operator descriptor.
305 */
306typedef struct DBGCOP
307{
308 /** Operator mnemonic. */
309 char szName[4];
310 /** Length of name. */
311 const unsigned cchName;
312 /** Whether or not this is a binary operator.
313 * Unary operators are evaluated right-to-left while binary are left-to-right. */
314 bool fBinary;
315 /** Precedence level. */
316 unsigned iPrecedence;
317 /** Unary operator handler. */
318 PFNDBGCOPUNARY pfnHandlerUnary;
319 /** Binary operator handler. */
320 PFNDBGCOPBINARY pfnHandlerBinary;
321 /** The category of the 1st argument.
322 * Set to DBGCVAR_CAT_ANY if anything goes. */
323 DBGCVARCAT enmCatArg1;
324 /** The category of the 2nd argument.
325 * Set to DBGCVAR_CAT_ANY if anything goes. */
326 DBGCVARCAT enmCatArg2;
327 /** Operator description. */
328 const char *pszDescription;
329} DBGCOP;
330/** Pointer to an operator descriptor. */
331typedef DBGCOP *PDBGCOP;
332/** Pointer to a const operator descriptor. */
333typedef const DBGCOP *PCDBGCOP;
334
335
336
337/** Pointer to symbol descriptor. */
338typedef struct DBGCSYM *PDBGCSYM;
339/** Pointer to const symbol descriptor. */
340typedef const struct DBGCSYM *PCDBGCSYM;
341
342/**
343 * Get builtin symbol.
344 *
345 * @returns 0 on success.
346 * @returns VBox evaluation / parsing error code on failure.
347 * The caller does the bitching.
348 * @param pSymDesc Pointer to the symbol descriptor.
349 * @param pCmdHlp Pointer to the command callback structure.
350 * @param enmType The result type.
351 * @param pResult Where to store the result.
352 */
353typedef DECLCALLBACK(int) FNDBGCSYMGET(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, DBGCVARTYPE enmType, PDBGCVAR pResult);
354/** Pointer to get function for a builtin symbol. */
355typedef FNDBGCSYMGET *PFNDBGCSYMGET;
356
357/**
358 * Set builtin symbol.
359 *
360 * @returns 0 on success.
361 * @returns VBox evaluation / parsing error code on failure.
362 * The caller does the bitching.
363 * @param pSymDesc Pointer to the symbol descriptor.
364 * @param pCmdHlp Pointer to the command callback structure.
365 * @param pValue The value to assign the symbol.
366 */
367typedef DECLCALLBACK(int) FNDBGCSYMSET(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, PCDBGCVAR pValue);
368/** Pointer to set function for a builtin symbol. */
369typedef FNDBGCSYMSET *PFNDBGCSYMSET;
370
371
372/**
373 * Symbol description (for builtin symbols).
374 */
375typedef struct DBGCSYM
376{
377 /** Symbol name. */
378 const char *pszName;
379 /** Get function. */
380 PFNDBGCSYMGET pfnGet;
381 /** Set function. (NULL if readonly) */
382 PFNDBGCSYMSET pfnSet;
383 /** User data. */
384 unsigned uUser;
385} DBGCSYM;
386
387
388/*******************************************************************************
389* Internal Functions *
390*******************************************************************************/
391int dbgcBpAdd(PDBGC pDbgc, RTUINT iBp, const char *pszCmd);
392int dbgcBpUpdate(PDBGC pDbgc, RTUINT iBp, const char *pszCmd);
393int dbgcBpDelete(PDBGC pDbgc, RTUINT iBp);
394PDBGCBP dbgcBpGet(PDBGC pDbgc, RTUINT iBp);
395int dbgcBpExec(PDBGC pDbgc, RTUINT iBp);
396
397void dbgcEvalInit(void);
398int dbgcEvalSub(PDBGC pDbgc, char *pszExpr, size_t cchExpr, DBGCVARCAT enmCategory, PDBGCVAR pResult);
399int dbgcEvalCommand(PDBGC pDbgc, char *pszCmd, size_t cchCmd, bool fNoExecute);
400
401int dbgcSymbolGet(PDBGC pDbgc, const char *pszSymbol, DBGCVARTYPE enmType, PDBGCVAR pResult);
402PCDBGCSYM dbgcLookupRegisterSymbol(PDBGC pDbgc, const char *pszSymbol);
403PCDBGCOP dbgcOperatorLookup(PDBGC pDbgc, const char *pszExpr, bool fPreferBinary, char chPrev);
404PCDBGCCMD dbgcRoutineLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal);
405
406DECLCALLBACK(int) dbgcOpRegister(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
407DECLCALLBACK(int) dbgcOpAddrFlat(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
408DECLCALLBACK(int) dbgcOpAddrHost(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
409DECLCALLBACK(int) dbgcOpAddrPhys(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
410DECLCALLBACK(int) dbgcOpAddrHostPhys(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
411
412void dbgcInitCmdHlp(PDBGC pDbgc);
413
414void dbgcPlugInAutoLoad(PDBGC pDbgc);
415void dbgcPlugInUnloadAll(PDBGC pDbgc);
416
417/* For tstDBGCParser: */
418int dbgcCreate(PDBGC *ppDbgc, PDBGCBACK pBack, unsigned fFlags);
419int dbgcRun(PDBGC pDbgc);
420int dbgcProcessInput(PDBGC pDbgc, bool fNoExecute);
421void dbgcDestroy(PDBGC pDbgc);
422
423
424/*******************************************************************************
425* Global Variables *
426*******************************************************************************/
427extern const DBGCCMD g_aCmds[];
428extern const unsigned g_cCmds;
429extern const DBGCCMD g_aCmdsCodeView[];
430extern const unsigned g_cCmdsCodeView;
431extern const DBGCOP g_aOps[];
432extern const unsigned g_cOps;
433
434
435#endif
436
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette