VirtualBox

source: vbox/trunk/include/iprt/dbg.h@ 19944

Last change on this file since 19944 was 19757, checked in by vboxsync, 16 years ago

VMM,IPRT,DBGC: Debug address spaces.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.6 KB
Line 
1/* $Id: dbg.h 19757 2009-05-15 23:37:31Z vboxsync $ */
2/** @file
3 * IPRT - Debugging Routines.
4 */
5
6/*
7 * Copyright (C) 2008-2009 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22#ifndef ___iprt_dbg_h
23#define ___iprt_dbg_h
24
25#include <iprt/types.h>
26#include <iprt/stdarg.h>
27
28__BEGIN_DECLS
29
30/** @defgroup grp_rt_dbg RTDbg - Debugging Routines
31 * @ingroup grp_rt
32 * @{
33 */
34
35
36/** Debug segment index. */
37typedef uint32_t RTDBGSEGIDX;
38/** Pointer to a debug segment index. */
39typedef RTDBGSEGIDX *PRTDBGSEGIDX;
40/** Pointer to a const debug segment index. */
41typedef RTDBGSEGIDX const *PCRTDBGSEGIDX;
42/** NIL debug segment index. */
43#define NIL_RTDBGSEGIDX UINT32_C(0xffffffff)
44/** The last normal segment index. */
45#define RTDBGSEGIDX_LAST UINT32_C(0xffffffef)
46/** Special segment index that indicates that the offset is a relative
47 * virtual address (RVA). I.e. an offset from the start of the module. */
48#define RTDBGSEGIDX_RVA UINT32_C(0xfffffff0)
49/** Special segment index that indicates that the offset is a absolute. */
50#define RTDBGSEGIDX_ABS UINT32_C(0xfffffff1)
51
52/** Max length (including '\\0') of a symbol name. */
53#define RTDBG_SYMBOL_NAME_LENGTH (512 - 8 - 4 - 4 - 4)
54
55/**
56 * Debug symbol.
57 */
58typedef struct RTDBGSYMBOL
59{
60 /** Symbol value (address). */
61 RTUINTPTR Value;
62 /** Segment number when applicable or NIL_RTDBGSEGIDX. */
63 RTDBGSEGIDX iSeg;
64 /** Symbol size. */
65 uint32_t cb;
66 /** Symbol Flags. (reserved). */
67 uint32_t fFlags;
68 /** Symbol name. */
69 char szName[RTDBG_SYMBOL_NAME_LENGTH];
70} RTDBGSYMBOL;
71/** Pointer to debug symbol. */
72typedef RTDBGSYMBOL *PRTDBGSYMBOL;
73/** Pointer to const debug symbol. */
74typedef const RTDBGSYMBOL *PCRTDBGSYMBOL;
75
76RTDECL(PRTDBGSYMBOL) RTDbgSymbolAlloc(void);
77RTDECL(PRTDBGSYMBOL) RTDbgSymbolDup(PCRTDBGSYMBOL pSymbol);
78RTDECL(void) RTDbgSymbolFree(PRTDBGSYMBOL pSymbol);
79
80
81/**
82 * Debug line number information.
83 */
84typedef struct RTDBGLINE
85{
86 /** Address. */
87 RTUINTPTR Address;
88 /** Segment number when applicable or NIL_RTDBGSEGIDX. */
89 RTDBGSEGIDX iSeg;
90 /** Line number. */
91 uint32_t uLineNo;
92 /** Filename. */
93 char szFilename[260];
94} RTDBGLINE;
95/** Pointer to debug line number. */
96typedef RTDBGLINE *PRTDBGLINE;
97/** Pointer to const debug line number. */
98typedef const RTDBGLINE *PCRTDBGLINE;
99
100RTDECL(PRTDBGLINE) RTDbgLineAlloc(void);
101RTDECL(PRTDBGLINE) RTDbgLineDup(PCRTDBGLINE pLine);
102RTDECL(void) RTDbgLineFree(PRTDBGLINE pLine);
103
104
105/** @defgroup grp_rt_dbgas RTDbgAs - Debug Address Space
106 * @{
107 */
108
109/**
110 * Creates an empty address space.
111 *
112 * @returns IPRT status code.
113 *
114 * @param phDbgAs Where to store the address space handle on success.
115 * @param FirstAddr The first address in the address space.
116 * @param LastAddr The last address in the address space.
117 * @param pszName The name of the address space.
118 */
119RTDECL(int) RTDbgAsCreate(PRTDBGAS phDbgAs, RTUINTPTR FirstAddr, RTUINTPTR LastAddr, const char *pszName);
120
121/**
122 * Variant of RTDbgAsCreate that takes a name format string.
123 *
124 * @returns IPRT status code.
125 *
126 * @param phDbgAs Where to store the address space handle on success.
127 * @param FirstAddr The first address in the address space.
128 * @param LastAddr The last address in the address space.
129 * @param pszNameFmt The name format of the address space.
130 * @param va Format arguments.
131 */
132RTDECL(int) RTDbgAsCreateV(PRTDBGAS phDbgAs, RTUINTPTR FirstAddr, RTUINTPTR LastAddr, const char *pszNameFmt, va_list va);
133
134/**
135 * Variant of RTDbgAsCreate that takes a name format string.
136 *
137 * @returns IPRT status code.
138 *
139 * @param phDbgAs Where to store the address space handle on success.
140 * @param FirstAddr The first address in the address space.
141 * @param LastAddr The last address in the address space.
142 * @param pszNameFmt The name format of the address space.
143 * @param ... Format arguments.
144 */
145RTDECL(int) RTDbgAsCreateF(PRTDBGAS phDbgAs, RTUINTPTR FirstAddr, RTUINTPTR LastAddr, const char *pszNameFmt, ...);
146
147/**
148 * Retains a reference to the address space.
149 *
150 * @returns New reference count, UINT32_MAX on invalid handle (asserted).
151 *
152 * @param hDbgAs The address space handle.
153 *
154 * @remarks Will not take any locks.
155 */
156RTDECL(uint32_t) RTDbgAsRetain(RTDBGAS hDbgAs);
157
158/**
159 * Release a reference to the address space.
160 *
161 * When the reference count reaches zero, the address space is destroyed.
162 * That means unlinking all the modules it currently contains, potentially
163 * causing some or all of them to be destroyed as they are managed by
164 * reference counting.
165 *
166 * @returns New reference count, UINT32_MAX on invalid handle (asserted).
167 *
168 * @param hDbgAs The address space handle. The NIL handle is quietly
169 * ignored and 0 is returned.
170 *
171 * @remarks Will not take any locks.
172 */
173RTDECL(uint32_t) RTDbgAsRelease(RTDBGAS hDbgAs);
174
175/**
176 * Gets the name of an address space.
177 *
178 * @returns read only address space name.
179 * NULL if hDbgAs is invalid.
180 *
181 * @param hDbgAs The address space handle.
182 *
183 * @remarks Will not take any locks.
184 */
185RTDECL(const char *) RTDbgAsName(RTDBGAS hDbgAs);
186
187/**
188 * Gets the first address in an address space.
189 *
190 * @returns The address.
191 * 0 if hDbgAs is invalid.
192 *
193 * @param hDbgAs The address space handle.
194 *
195 * @remarks Will not take any locks.
196 */
197RTDECL(RTUINTPTR) RTDbgAsFirstAddr(RTDBGAS hDbgAs);
198
199/**
200 * Gets the last address in an address space.
201 *
202 * @returns The address.
203 * 0 if hDbgAs is invalid.
204 *
205 * @param hDbgAs The address space handle.
206 *
207 * @remarks Will not take any locks.
208 */
209RTDECL(RTUINTPTR) RTDbgAsLastAddr(RTDBGAS hDbgAs);
210
211/**
212 * Gets the number of modules in the address space.
213 *
214 * This can be used together with RTDbgAsModuleByIndex
215 * to enumerate the modules.
216 *
217 * @returns The number of modules.
218 *
219 * @param hDbgAs The address space handle.
220 *
221 * @remarks Will not take any locks.
222 */
223RTDECL(uint32_t) RTDbgAsModuleCount(RTDBGAS hDbgAs);
224
225/** @name Flags for RTDbgAsModuleLink and RTDbgAsModuleLinkSeg
226 * @{ */
227/** Replace all conflicting module.
228 * (The conflicting modules will be removed the address space and their
229 * references released.) */
230#define RTDBGASLINK_FLAGS_REPLACE RT_BIT_32(0)
231/** Mask containing the valid flags. */
232#define RTDBGASLINK_FLAGS_VALID_MASK UINT32_C(0x00000001)
233/** @} */
234
235/**
236 * Links a module into the address space at the give address.
237 *
238 * The size of the mapping is determined using RTDbgModImageSize().
239 *
240 * @returns IPRT status code.
241 * @retval VERR_OUT_OF_RANGE if the specified address will put the module
242 * outside the address space.
243 * @retval VERR_ADDRESS_CONFLICT if the mapping clashes with existing mappings.
244 *
245 * @param hDbgAs The address space handle.
246 * @param hDbgMod The module handle of the module to be linked in.
247 * @param ImageAddr The address to link the module at.
248 * @param fFlags See RTDBGASLINK_FLAGS_*.
249 */
250RTDECL(int) RTDbgAsModuleLink(RTDBGAS hDbgAs, RTDBGMOD hDbgMod, RTUINTPTR ImageAddr, uint32_t fFlags);
251
252/**
253 * Links a segment into the address space at the give address.
254 *
255 * The size of the mapping is determined using RTDbgModSegmentSize().
256 *
257 * @returns IPRT status code.
258 * @retval VERR_OUT_OF_RANGE if the specified address will put the module
259 * outside the address space.
260 * @retval VERR_ADDRESS_CONFLICT if the mapping clashes with existing mappings.
261 *
262 * @param hDbgAs The address space handle.
263 * @param hDbgMod The module handle.
264 * @param iSeg The segment number (0-based) of the segment to be
265 * linked in.
266 * @param SegAddr The address to link the segment at.
267 * @param fFlags See RTDBGASLINK_FLAGS_*.
268 */
269RTDECL(int) RTDbgAsModuleLinkSeg(RTDBGAS hDbgAs, RTDBGMOD hDbgMod, RTDBGSEGIDX iSeg, RTUINTPTR SegAddr, uint32_t fFlags);
270
271/**
272 * Unlinks all the mappings of a module from the address space.
273 *
274 * @returns IPRT status code.
275 * @retval VERR_NOT_FOUND if the module wasn't found.
276 *
277 * @param hDbgAs The address space handle.
278 * @param hDbgMod The module handle of the module to be unlinked.
279 */
280RTDECL(int) RTDbgAsModuleUnlink(RTDBGAS hDbgAs, RTDBGMOD hDbgMod);
281
282/**
283 * Unlinks the mapping at the specified address.
284 *
285 * @returns IPRT status code.
286 * @retval VERR_NOT_FOUND if no module or segment is mapped at that address.
287 *
288 * @param hDbgAs The address space handle.
289 * @param Addr The address within the mapping to be unlinked.
290 */
291RTDECL(int) RTDbgAsModuleUnlinkByAddr(RTDBGAS hDbgAs, RTUINTPTR Addr);
292
293/**
294 * Get a the handle of a module in the address space by is index.
295 *
296 * @returns A retained handle to the specified module. The caller must release
297 * the returned reference.
298 * NIL_RTDBGMOD if invalid index or handle.
299 *
300 * @param hDbgAs The address space handle.
301 * @param iModule The index of the module to get.
302 *
303 * @remarks The module indexes may change after calls to RTDbgAsModuleLink,
304 * RTDbgAsModuleLinkSeg, RTDbgAsModuleUnlink and
305 * RTDbgAsModuleUnlinkByAddr.
306 */
307RTDECL(RTDBGMOD) RTDbgAsModuleByIndex(RTDBGAS hDbgAs, uint32_t iModule);
308
309/**
310 * Queries mapping module information by handle.
311 *
312 * @returns IPRT status code.
313 * @retval VERR_NOT_FOUND if no mapping was found at the specified address.
314 *
315 * @param hDbgAs The address space handle.
316 * @param Addr Address within the mapping of the module or segment.
317 * @param phMod Where to the return the retained module handle.
318 * Optional.
319 * @param pAddr Where to return the base address of the mapping.
320 * Optional.
321 * @param piSeg Where to return the segment index. This is set to
322 * NIL if the entire module is mapped as a single
323 * mapping. Optional.
324 */
325RTDECL(int) RTDbgAsModuleByAddr(RTDBGAS hDbgAs, RTUINTPTR Addr, PRTDBGMOD phMod, PRTUINTPTR pAddr, PRTDBGSEGIDX piSeg);
326
327/**
328 * Queries mapping module information by name.
329 *
330 * @returns IPRT status code.
331 * @retval VERR_NOT_FOUND if no mapping was found at the specified address.
332 * @retval VERR_OUT_OF_RANGE if the name index was out of range.
333 *
334 * @param hDbgAs The address space handle.
335 * @param pszName The module name.
336 * @param iName There can be more than one module by the same name
337 * in an address space. This argument indicates which
338 * is ment. (0 based)
339 * @param phMod Where to the return the retained module handle.
340 */
341RTDECL(int) RTDbgAsModuleByName(RTDBGAS hDbgAs, const char *pszName, uint32_t iName, PRTDBGMOD phMod);
342
343/**
344 * Adds a symbol to a module in the address space.
345 *
346 * @returns IPRT status code. See RTDbgModSymbolAdd for more specific ones.
347 * @retval VERR_INVALID_HANDLE if hDbgAs is invalid.
348 * @retval VERR_NOT_FOUND if no module was found at the specified address.
349 *
350 * @param hDbgAs The address space handle.
351 * @param pszSymbol The symbol name.
352 * @param Addr The address of the symbol.
353 * @param cb The size of the symbol.
354 */
355RTDECL(int) RTDbgAsSymbolAdd(RTDBGAS hDbgAs, const char *pszSymbol, RTUINTPTR Addr, uint32_t cb);
356
357/**
358 * Query a symbol by address.
359 *
360 * @returns IPRT status code. See RTDbgModSymbolAddr for more specific ones.
361 * @retval VERR_INVALID_HANDLE if hDbgAs is invalid.
362 * @retval VERR_NOT_FOUND if the address couldn't be mapped to a module.
363 *
364 * @param hDbgAs The address space handle.
365 * @param Addr The address which closest symbol is requested.
366 * @param poffDisp Where to return the distance between the symbol
367 * and address. Optional.
368 * @param pSymbol Where to return the symbol info.
369 */
370RTDECL(int) RTDbgAsSymbolByAddr(RTDBGAS hDbgAs, RTUINTPTR Addr, PRTINTPTR poffDisp, PRTDBGSYMBOL pSymbol);
371
372/**
373 * Query a symbol by address.
374 *
375 * @returns IPRT status code. See RTDbgModSymbolAddrA for more specific ones.
376 * @retval VERR_INVALID_HANDLE if hDbgAs is invalid.
377 * @retval VERR_NOT_FOUND if the address couldn't be mapped to a module.
378 *
379 * @param hDbgAs The address space handle.
380 * @param Addr The address which closest symbol is requested.
381 * @param poffDisp Where to return the distance between the symbol
382 * and address. Optional.
383 * @param ppSymbol Where to return the pointer to the allocated
384 * symbol info. Always set. Free with RTDbgSymbolFree.
385 */
386RTDECL(int) RTDbgAsSymbolByAddrA(RTDBGAS hDbgAs, RTUINTPTR Addr, PRTINTPTR poffDisp, PRTDBGSYMBOL *ppSymbol);
387
388/**
389 * Query a symbol by name.
390 *
391 * @returns IPRT status code.
392 * @retval VERR_SYMBOL_NOT_FOUND if not found.
393 *
394 * @param hDbgAs The address space handle.
395 * @param pszSymbol The symbol name.
396 * @param pSymbol Where to return the symbol info.
397 */
398RTDECL(int) RTDbgAsSymbolByName(RTDBGAS hDbgAs, const char *pszSymbol, PRTDBGSYMBOL pSymbol);
399
400/**
401 * Query a symbol by name.
402 *
403 * @returns IPRT status code.
404 * @retval VERR_SYMBOL_NOT_FOUND if not found.
405 *
406 * @param hDbgAs The address space handle.
407 * @param pszSymbol The symbol name.
408 * @param ppSymbol Where to return the pointer to the allocated
409 * symbol info. Always set. Free with RTDbgSymbolFree.
410 */
411RTDECL(int) RTDbgAsSymbolByNameA(RTDBGAS hDbgAs, const char *pszSymbol, PRTDBGSYMBOL *ppSymbol);
412
413/**
414 * Query a line number by address.
415 *
416 * @returns IPRT status code. See RTDbgModSymbolAddrA for more specific ones.
417 * @retval VERR_INVALID_HANDLE if hDbgAs is invalid.
418 * @retval VERR_NOT_FOUND if the address couldn't be mapped to a module.
419 *
420 * @param hDbgAs The address space handle.
421 * @param Addr The address which closest symbol is requested.
422 * @param poffDisp Where to return the distance between the line
423 * number and address.
424 * @param pLine Where to return the line number information.
425 */
426RTDECL(int) RTDbgAs(RTDBGAS hDbgAs, RTUINTPTR Addr, PRTINTPTR poffDisp, PRTDBGLINE pLine);
427
428/**
429 * Query a line number by address.
430 *
431 * @returns IPRT status code. See RTDbgModSymbolAddrA for more specific ones.
432 * @retval VERR_INVALID_HANDLE if hDbgAs is invalid.
433 * @retval VERR_NOT_FOUND if the address couldn't be mapped to a module.
434 *
435 * @param hDbgAs The address space handle.
436 * @param Addr The address which closest symbol is requested.
437 * @param poffDisp Where to return the distance between the line
438 * number and address.
439 * @param ppLine Where to return the pointer to the allocated line
440 * number info. Always set. Free with RTDbgLineFree.
441 */
442RTDECL(int) RTDbgAsLineByAddrA(RTDBGAS hDbgAs, RTUINTPTR Addr, PRTINTPTR poffDisp, PRTDBGLINE *ppLine);
443
444/** @todo Missing some bits here. */
445
446/** @} */
447
448
449/** @defgroup grp_rt_dbgmod RTDbgMod - Debug Module Interpreter
450 * @{
451 */
452RTDECL(int) RTDbgModCreate(PRTDBGMOD phDbgMod, const char *pszName, RTUINTPTR cb, uint32_t fFlags);
453RTDECL(int) RTDbgModCreateFromImage(PRTDBGMOD phDbgMod, const char *pszFilename, const char *pszName, uint32_t fFlags);
454RTDECL(int) RTDbgModCreateFromMap(PRTDBGMOD phDbgMod, const char *pszFilename, const char *pszName, RTUINTPTR uSubtrahend, uint32_t fFlags);
455RTDECL(uint32_t) RTDbgModRetain(RTDBGMOD hDbgMod);
456RTDECL(uint32_t) RTDbgModRelease(RTDBGMOD hDbgMod);
457RTDECL(const char *) RTDbgModName(RTDBGMOD hDbgMod);
458RTDECL(RTUINTPTR) RTDbgModImageSize(RTDBGMOD hDbgMod);
459RTDECL(RTUINTPTR) RTDbgModSegmentSize(RTDBGMOD hDbgMod, RTDBGSEGIDX iSeg);
460RTDECL(RTDBGSEGIDX) RTDbgModSegmentCount(RTDBGMOD hDbgMod);
461
462RTDECL(int) RTDbgModSymbolAdd(RTDBGMOD hDbgMod, const char *pszSymbol, RTDBGSEGIDX iSeg, RTUINTPTR off, uint32_t cb);
463RTDECL(uint32_t) RTDbgModSymbolCount(RTDBGMOD hDbgMod);
464RTDECL(int) RTDbgModSymbolByIndex(RTDBGMOD hDbgMod, uint32_t iSymbol, PRTDBGSYMBOL pSymbol);
465RTDECL(int) RTDbgModSymbolByAddr(RTDBGMOD hDbgMod, RTDBGSEGIDX iSeg, RTUINTPTR off, PRTINTPTR poffDisp, PRTDBGSYMBOL pSymbol);
466RTDECL(int) RTDbgModSymbolByAddrA(RTDBGMOD hDbgMod, RTDBGSEGIDX iSeg, RTUINTPTR off, PRTINTPTR poffDisp, PRTDBGSYMBOL *ppSymbol);
467RTDECL(int) RTDbgModSymbolByName(RTDBGMOD hDbgMod, const char *pszSymbol, PRTDBGSYMBOL pSymbol);
468RTDECL(int) RTDbgModSymbolByNameA(RTDBGMOD hDbgMod, const char *pszSymbol, PRTDBGSYMBOL *ppSymbol);
469
470RTDECL(int) RTDbgModLineByAddr(RTDBGMOD hDbgMod, RTDBGSEGIDX iSeg, RTUINTPTR off, PRTINTPTR poffDisp, PRTDBGLINE pLine);
471RTDECL(int) RTDbgModLineByAddrA(RTDBGMOD hDbgMod, RTDBGSEGIDX iSeg, RTUINTPTR off, PRTINTPTR poffDisp, PRTDBGLINE *ppLine);
472/** @} */
473
474/** @} */
475
476__END_DECLS
477
478#endif
479
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