all repos — mgba @ 422e2e2f62fb536ab8c9a2155999287cef5454ea

mGBA Game Boy Advance Emulator

src/platform/qt/GDBController.cpp (view raw)

 1#include "GDBController.h"
 2
 3#include "GameController.h"
 4
 5using namespace QGBA;
 6
 7GDBController::GDBController(GameController* controller, QObject* parent)
 8	: QObject(parent)
 9	, m_gameController(controller)
10	, m_port(2345)
11	, m_bindAddress(0)
12{
13	GDBStubCreate(&m_gdbStub);
14}
15
16ushort GDBController::port() {
17	return m_port;
18}
19
20uint32_t GDBController::bindAddress() {
21	return m_bindAddress;
22}
23
24bool GDBController::isAttached() {
25	return m_gameController->debugger() == &m_gdbStub.d;
26}
27
28void GDBController::setPort(ushort port) {
29	m_port = port;
30}
31
32void GDBController::setBindAddress(uint32_t bindAddress) {
33	m_bindAddress = bindAddress;
34}
35
36void GDBController::attach() {
37	if (isAttached()) {
38		return;
39	}
40	m_gameController->setDebugger(&m_gdbStub.d);
41}
42
43void GDBController::detach() {
44	if (!isAttached()) {
45		return;
46	}
47	bool wasPaused = m_gameController->isPaused();
48	disconnect(m_gameController, SIGNAL(frameAvailable(const uint32_t*)), this, SLOT(updateGDB()));
49	m_gameController->setPaused(true);
50	GDBStubShutdown(&m_gdbStub);
51	m_gameController->setDebugger(nullptr);
52	m_gameController->setPaused(wasPaused);
53}
54
55void GDBController::listen() {
56	if (!isAttached()) {
57		attach();
58	}
59	bool wasPaused = m_gameController->isPaused();
60	connect(m_gameController, SIGNAL(frameAvailable(const uint32_t*)), this, SLOT(updateGDB()));
61	m_gameController->setPaused(true);
62	GDBStubListen(&m_gdbStub, m_port, m_bindAddress);
63	m_gameController->setPaused(wasPaused);
64}
65
66void GDBController::updateGDB() {
67	bool wasPaused = m_gameController->isPaused();
68	m_gameController->setPaused(true);
69	GDBStubUpdate(&m_gdbStub);
70	m_gameController->setPaused(wasPaused);
71}