VirtualBox

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

Last change on this file since 35650 was 35637, checked in by vboxsync, 14 years ago

Debugger console: Made the evaluator a bit smarter wrt to the register and variable operators (e.g. don't confuse @ah with a hexadecimal number).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.7 KB
Line 
1/* $Id: DBGCInternal.h 35637 2011-01-19 17:42: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 RTUINT 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 /** rc from the last command. */
242 int rcCmd;
243 /** @} */
244} DBGC;
245/** Pointer to debugger console instance data. */
246typedef DBGC *PDBGC;
247
248/** Converts a Command Helper pointer to a pointer to DBGC instance data. */
249#define DBGC_CMDHLP2DBGC(pCmdHlp) ( (PDBGC)((uintptr_t)(pCmdHlp) - RT_OFFSETOF(DBGC, CmdHlp)) )
250
251
252/**
253 * Chunk of external commands.
254 */
255typedef struct DBGCEXTCMDS
256{
257 /** Number of commands descriptors. */
258 unsigned cCmds;
259 /** Pointer to array of command descriptors. */
260 PCDBGCCMD paCmds;
261 /** Pointer to the next chunk. */
262 struct DBGCEXTCMDS *pNext;
263} DBGCEXTCMDS;
264/** Pointer to chunk of external commands. */
265typedef DBGCEXTCMDS *PDBGCEXTCMDS;
266
267
268
269/**
270 * Unary operator handler function.
271 *
272 * @returns 0 on success.
273 * @returns VBox evaluation / parsing error code on failure.
274 * The caller does the bitching.
275 * @param pDbgc Debugger console instance data.
276 * @param pArg The argument.
277 * @param pResult Where to store the result.
278 */
279typedef DECLCALLBACK(int) FNDBGCOPUNARY(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
280/** Pointer to a unary operator handler function. */
281typedef FNDBGCOPUNARY *PFNDBGCOPUNARY;
282
283
284/**
285 * Binary operator handler function.
286 *
287 * @returns 0 on success.
288 * @returns VBox evaluation / parsing error code on failure.
289 * The caller does the bitching.
290 * @param pDbgc Debugger console instance data.
291 * @param pArg1 The first argument.
292 * @param pArg2 The 2nd argument.
293 * @param pResult Where to store the result.
294 */
295typedef DECLCALLBACK(int) FNDBGCOPBINARY(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
296/** Pointer to a binary operator handler function. */
297typedef FNDBGCOPBINARY *PFNDBGCOPBINARY;
298
299
300/**
301 * Operator descriptor.
302 */
303typedef struct DBGCOP
304{
305 /** Operator mnemonic. */
306 char szName[4];
307 /** Length of name. */
308 const unsigned cchName;
309 /** Whether or not this is a binary operator.
310 * Unary operators are evaluated right-to-left while binary are left-to-right. */
311 bool fBinary;
312 /** Precedence level. */
313 unsigned iPrecedence;
314 /** Unary operator handler. */
315 PFNDBGCOPUNARY pfnHandlerUnary;
316 /** Binary operator handler. */
317 PFNDBGCOPBINARY pfnHandlerBinary;
318 /** The category of the 1st argument.
319 * Set to DBGCVAR_CAT_ANY if anything goes. */
320 DBGCVARCAT enmCatArg1;
321 /** The category of the 2nd argument.
322 * Set to DBGCVAR_CAT_ANY if anything goes. */
323 DBGCVARCAT enmCatArg2;
324 /** Operator description. */
325 const char *pszDescription;
326} DBGCOP;
327/** Pointer to an operator descriptor. */
328typedef DBGCOP *PDBGCOP;
329/** Pointer to a const operator descriptor. */
330typedef const DBGCOP *PCDBGCOP;
331
332
333
334/** Pointer to symbol descriptor. */
335typedef struct DBGCSYM *PDBGCSYM;
336/** Pointer to const symbol descriptor. */
337typedef const struct DBGCSYM *PCDBGCSYM;
338
339/**
340 * Get builtin symbol.
341 *
342 * @returns 0 on success.
343 * @returns VBox evaluation / parsing error code on failure.
344 * The caller does the bitching.
345 * @param pSymDesc Pointer to the symbol descriptor.
346 * @param pCmdHlp Pointer to the command callback structure.
347 * @param enmType The result type.
348 * @param pResult Where to store the result.
349 */
350typedef DECLCALLBACK(int) FNDBGCSYMGET(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, DBGCVARTYPE enmType, PDBGCVAR pResult);
351/** Pointer to get function for a builtin symbol. */
352typedef FNDBGCSYMGET *PFNDBGCSYMGET;
353
354/**
355 * Set builtin symbol.
356 *
357 * @returns 0 on success.
358 * @returns VBox evaluation / parsing error code on failure.
359 * The caller does the bitching.
360 * @param pSymDesc Pointer to the symbol descriptor.
361 * @param pCmdHlp Pointer to the command callback structure.
362 * @param pValue The value to assign the symbol.
363 */
364typedef DECLCALLBACK(int) FNDBGCSYMSET(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, PCDBGCVAR pValue);
365/** Pointer to set function for a builtin symbol. */
366typedef FNDBGCSYMSET *PFNDBGCSYMSET;
367
368
369/**
370 * Symbol description (for builtin symbols).
371 */
372typedef struct DBGCSYM
373{
374 /** Symbol name. */
375 const char *pszName;
376 /** Get function. */
377 PFNDBGCSYMGET pfnGet;
378 /** Set function. (NULL if readonly) */
379 PFNDBGCSYMSET pfnSet;
380 /** User data. */
381 unsigned uUser;
382} DBGCSYM;
383
384
385/*******************************************************************************
386* Internal Functions *
387*******************************************************************************/
388int dbgcBpAdd(PDBGC pDbgc, RTUINT iBp, const char *pszCmd);
389int dbgcBpUpdate(PDBGC pDbgc, RTUINT iBp, const char *pszCmd);
390int dbgcBpDelete(PDBGC pDbgc, RTUINT iBp);
391PDBGCBP dbgcBpGet(PDBGC pDbgc, RTUINT iBp);
392int dbgcBpExec(PDBGC pDbgc, RTUINT iBp);
393
394void dbgcVarInit(PDBGCVAR pVar);
395void dbgcVarSetGCFlat(PDBGCVAR pVar, RTGCPTR GCFlat);
396void dbgcVarSetGCFlatByteRange(PDBGCVAR pVar, RTGCPTR GCFlat, uint64_t cb);
397void dbgcVarSetU64(PDBGCVAR pVar, uint64_t u64);
398void dbgcVarSetVar(PDBGCVAR pVar, PCDBGCVAR pVar2);
399void dbgcVarSetDbgfAddr(PDBGCVAR pVar, PCDBGFADDRESS pAddress);
400void dbgcVarSetNoRange(PDBGCVAR pVar);
401void dbgcVarSetByteRange(PDBGCVAR pVar, uint64_t cb);
402int dbgcVarToDbgfAddr(PDBGC pDbgc, PCDBGCVAR pVar, PDBGFADDRESS pAddress);
403
404void dbgcEvalInit(void);
405int dbgcEvalSub(PDBGC pDbgc, char *pszExpr, size_t cchExpr, DBGCVARCAT enmCategory, PDBGCVAR pResult);
406int dbgcEvalCommand(PDBGC pDbgc, char *pszCmd, size_t cchCmd, bool fNoExecute);
407
408int dbgcSymbolGet(PDBGC pDbgc, const char *pszSymbol, DBGCVARTYPE enmType, PDBGCVAR pResult);
409PCDBGCSYM dbgcLookupRegisterSymbol(PDBGC pDbgc, const char *pszSymbol);
410PCDBGCOP dbgcOperatorLookup(PDBGC pDbgc, const char *pszExpr, bool fPreferBinary, char chPrev);
411PCDBGCCMD dbgcRoutineLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal);
412
413DECLCALLBACK(int) dbgcOpRegister(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
414DECLCALLBACK(int) dbgcOpAddrFlat(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
415DECLCALLBACK(int) dbgcOpAddrHost(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
416DECLCALLBACK(int) dbgcOpAddrPhys(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
417DECLCALLBACK(int) dbgcOpAddrHostPhys(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
418
419void dbgcInitCmdHlp(PDBGC pDbgc);
420
421void dbgcPlugInAutoLoad(PDBGC pDbgc);
422void dbgcPlugInUnloadAll(PDBGC pDbgc);
423
424/* For tstDBGCParser: */
425int dbgcCreate(PDBGC *ppDbgc, PDBGCBACK pBack, unsigned fFlags);
426int dbgcRun(PDBGC pDbgc);
427int dbgcProcessInput(PDBGC pDbgc, bool fNoExecute);
428void dbgcDestroy(PDBGC pDbgc);
429
430
431/*******************************************************************************
432* Global Variables *
433*******************************************************************************/
434extern const DBGCCMD g_aCmds[];
435extern const unsigned g_cCmds;
436extern const DBGCCMD g_aCmdsCodeView[];
437extern const unsigned g_cCmdsCodeView;
438extern const DBGCOP g_aOps[];
439extern const unsigned g_cOps;
440
441
442#endif
443
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