Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qv4debuggeragent.cpp
Go to the documentation of this file.
1
// Copyright (C) 2016 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant
4
5
#
include
"qv4debuggeragent.h"
6
#
include
"qv4debugservice.h"
7
#
include
"qv4datacollector.h"
8
9
#
include
<
private
/
qv4stackframe_p
.
h
>
10
11
#
include
<
QtCore
/
qjsonobject
.
h
>
12
#
include
<
QtCore
/
qjsonarray
.
h
>
13
14
QT_BEGIN_NAMESPACE
15
16
QV4Debugger
*
QV4DebuggerAgent
::pausedDebugger()
const
17
{
18
for
(QV4Debugger *debugger : m_debuggers) {
19
if
(debugger->state() == QV4Debugger::Paused)
20
return
debugger;
21
}
22
return
nullptr
;
23
}
24
25
bool
QV4DebuggerAgent
::
isRunning
()
const
26
{
27
// "running" means none of the engines are paused.
28
return
pausedDebugger() ==
nullptr
;
29
}
30
31
void
QV4DebuggerAgent
::
debuggerPaused
(
QV4Debugger
*debugger,
QV4Debugger
::
PauseReason
reason)
32
{
33
Q_UNUSED(reason);
34
35
debugger
->
collector
(
)
->
clear
(
)
;
36
37
QJsonObject event, body, script;
38
event.insert(QStringLiteral(
"type"
), QStringLiteral(
"event"
));
39
40
switch
(reason) {
41
case
QV4Debugger
::
Step
:
42
case
QV4Debugger
::
PauseRequest
:
43
case
QV4Debugger
::
BreakPointHit
: {
44
event.insert(QStringLiteral(
"event"
), QStringLiteral(
"break"
));
45
QV4::CppStackFrame *frame = debugger->engine()->currentStackFrame;
46
if
(!frame)
47
break
;
48
49
body.insert(QStringLiteral(
"invocationText"
), frame->function());
50
body.insert(QStringLiteral(
"sourceLine"
), qAbs(frame->lineNumber()) - 1);
51
// if (frame->column > 0)
52
// body.insert(QStringLiteral("sourceColumn"), frame->column);
53
QJsonArray breakPoints;
54
const
QList<
int
> ids = breakPointIds(debugger, frame->source(), frame->lineNumber());
55
for
(
int
breakPointId : ids)
56
breakPoints.push_back(breakPointId);
57
body.insert(QStringLiteral(
"breakpoints"
), breakPoints);
58
script.insert(QStringLiteral(
"name"
), frame->source());
59
}
break
;
60
case
QV4Debugger
::
Throwing
:
61
// TODO: complete this!
62
event.insert(QStringLiteral(
"event"
), QStringLiteral(
"exception"
));
63
break
;
64
}
65
66
if
(!script.isEmpty())
67
body.insert(QStringLiteral(
"script"
), script);
68
if
(!body.isEmpty())
69
event.insert(QStringLiteral(
"body"
), body);
70
m_debugService->send(event);
71
}
72
73
void
QV4DebuggerAgent
::
addDebugger
(
QV4Debugger
*debugger)
74
{
75
Q_ASSERT(!m_debuggers.contains(debugger));
76
m_debuggers << debugger;
77
78
debugger
->
setBreakOnThrow
(
m_breakOnThrow
)
;
79
80
for
(
const
BreakPoint &breakPoint : std::as_const(m_breakPoints))
81
if
(breakPoint.enabled)
82
debugger->addBreakPoint(breakPoint.fileName, breakPoint.lineNr, breakPoint.condition);
83
84
connect(debugger, &QObject::destroyed,
this
, &QV4DebuggerAgent::handleDebuggerDeleted);
85
connect(debugger, &QV4Debugger::debuggerPaused,
this
, &
QV4DebuggerAgent
::
debuggerPaused
,
86
Qt::QueuedConnection);
87
}
88
89
void
QV4DebuggerAgent
::
removeDebugger
(
QV4Debugger
*debugger)
90
{
91
m_debuggers.removeAll(debugger);
92
disconnect(debugger, &QObject::destroyed,
this
, &QV4DebuggerAgent::handleDebuggerDeleted);
93
disconnect(debugger, &QV4Debugger::debuggerPaused,
this
, &
QV4DebuggerAgent
::
debuggerPaused
);
94
}
95
96
const
QList
<
QV4Debugger
*> &
QV4DebuggerAgent
::
debuggers
()
97
{
98
return
m_debuggers;
99
}
100
101
void
QV4DebuggerAgent
::
handleDebuggerDeleted
(QObject *debugger)
102
{
103
m_debuggers.removeAll(
static_cast
<QV4Debugger *>(debugger));
104
}
105
106
void
QV4DebuggerAgent
::
pause
(
QV4Debugger
*debugger)
const
107
{
108
debugger
->
pause
(
)
;
109
}
110
111
void
QV4DebuggerAgent
::
pauseAll
()
const
112
{
113
for
(QV4Debugger *debugger : m_debuggers)
114
pause(debugger);
115
}
116
117
void
QV4DebuggerAgent
::
resumeAll
()
const
118
{
119
for
(QV4Debugger *debugger : m_debuggers)
120
if
(debugger->state() == QV4Debugger::Paused)
121
debugger->resume(QV4Debugger::FullThrottle);
122
}
123
124
int
QV4DebuggerAgent
::
addBreakPoint
(
const
QString &fileName,
int
lineNumber,
bool
enabled,
const
QString &condition)
125
{
126
if
(enabled) {
127
for
(QV4Debugger *debugger : std::as_const(m_debuggers))
128
debugger->addBreakPoint(fileName, lineNumber, condition);
129
}
130
131
const
int
id = ++m_lastBreakPointId;
132
m_breakPoints.insert(id, BreakPoint(fileName, lineNumber, enabled, condition));
133
return
id;
134
}
135
136
void
QV4DebuggerAgent
::
removeBreakPoint
(
int
id)
137
{
138
BreakPoint breakPoint = m_breakPoints.value(id);
139
if
(!breakPoint.isValid())
140
return
;
141
142
m_breakPoints.remove(id);
143
144
if
(breakPoint.enabled)
145
for
(QV4Debugger *debugger : std::as_const(m_debuggers))
146
debugger->removeBreakPoint(breakPoint.fileName, breakPoint.lineNr);
147
}
148
149
void
QV4DebuggerAgent
::
removeAllBreakPoints
()
150
{
151
for
(
auto
it = m_breakPoints.keyBegin(), end = m_breakPoints.keyEnd(); it != end; ++it)
152
removeBreakPoint
(
*it
)
;
153
}
154
155
void
QV4DebuggerAgent
::
enableBreakPoint
(
int
id,
bool
onoff)
156
{
157
BreakPoint &breakPoint = m_breakPoints[id];
158
if
(!breakPoint.isValid() || breakPoint.enabled == onoff)
159
return
;
160
breakPoint.enabled = onoff;
161
162
for
(QV4Debugger *debugger : std::as_const(m_debuggers)) {
163
if
(onoff)
164
debugger->addBreakPoint(breakPoint.fileName, breakPoint.lineNr, breakPoint.condition);
165
else
166
debugger->removeBreakPoint(breakPoint.fileName, breakPoint.lineNr);
167
}
168
}
169
170
QList
<
int
>
QV4DebuggerAgent
::
breakPointIds
(
QV4Debugger
*debugger,
const
QString &fileName,
171
int
lineNumber)
const
172
{
173
QList<
int
> ids;
174
175
for
(QHash<
int
, BreakPoint>::const_iterator i = m_breakPoints.begin(), ei = m_breakPoints.end(); i != ei; ++i) {
176
if
(!fileName.endsWith(i->fileName))
177
continue
;
178
// A breakpoint counts as hit either when execution is exactly on its
179
// line, or when its (non-executable) line resolved to the line we
180
// stopped on. The latter lets the client move the marker there. A Ret
181
// instruction reports a negative line, which must not match the -1 of a
182
// breakpoint that resolves to no line at all. Resolution only moves
183
// forward, so a breakpoint below the stop line cannot match.
184
if
(i->lineNr == lineNumber
185
|| (lineNumber > 0 && i->lineNr < lineNumber
186
&& debugger->resolvedBreakpointLine(i->lineNr) == lineNumber)) {
187
ids.push_back(i.key());
188
}
189
}
190
191
return
ids;
192
}
193
194
void
QV4DebuggerAgent
::
setBreakOnThrow
(
bool
onoff)
195
{
196
if
(onoff != m_breakOnThrow) {
197
m_breakOnThrow = onoff;
198
for
(QV4Debugger *debugger : std::as_const(m_debuggers))
199
debugger->setBreakOnThrow(onoff);
200
}
201
}
202
203
void
QV4DebuggerAgent
::
clearAllPauseRequests
()
204
{
205
for
(QV4Debugger *debugger : std::as_const(m_debuggers))
206
debugger->clearPauseRequest();
207
}
208
209
QT_END_NAMESPACE
210
211
#
include
"moc_qv4debuggeragent.cpp"
QV4DataCollector::clear
void clear()
Definition
qv4datacollector.cpp:263
QV4DebuggerAgent
Definition
qv4debuggeragent.h:15
QV4DebuggerAgent::setBreakOnThrow
void setBreakOnThrow(bool onoff)
Definition
qv4debuggeragent.cpp:194
QV4DebuggerAgent::debuggers
const QList< QV4Debugger * > & debuggers()
Definition
qv4debuggeragent.cpp:96
QV4DebuggerAgent::removeAllBreakPoints
void removeAllBreakPoints()
Definition
qv4debuggeragent.cpp:149
QV4DebuggerAgent::handleDebuggerDeleted
void handleDebuggerDeleted(QObject *debugger)
Definition
qv4debuggeragent.cpp:101
QV4DebuggerAgent::addBreakPoint
int addBreakPoint(const QString &fileName, int lineNumber, bool enabled=true, const QString &condition=QString())
Definition
qv4debuggeragent.cpp:124
QV4DebuggerAgent::breakPointIds
QList< int > breakPointIds(QV4Debugger *debugger, const QString &fileName, int lineNumber) const
Definition
qv4debuggeragent.cpp:170
QV4DebuggerAgent::pauseAll
void pauseAll() const
Definition
qv4debuggeragent.cpp:111
QV4DebuggerAgent::resumeAll
void resumeAll() const
Definition
qv4debuggeragent.cpp:117
QV4DebuggerAgent::addDebugger
void addDebugger(QV4Debugger *debugger)
Definition
qv4debuggeragent.cpp:73
QV4DebuggerAgent::removeDebugger
void removeDebugger(QV4Debugger *debugger)
Definition
qv4debuggeragent.cpp:89
QV4DebuggerAgent::clearAllPauseRequests
void clearAllPauseRequests()
Definition
qv4debuggeragent.cpp:203
QV4DebuggerAgent::pause
void pause(QV4Debugger *debugger) const
Definition
qv4debuggeragent.cpp:106
QV4DebuggerAgent::isRunning
bool isRunning() const
Definition
qv4debuggeragent.cpp:25
QV4DebuggerAgent::removeBreakPoint
void removeBreakPoint(int id)
Definition
qv4debuggeragent.cpp:136
QV4DebuggerAgent::enableBreakPoint
void enableBreakPoint(int id, bool onoff)
Definition
qv4debuggeragent.cpp:155
QV4DebuggerAgent::debuggerPaused
void debuggerPaused(QV4Debugger *debugger, QV4Debugger::PauseReason reason)
Definition
qv4debuggeragent.cpp:31
QV4Debugger
Definition
qv4debugger.h:35
QV4Debugger::collector
QV4DataCollector * collector()
Definition
qv4debugger.cpp:66
QV4Debugger::PauseReason
PauseReason
Definition
qv4debugger.h:58
QV4Debugger::Throwing
@ Throwing
Definition
qv4debugger.h:61
QV4Debugger::PauseRequest
@ PauseRequest
Definition
qv4debugger.h:59
QV4Debugger::BreakPointHit
@ BreakPointHit
Definition
qv4debugger.h:60
QV4Debugger::Step
@ Step
Definition
qv4debugger.h:62
QV4Debugger::setBreakOnThrow
void setBreakOnThrow(bool onoff)
Definition
qv4debugger.cpp:116
QV4Debugger::pause
void pause()
Definition
qv4debugger.cpp:71
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
qtdeclarative
src
plugins
qmltooling
qmldbg_debugger
qv4debuggeragent.cpp
Generated on
for Qt by
1.18.0