blob: 856245040ae348f8232886852c98370efc76a508 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#pragma once
#include <debugger/debuggerengine.h>
#include <utils/qtcprocess.h>
#include <QLoggingCategory>
#include <QVariant>
#include <queue>
namespace Debugger::Internal {
class DapClient;
class DebuggerCommand;
class IDataProvider;
class GdbMi;
enum class DapResponseType;
enum class DapEventType;
class DapEngine;
class VariablesHandler {
public:
VariablesHandler(DapEngine *dapEngine);
struct VariableItem {
QString iname;
int variablesReference;
};
void addVariable(const QString &iname, int variablesReference);
void handleNext();
VariableItem currentItem() const { return m_currentVarItem; }
int queueSize() const { return int(m_queue.size()); }
private:
void startHandling();
DapEngine *m_dapEngine;
std::list<VariableItem> m_queue;
VariableItem m_currentVarItem;
};
/*
* A debugger engine for the debugger adapter protocol.
*/
class DapEngine : public DebuggerEngine
{
public:
DapEngine();
~DapEngine() override = default;
DapClient *dapClient() const { return m_dapClient; }
int currentStackFrameId() const { return m_currentStackFrameId; }
protected:
void executeStepIn(bool) override;
void executeStepOut() override;
void executeStepOver(bool) override;
void shutdownInferior() override;
void shutdownEngine() override;
bool canHandleToolTip(const DebuggerToolTipContext &) const override;
void continueInferior() override;
void interruptInferior() override;
void executeRunToLine(const ContextData &data) override;
void executeRunToFunction(const QString &functionName) override;
void executeJumpToLine(const ContextData &data) override;
void activateFrame(int index) override;
void selectThread(const Thread &thread) override;
bool acceptsBreakpoint(const BreakpointParameters &bp) const override;
void insertBreakpoint(const Breakpoint &bp) override;
void updateBreakpoint(const Breakpoint &bp) override;
void removeBreakpoint(const Breakpoint &bp) override;
void executeDebuggerCommand(const QString &command) override;
void loadSymbols(const Utils::FilePath &moduleName) override;
void loadAllSymbols() override;
void reloadModules() override;
void reloadSourceFiles() override {}
void reloadFullStack() override;
bool supportsThreads() const { return true; }
void updateItem(const QString &iname) override;
void reexpandItems(const QSet<QString> &inames) override;
void doUpdateLocals(const UpdateParameters ¶ms) override;
void getVariableFromQueue();
void runCommand(const DebuggerCommand &cmd);
void refreshLocation(const GdbMi &reportedLocation);
void refreshStack(const QJsonArray &stackFrames);
void refreshLocals(const QJsonArray &variables);
void refreshModules(const GdbMi &modules);
void refreshState(const GdbMi &reportedState);
void refreshSymbols(const GdbMi &symbols);
QString errorMessage(QProcess::ProcessError error) const;
bool hasCapability(unsigned cap) const override;
void claimInitialBreakpoints();
void handleDapStarted();
virtual void handleDapInitialize();
void handleDapEventInitialized();
virtual void handleDapConfigurationDone();
void dapRemoveBreakpoint(const Breakpoint &bp);
void dapInsertBreakpoint(const Breakpoint &bp);
void dapRemoveFunctionBreakpoint(const Breakpoint &bp);
void dapInsertFunctionBreakpoint(const Breakpoint &bp);
void handleDapDone();
void readDapStandardOutput();
void readDapStandardError();
void handleResponse(DapResponseType type, const QJsonObject &response);
void handleStackTraceResponse(const QJsonObject &response);
void handleScopesResponse(const QJsonObject &response);
void handleThreadsResponse(const QJsonObject &response);
void handleEvaluateResponse(const QJsonObject &response);
void handleBreakpointResponse(const QJsonObject &response);
void handleEvent(DapEventType type, const QJsonObject &event);
void handleStoppedEvent(const QJsonObject &event);
void updateAll() override;
void updateLocals() override;
void connectDataGeneratorSignals();
QByteArray m_inbuffer;
DapClient *m_dapClient = nullptr;
int m_nextBreakpointId = 1;
int m_currentThreadId = -1;
int m_currentStackFrameId = -1;
std::unique_ptr<VariablesHandler> m_variablesHandler;
virtual const QLoggingCategory &logCategory()
{
static const QLoggingCategory logCategory = QLoggingCategory("qtc.dbg.dapengine",
QtWarningMsg);
return logCategory;
}
};
} // Debugger::Internal
|