1 | // SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. |
2 | // |
3 | // SPDX-License-Identifier: GPL-3.0-or-later |
4 | |
5 | #ifndef DEBUGSESSION_H |
6 | #define DEBUGSESSION_H |
7 | |
8 | #include "rawdebugsession.h" |
9 | #include "dap/session.h" |
10 | #include "dap/protocol.h" |
11 | #include "debug.h" |
12 | #include "interface/variable.h" |
13 | |
14 | #include <QSharedPointer> |
15 | #include <QPointer> |
16 | #include <QWidget> |
17 | |
18 | #include <memory> |
19 | |
20 | namespace dap { |
21 | class RawDebugSession; |
22 | } |
23 | |
24 | class RunTimeCfgProvider; |
25 | |
26 | namespace DEBUG_NAMESPACE { |
27 | |
28 | class DebugModel; |
29 | class DebugSession : public QObject, public IDebugSession |
30 | { |
31 | Q_OBJECT |
32 | public: |
33 | DebugSession(DebugModel *, QObject *parent = nullptr); |
34 | ~DebugSession() override; |
35 | |
36 | const dap::Capabilities &capabilities() const override; |
37 | |
38 | bool initialize(const char *ip, int port, dap::InitializeRequest &iniRequest) override; |
39 | bool launch(dap::LaunchRequest &config) override; |
40 | bool attach(dap::AttachRequest &config) override; |
41 | |
42 | void restart() override; |
43 | void terminate(bool restart = false) override; |
44 | void disconnect(bool terminateDebuggee = true, bool restart = false) override; |
45 | |
46 | void sendBreakpoints(const QString &sourcePath, dap::array<IBreakpoint> &breakpointsToSend) override; |
47 | void sendFunctionBreakpoints(dap::array<IFunctionBreakpoint> &fbpts) override; |
48 | void sendExceptionBreakpoints(dap::array<IExceptionBreakpoint> &exbpts) override; |
49 | dap::optional<dap::DataBreakpointInfoResponse> dataBreakpointInfo( |
50 | dap::string &name, dap::optional<dapNumber> variablesReference) override; |
51 | void sendDataBreakpoints(dap::array<IDataBreakpoint> dataBreakpoints) override; |
52 | void sendInstructionBreakpoints(dap::array<IInstructionBreakpoint> instructionBreakpoints) override; |
53 | // dap::array<IPosition> breakpointsLocations(URI uri, number lineNumber); |
54 | dap::optional<dap::Breakpoint> getDebugProtocolBreakpoint(dap::string &breakpointId) override; |
55 | // dap::optional<dap::Response> customRequest(dap::string &request, dap::any args); |
56 | dap::optional<dap::StackTraceResponse> stackTrace(dapNumber threadId, dapNumber startFrame, dapNumber levels) override; |
57 | dap::optional<IExceptionInfo> exceptionInfo(dapNumber threadId) override; |
58 | dap::optional<dap::ScopesResponse> scopes(dapNumber frameId, dapNumber threadId) override; |
59 | dap::optional<dap::VariablesResponse> variables(dapNumber variablesReference, |
60 | dap::optional<dapNumber> threadId, |
61 | dap::optional<dap::string> filter, |
62 | dap::optional<dapNumber> start, |
63 | dap::optional<dapNumber> count) override; |
64 | dap::optional<dap::EvaluateResponse> evaluate( |
65 | dap::string &expression, dapNumber frameId, dap::optional<dap::string> context) override; |
66 | void restartFrame(dapNumber frameId, dapNumber threadId) override; |
67 | void setLastSteppingGranularity(dapNumber threadId, dap::optional<dap::SteppingGranularity> granularity) override; |
68 | |
69 | void next(dap::integer threadId, dap::optional<dap::SteppingGranularity> granularity) override; |
70 | void stepIn(dap::integer threadId, dap::optional<dap::integer> targetId, dap::optional<dap::SteppingGranularity> granularity) override; |
71 | void stepOut(dap::integer threadId, dap::optional<dap::SteppingGranularity> granularity) override; |
72 | void stepBack(dapNumber threadId, dap::optional<dap::SteppingGranularity> granularity) override; |
73 | void continueDbg(dap::integer threadId) override; |
74 | void reverseContinue(dapNumber threadId) override; |
75 | void pause(dap::integer threadId) override; |
76 | void terminateThreads(dap::array<dapNumber> &threadIds) override; |
77 | dap::optional<dap::SetVariableResponse> setVariable( |
78 | dapNumber variablesReference, dap::string &name, dap::string &value) override; |
79 | dap::optional<dap::SetExpressionResponse> setExpression( |
80 | dapNumber frameId, dap::string &expression, dap::string &value) override; |
81 | dap::optional<dap::GotoTargetsResponse> gotoTargets( |
82 | dap::Source &source, dapNumber line, dapNumber column) override; |
83 | dap::optional<dap::GotoResponse> goto_(dapNumber threadId, dapNumber targetId) override; |
84 | dap::optional<dap::StepInTargetsResponse> stepInTargets(dapNumber frameId) override; |
85 | dap::optional<dap::CancelResponse> cancel(dap::string &progressId) override; |
86 | // threads. |
87 | dap::optional<Thread *> getThread(dapNumber threadId) override; |
88 | dap::optional<dap::array<IThread *>> getAllThreads() const override; |
89 | void clearThreads(bool removeThreads, dap::optional<dapNumber> reference) override; |
90 | dap::array<IRawStoppedDetails *> &getStoppedDetails() override; |
91 | void rawUpdate(IRawModelUpdate *data) override; |
92 | void fetchThreads(dap::optional<IRawStoppedDetails> stoppedDetails) override; |
93 | dap::optional<dap::Source> getSourceForUri(QUrl &uri) override; |
94 | Source *getSource(dap::optional<dap::Source> raw) override; |
95 | |
96 | dap::string getId() override; |
97 | dap::integer getThreadId() override; |
98 | dap::string getLabel() const override; |
99 | void setName(dap::string &name) override; |
100 | |
101 | bool getLocals(dap::integer frameId, IVariables *out) override; |
102 | |
103 | dap::Session *getDapSession() const; |
104 | dap::RawDebugSession *getRawSession() const; |
105 | |
106 | dap::array<dap::Thread> fetchThreads(IRawStoppedDetails *stoppedDetails); |
107 | |
108 | bool launchJavaDap(const QString &workDir, |
109 | const QString &mainClass, |
110 | const QString &projectName, |
111 | const QStringList &classPaths, |
112 | const QString &javaExec); |
113 | bool attachPythonDap(int port, |
114 | const QString &workspace); |
115 | void closeSession(); |
116 | void disassemble(const dap::string &address); |
117 | signals: |
118 | void sigRegisterHandlers(); |
119 | |
120 | public slots: |
121 | |
122 | private: |
123 | void shutdown(); |
124 | void onBreakpointHit(const dap::StoppedEvent &event); |
125 | void onStep(const dap::StoppedEvent &event); |
126 | |
127 | dap::Source getRawSource(QUrl &uri); |
128 | void cancelAllRequests(); |
129 | |
130 | bool getVariables(dap::integer variablesRef, IVariables *out, dap::integer depth = 0); |
131 | |
132 | QSharedPointer<dap::RawDebugSession> raw; |
133 | QSharedPointer<RunTimeCfgProvider> rtCfgProvider; |
134 | |
135 | bool initialized = false; |
136 | |
137 | std::shared_ptr<dap::Session> session; |
138 | |
139 | std::string id; |
140 | |
141 | dap::integer threadId = 0; |
142 | std::map<dapNumber, Thread *> threads; |
143 | dap::array<dapNumber> threadIds; |
144 | |
145 | DebugModel *model = nullptr; |
146 | |
147 | dap::optional<dap::string> name; |
148 | |
149 | dap::array<IRawStoppedDetails *> stoppedDetails; |
150 | |
151 | std::map<dap::string, Source *> sources; |
152 | |
153 | QPointer<QWidget> alertBox; |
154 | }; |
155 | } |
156 | |
157 | #endif // DEBUGSESSION_H |
158 | |