VirtualBox

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

Last change on this file since 44340 was 44340, checked in by vboxsync, 12 years ago

VMM,Main,Debugger,REM: VM API cleanup, prefering PUVM over PVM so we can use real reference counting and not have the memory backing the VM structure disappear on us.

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