VirtualBox

source: vbox/trunk/src/VBox/Debugger/VBoxDbg.cpp@ 93468

Last change on this file since 93468 was 93468, checked in by vboxsync, 3 years ago

VBoxDbg,VMM/STAM,Main: Converted VBoxDbg to use the VMM function table, extending the STAMR3Enum to include the unit string to avoid needing to call STAMR3GetUnit a lot. The latter would better fit with the XML based viewer, as it only gets the string version of the unit. Had to adjust a user of STAMR3Enum in Main. bugref:10074

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.3 KB
Line 
1/* $Id: VBoxDbg.cpp 93468 2022-01-27 21:17:12Z vboxsync $ */
2/** @file
3 * VBox Debugger GUI.
4 */
5
6/*
7 * Copyright (C) 2006-2022 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/*********************************************************************************************************************************
20* Header Files *
21*********************************************************************************************************************************/
22#define LOG_GROUP LOG_GROUP_DBGG
23#define VBOX_COM_NO_ATL
24#ifdef RT_OS_WINDOWS
25# include <iprt/win/windows.h> /* Include via cleanup wrapper before VirtualBox.h includes it via rpc.h. */
26# include <VirtualBox.h>
27#else /* !RT_OS_WINDOWS */
28# include <VirtualBox_XPCOM.h>
29#endif /* !RT_OS_WINDOWS */
30#include <VBox/dbggui.h>
31#include <iprt/errcore.h>
32#include <iprt/assert.h>
33#include <iprt/alloc.h>
34
35#include "VBoxDbgGui.h"
36
37
38/*********************************************************************************************************************************
39* Structures and Typedefs *
40*********************************************************************************************************************************/
41/**
42 * Debugger GUI instance data.
43 */
44typedef struct DBGGUI
45{
46 /** Magic number (DBGGUI_MAGIC). */
47 uint32_t u32Magic;
48 /** Pointer to the Debugger GUI manager object. */
49 VBoxDbgGui *pVBoxDbgGui;
50} DBGGUI;
51
52/** DBGGUI magic value (Werner Heisenberg). */
53#define DBGGUI_MAGIC 0x19011205
54/** Invalid DBGGUI magic value. */
55#define DBGGUI_MAGIC_DEAD 0x19760201
56
57
58/*********************************************************************************************************************************
59* Global Variables *
60*********************************************************************************************************************************/
61/** Virtual method table for simplifying dynamic linking. */
62static const DBGGUIVT g_dbgGuiVT =
63{
64 DBGGUIVT_VERSION,
65 DBGGuiDestroy,
66 DBGGuiAdjustRelativePos,
67 DBGGuiShowStatistics,
68 DBGGuiShowCommandLine,
69 DBGGuiSetParent,
70 DBGGuiSetMenu,
71 DBGGUIVT_VERSION
72};
73
74
75/**
76 * Internal worker for DBGGuiCreate and DBGGuiCreateForVM.
77 *
78 * @returns VBox status code.
79 * @param pSession The ISession interface. (DBGGuiCreate)
80 * @param pUVM The VM handle. (DBGGuiCreateForVM)
81 * @param pVMM The VMM function table.
82 * @param ppGui See DBGGuiCreate.
83 * @param ppGuiVT See DBGGuiCreate.
84 */
85static int dbgGuiCreate(ISession *pSession, PUVM pUVM, PCVMMR3VTABLE pVMM, PDBGGUI *ppGui, PCDBGGUIVT *ppGuiVT)
86{
87 /*
88 * Allocate and initialize the Debugger GUI handle.
89 */
90 PDBGGUI pGui = (PDBGGUI)RTMemAlloc(sizeof(*pGui));
91 if (!pGui)
92 return VERR_NO_MEMORY;
93 pGui->u32Magic = DBGGUI_MAGIC;
94 pGui->pVBoxDbgGui = new VBoxDbgGui();
95
96 int rc;
97 if (pSession)
98 rc = pGui->pVBoxDbgGui->init(pSession);
99 else
100 rc = pGui->pVBoxDbgGui->init(pUVM, pVMM);
101 if (RT_SUCCESS(rc))
102 {
103 /*
104 * Successfully initialized.
105 */
106 *ppGui = pGui;
107 if (ppGuiVT)
108 *ppGuiVT = &g_dbgGuiVT;
109 return rc;
110 }
111
112 /*
113 * Failed, cleanup.
114 */
115 delete pGui->pVBoxDbgGui;
116 RTMemFree(pGui);
117 *ppGui = NULL;
118 if (ppGuiVT)
119 *ppGuiVT = NULL;
120 return rc;
121}
122
123
124/**
125 * Creates the debugger GUI.
126 *
127 * @returns VBox status code.
128 * @param pSession The VirtualBox session.
129 * @param ppGui Where to store the pointer to the debugger instance.
130 * @param ppGuiVT Where to store the virtual method table pointer.
131 * Optional.
132 */
133DBGDECL(int) DBGGuiCreate(ISession *pSession, PDBGGUI *ppGui, PCDBGGUIVT *ppGuiVT)
134{
135 AssertPtrReturn(pSession, VERR_INVALID_POINTER);
136 return dbgGuiCreate(pSession, NULL, NULL, ppGui, ppGuiVT);
137}
138
139
140/**
141 * Creates the debugger GUI given a VM handle.
142 *
143 * @returns VBox status code.
144 * @param pUVM The VM handle.
145 * @param pVMM The VMM function table.
146 * @param ppGui Where to store the pointer to the debugger instance.
147 * @param ppGuiVT Where to store the virtual method table pointer.
148 * Optional.
149 */
150DBGDECL(int) DBGGuiCreateForVM(PUVM pUVM, PCVMMR3VTABLE pVMM, PDBGGUI *ppGui, PCDBGGUIVT *ppGuiVT)
151{
152 AssertPtrReturn(pUVM, VERR_INVALID_POINTER);
153 AssertPtrReturn(pVMM, VERR_INVALID_POINTER);
154 AssertReturn(VMMR3VTABLE_IS_COMPATIBLE(pVMM->uMagicVersion), VERR_VERSION_MISMATCH);
155 AssertReturn(pVMM->pfnVMR3RetainUVM(pUVM) != UINT32_MAX, VERR_INVALID_POINTER);
156
157 int rc = dbgGuiCreate(NULL, pUVM, pVMM, ppGui, ppGuiVT);
158
159 pVMM->pfnVMR3ReleaseUVM(pUVM);
160 return rc;
161}
162
163
164/**
165 * Destroys the debugger GUI.
166 *
167 * @returns VBox status code.
168 * @param pGui The instance returned by DBGGuiCreate().
169 */
170DBGDECL(int) DBGGuiDestroy(PDBGGUI pGui)
171{
172 /*
173 * Validate.
174 */
175 if (!pGui)
176 return VERR_INVALID_PARAMETER;
177 AssertMsgReturn(pGui->u32Magic == DBGGUI_MAGIC, ("u32Magic=%#x\n", pGui->u32Magic), VERR_INVALID_PARAMETER);
178
179 /*
180 * Do the job.
181 */
182 pGui->u32Magic = DBGGUI_MAGIC_DEAD;
183 delete pGui->pVBoxDbgGui;
184 RTMemFree(pGui);
185
186 return VINF_SUCCESS;
187}
188
189
190/**
191 * Notifies the debugger GUI that the console window (or whatever) has changed
192 * size or position.
193 *
194 * @param pGui The instance returned by DBGGuiCreate().
195 * @param x The x-coordinate of the window the debugger is relative to.
196 * @param y The y-coordinate of the window the debugger is relative to.
197 * @param cx The width of the window the debugger is relative to.
198 * @param cy The height of the window the debugger is relative to.
199 */
200DBGDECL(void) DBGGuiAdjustRelativePos(PDBGGUI pGui, int x, int y, unsigned cx, unsigned cy)
201{
202 AssertReturn(pGui, (void)VERR_INVALID_PARAMETER);
203 AssertMsgReturn(pGui->u32Magic == DBGGUI_MAGIC, ("u32Magic=%#x\n", pGui->u32Magic), (void)VERR_INVALID_PARAMETER);
204 pGui->pVBoxDbgGui->adjustRelativePos(x, y, cx, cy);
205}
206
207
208/**
209 * Shows the default statistics window.
210 *
211 * @returns VBox status code.
212 * @param pGui The instance returned by DBGGuiCreate().
213 * @param pszFilter Filter pattern.
214 * @param pszExpand Expand pattern.
215 */
216DBGDECL(int) DBGGuiShowStatistics(PDBGGUI pGui, const char *pszFilter, const char *pszExpand)
217{
218 AssertReturn(pGui, VERR_INVALID_PARAMETER);
219 AssertMsgReturn(pGui->u32Magic == DBGGUI_MAGIC, ("u32Magic=%#x\n", pGui->u32Magic), VERR_INVALID_PARAMETER);
220 return pGui->pVBoxDbgGui->showStatistics(pszFilter, pszExpand);
221}
222
223
224/**
225 * Shows the default command line window.
226 *
227 * @returns VBox status code.
228 * @param pGui The instance returned by DBGGuiCreate().
229 */
230DBGDECL(int) DBGGuiShowCommandLine(PDBGGUI pGui)
231{
232 AssertReturn(pGui, VERR_INVALID_PARAMETER);
233 AssertMsgReturn(pGui->u32Magic == DBGGUI_MAGIC, ("u32Magic=%#x\n", pGui->u32Magic), VERR_INVALID_PARAMETER);
234 return pGui->pVBoxDbgGui->showConsole();
235}
236
237
238/**
239 * Sets the parent windows.
240 *
241 * @param pGui The instance returned by DBGGuiCreate().
242 * @param pvParent Pointer to a QWidget object.
243 *
244 * @remarks This will no affect any existing windows, so call it right after
245 * creating the thing.
246 */
247DBGDECL(void) DBGGuiSetParent(PDBGGUI pGui, void *pvParent)
248{
249 return pGui->pVBoxDbgGui->setParent((QWidget *)pvParent);
250}
251
252
253/**
254 * Sets the debug menu object.
255 *
256 * @param pGui The instance returned by DBGGuiCreate().
257 * @param pvMenu Pointer to a QMenu object.
258 *
259 * @remarks Call right after creation or risk losing menu item.
260 */
261DBGDECL(void) DBGGuiSetMenu(PDBGGUI pGui, void *pvMenu)
262{
263 return pGui->pVBoxDbgGui->setMenu((QMenu *)pvMenu);
264}
265
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