VirtualBox

source: vbox/trunk/src/VBox/Debugger/VBoxDbgBase.h@ 86719

Last change on this file since 86719 was 86327, checked in by vboxsync, 4 years ago

Debugger: Allow for different I/O providers instead of only TCP

So far TCP was the only option to communicate remotely with the internal debugger, the other option
was to use the console from the GUI directly. This commit reworks basic I/O to allow for different
providers where TCP is just one option. The second one being introduced is an IPC provider using a local
socket or named pipe depending on the platform. This allows for Windows kernel debugging over a pipe
using the KD stub in VirtualBox and WinDbg running on the host (not tested yet).

Furthermore this commit allows multiple stubs to be listening for connections at the same time, so
one can have a GDB stub listening on one TCP port and the native VBox debugger listening on another one
or even using a different I/O provider. Only one session can be active at a time though, because sharing
debugger states is impossible. To configure this the following CFGM keys need to be set for each listener:

"DBGC/<Some unique ID>/Provider" "tcp|ipc"
"DBGC/<Some unique ID>/StubType" "native|gdb|kd"
"DBGC/<Some unique ID>/Address" "<ip>|<local named pipe or socket path>"
"DBGC/<Some unique ID>/Port" "<port>" (for TCP only)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.2 KB
Line 
1/* $Id: VBoxDbgBase.h 86327 2020-09-28 16:20:50Z vboxsync $ */
2/** @file
3 * VBox Debugger GUI - Base classes.
4 */
5
6/*
7 * Copyright (C) 2006-2020 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#ifndef DEBUGGER_INCLUDED_SRC_VBoxDbgBase_h
19#define DEBUGGER_INCLUDED_SRC_VBoxDbgBase_h
20#ifndef RT_WITHOUT_PRAGMA_ONCE
21# pragma once
22#endif
23
24
25#include <VBox/vmm/stam.h>
26#include <VBox/vmm/vmapi.h>
27#include <VBox/dbg.h>
28#include <iprt/thread.h>
29#include <QString>
30#include <QWidget>
31
32class VBoxDbgGui;
33
34
35/**
36 * VBox Debugger GUI Base Class.
37 *
38 * The purpose of this class is to hide the VM handle, abstract VM
39 * operations, and finally to make sure the GUI won't crash when
40 * the VM dies.
41 */
42class VBoxDbgBase
43{
44public:
45 /**
46 * Construct the object.
47 *
48 * @param a_pDbgGui Pointer to the debugger gui object.
49 */
50 VBoxDbgBase(VBoxDbgGui *a_pDbgGui);
51
52 /**
53 * Destructor.
54 */
55 virtual ~VBoxDbgBase();
56
57
58 /**
59 * Checks if the VM is OK for normal operations.
60 * @returns true if ok, false if not.
61 */
62 bool isVMOk() const
63 {
64 return m_pUVM != NULL;
65 }
66
67 /**
68 * Checks if the current thread is the GUI thread or not.
69 * @return true/false accordingly.
70 */
71 bool isGUIThread() const
72 {
73 return m_hGUIThread == RTThreadNativeSelf();
74 }
75
76 /** @name Operations
77 * @{ */
78 /**
79 * Wrapper for STAMR3Reset().
80 */
81 int stamReset(const QString &rPat);
82 /**
83 * Wrapper for STAMR3Enum().
84 */
85 int stamEnum(const QString &rPat, PFNSTAMR3ENUM pfnEnum, void *pvUser);
86 /**
87 * Wrapper for DBGCCreate().
88 */
89 int dbgcCreate(PCDBGCIO pIo, unsigned fFlags);
90 /** @} */
91
92
93protected:
94 /** @name Signals
95 * @{ */
96 /**
97 * Called when the VM is being destroyed.
98 */
99 virtual void sigDestroying();
100 /**
101 * Called when the VM has been terminated.
102 */
103 virtual void sigTerminated();
104 /** @} */
105
106
107private:
108 /** @callback_method_impl{FNVMATSTATE} */
109 static DECLCALLBACK(void) atStateChange(PUVM pUVM, VMSTATE enmState, VMSTATE enmOldState, void *pvUser);
110
111private:
112 /** Pointer to the debugger GUI object. */
113 VBoxDbgGui *m_pDbgGui;
114 /** The user mode VM handle. */
115 PUVM volatile m_pUVM;
116 /** The handle of the GUI thread. */
117 RTNATIVETHREAD m_hGUIThread;
118};
119
120
121/**
122 * VBox Debugger GUI Base Window Class.
123 *
124 * This is just a combination of QWidget and VBoxDbgBase with some additional
125 * functionality for window management. This class is not intended for control
126 * widgets, only normal top-level windows.
127 */
128class VBoxDbgBaseWindow : public QWidget, public VBoxDbgBase
129{
130public:
131 /**
132 * Construct the object.
133 *
134 * @param a_pDbgGui Pointer to the debugger gui object.
135 * @param a_pParent Pointer to the parent object.
136 * @param a_pszTitle The window title string (persistent, not copied).
137 */
138 VBoxDbgBaseWindow(VBoxDbgGui *a_pDbgGui, QWidget *a_pParent, const char *a_pszTitle);
139
140 /**
141 * Destructor.
142 */
143 virtual ~VBoxDbgBaseWindow();
144
145 /**
146 * Shows the window and gives it focus.
147 */
148 void vShow();
149
150 /**
151 * Repositions the window, taking the frame decoration into account.
152 *
153 * @param a_x The new x coordinate.
154 * @param a_y The new x coordinate.
155 * @param a_cx The total width.
156 * @param a_cy The total height.
157 * @param a_fResize Whether to resize it as well.
158 */
159 void vReposition(int a_x, int a_y, unsigned a_cx, unsigned a_cy, bool a_fResize);
160
161protected:
162 /**
163 * For polishing the window size (X11 mess).
164 *
165 * @returns true / false.
166 * @param a_pEvt The event.
167 */
168 virtual bool event(QEvent *a_pEvt);
169
170 /**
171 * Event filter for various purposes (mainly title bar).
172 *
173 * @param pWatched The object event came to.
174 * @param pEvent The event being handled.
175 */
176 virtual bool eventFilter(QObject *pWatched, QEvent *pEvent);
177
178 /**
179 * Internal worker for polishing the size and position (X11 hacks).
180 */
181 void vPolishSizeAndPos();
182
183 /**
184 * Internal worker that guesses the border sizes.
185 */
186 QSize vGuessBorderSizes();
187
188private:
189 /** The Window title string (inflexible, read only). */
190 const char *m_pszTitle;
191 /** Whether we've done the size polishing in showEvent or not. */
192 bool m_fPolished;
193 /** The desired x coordinate. */
194 int m_x;
195 /** The desired y coordinate. */
196 int m_y;
197 /** The desired width. */
198 unsigned m_cx;
199 /** The desired height. */
200 unsigned m_cy;
201
202 /** Best effort x border size (for X11). */
203 static unsigned m_cxBorder;
204 /** Best effort y border size (for X11). */
205 static unsigned m_cyBorder;
206};
207
208#endif /* !DEBUGGER_INCLUDED_SRC_VBoxDbgBase_h */
209
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