forked from qt-creator/qt-creator
debugger: more tracepoint stuff
This commit is contained in:
@@ -267,6 +267,8 @@ void BreakHandler::saveBreakpoints()
|
|||||||
map.insert(_("disabled"), _("1"));
|
map.insert(_("disabled"), _("1"));
|
||||||
if (data.useFullPath)
|
if (data.useFullPath)
|
||||||
map.insert(_("usefullpath"), _("1"));
|
map.insert(_("usefullpath"), _("1"));
|
||||||
|
if (data.tracepoint)
|
||||||
|
map.insert(_("tracepoint"), _("1"));
|
||||||
list.append(map);
|
list.append(map);
|
||||||
}
|
}
|
||||||
debuggerCore()->setSessionValue("Breakpoints", list);
|
debuggerCore()->setSessionValue("Breakpoints", list);
|
||||||
@@ -310,6 +312,9 @@ void BreakHandler::loadBreakpoints()
|
|||||||
v = map.value(_("usefullpath"));
|
v = map.value(_("usefullpath"));
|
||||||
if (v.isValid())
|
if (v.isValid())
|
||||||
data.useFullPath = bool(v.toInt());
|
data.useFullPath = bool(v.toInt());
|
||||||
|
v = map.value(_("tracepoint"));
|
||||||
|
if (v.isValid())
|
||||||
|
data.tracepoint = bool(v.toInt());
|
||||||
v = map.value(_("type"));
|
v = map.value(_("type"));
|
||||||
if (v.isValid() && v.toInt() != UnknownType)
|
if (v.isValid() && v.toInt() != UnknownType)
|
||||||
data.type = BreakpointType(v.toInt());
|
data.type = BreakpointType(v.toInt());
|
||||||
@@ -582,6 +587,26 @@ void BreakHandler::setEnabled(BreakpointId id, bool on)
|
|||||||
scheduleSynchronization();
|
scheduleSynchronization();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BreakHandler::isTracepoint(BreakpointId id) const
|
||||||
|
{
|
||||||
|
ConstIterator it = m_storage.find(id);
|
||||||
|
QTC_ASSERT(it != m_storage.end(), return false);
|
||||||
|
return it->data.tracepoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BreakHandler::setTracepoint(BreakpointId id, bool on)
|
||||||
|
{
|
||||||
|
Iterator it = m_storage.find(id);
|
||||||
|
QTC_ASSERT(it != m_storage.end(), return);
|
||||||
|
if (it->data.tracepoint == on)
|
||||||
|
return;
|
||||||
|
it->data.tracepoint = on;
|
||||||
|
it->destroyMarker();
|
||||||
|
it->state = BreakpointChangeRequested;
|
||||||
|
updateMarker(id);
|
||||||
|
scheduleSynchronization();
|
||||||
|
}
|
||||||
|
|
||||||
void BreakHandler::setMarkerFileAndLine(BreakpointId id,
|
void BreakHandler::setMarkerFileAndLine(BreakpointId id,
|
||||||
const QString &fileName, int lineNumber)
|
const QString &fileName, int lineNumber)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -127,6 +127,8 @@ public:
|
|||||||
void updateLineNumberFromMarker(BreakpointId id, int lineNumber);
|
void updateLineNumberFromMarker(BreakpointId id, int lineNumber);
|
||||||
void setMarkerFileAndLine(BreakpointId id,
|
void setMarkerFileAndLine(BreakpointId id,
|
||||||
const QString &fileName, int lineNumber);
|
const QString &fileName, int lineNumber);
|
||||||
|
bool isTracepoint(BreakpointId id) const;
|
||||||
|
void setTracepoint(BreakpointId, bool on);
|
||||||
DebuggerEngine *engine(BreakpointId id) const;
|
DebuggerEngine *engine(BreakpointId id) const;
|
||||||
void setEngine(BreakpointId id, DebuggerEngine *engine);
|
void setEngine(BreakpointId id, DebuggerEngine *engine);
|
||||||
const BreakpointResponse &response(BreakpointId id) const;
|
const BreakpointResponse &response(BreakpointId id) const;
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ QDataStream &operator<<(QDataStream &stream, const BreakpointParameters &s)
|
|||||||
stream << quint64(s.address);
|
stream << quint64(s.address);
|
||||||
stream << s.functionName;
|
stream << s.functionName;
|
||||||
stream << s.useFullPath;
|
stream << s.useFullPath;
|
||||||
|
stream << s.tracepoint;
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,6 +192,7 @@ QDataStream &operator>>(QDataStream &stream, BreakpointParameters &s)
|
|||||||
stream >> t; s.address = t;
|
stream >> t; s.address = t;
|
||||||
stream >> str; s.functionName = str;
|
stream >> str; s.functionName = str;
|
||||||
stream >> b; s.useFullPath = b;
|
stream >> b; s.useFullPath = b;
|
||||||
|
stream >> b; s.tracepoint = b;
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2068,7 +2068,10 @@ void GdbEngine::updateBreakpointDataFromOutput(BreakpointId id, const GdbMi &bkp
|
|||||||
} else if (child.hasName("thread")) {
|
} else if (child.hasName("thread")) {
|
||||||
response.threadSpec = child.data().toInt();
|
response.threadSpec = child.data().toInt();
|
||||||
} else if (child.hasName("type")) {
|
} else if (child.hasName("type")) {
|
||||||
if (!child.data().contains("reakpoint")) // "breakpoint", "hw breakpoint"
|
// "breakpoint", "hw breakpoint", "tracepoint"
|
||||||
|
if (child.data().contains("tracepoint"))
|
||||||
|
response.tracepoint = true;
|
||||||
|
else if (!child.data().contains("reakpoint"))
|
||||||
response.type = Watchpoint;
|
response.type = Watchpoint;
|
||||||
}
|
}
|
||||||
// This field is not present. Contents needs to be parsed from
|
// This field is not present. Contents needs to be parsed from
|
||||||
@@ -2179,12 +2182,12 @@ void GdbEngine::attemptAdjustBreakpointLocation(BreakpointId id)
|
|||||||
|
|
||||||
void GdbEngine::handleBreakInsert1(const GdbResponse &response)
|
void GdbEngine::handleBreakInsert1(const GdbResponse &response)
|
||||||
{
|
{
|
||||||
|
BreakHandler *handler = breakHandler();
|
||||||
BreakpointId id(response.cookie.toInt());
|
BreakpointId id(response.cookie.toInt());
|
||||||
if (response.resultClass == GdbResultDone) {
|
if (response.resultClass == GdbResultDone) {
|
||||||
// Interesting only on Mac?
|
// Interesting only on Mac?
|
||||||
GdbMi bkpt = response.data.findChild("bkpt");
|
GdbMi bkpt = response.data.findChild("bkpt");
|
||||||
updateBreakpointDataFromOutput(id, bkpt);
|
updateBreakpointDataFromOutput(id, bkpt);
|
||||||
BreakHandler *handler = breakHandler();
|
|
||||||
if (handler->needsChange(id)) {
|
if (handler->needsChange(id)) {
|
||||||
handler->notifyBreakpointChangeAfterInsertNeeded(id);
|
handler->notifyBreakpointChangeAfterInsertNeeded(id);
|
||||||
changeBreakpoint(id);
|
changeBreakpoint(id);
|
||||||
@@ -2192,6 +2195,16 @@ void GdbEngine::handleBreakInsert1(const GdbResponse &response)
|
|||||||
handler->notifyBreakpointInsertOk(id);
|
handler->notifyBreakpointInsertOk(id);
|
||||||
attemptAdjustBreakpointLocation(id);
|
attemptAdjustBreakpointLocation(id);
|
||||||
}
|
}
|
||||||
|
} else if (response.data.findChild("msg").data().contains("Unknown option")) {
|
||||||
|
// Older version of gdb don't know the -a option to set tracepoints
|
||||||
|
// ^error,msg="mi_cmd_break_insert: Unknown option ``a''"
|
||||||
|
const QString fileName = handler->fileName(id);
|
||||||
|
const int lineNumber = handler->lineNumber(id);
|
||||||
|
QByteArray cmd = "trace "
|
||||||
|
"\"" + GdbMi::escapeCString(fileName).toLocal8Bit() + "\":"
|
||||||
|
+ QByteArray::number(lineNumber);
|
||||||
|
postCommand(cmd, NeedsStop | RebuildBreakpointModel,
|
||||||
|
CB(handleTraceInsert2), id);
|
||||||
} else {
|
} else {
|
||||||
// Some versions of gdb like "GNU gdb (GDB) SUSE (6.8.91.20090930-2.4)"
|
// Some versions of gdb like "GNU gdb (GDB) SUSE (6.8.91.20090930-2.4)"
|
||||||
// know how to do pending breakpoints using CLI but not MI. So try
|
// know how to do pending breakpoints using CLI but not MI. So try
|
||||||
@@ -2216,6 +2229,12 @@ void GdbEngine::handleBreakInsert2(const GdbResponse &response)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GdbEngine::handleTraceInsert2(const GdbResponse &response)
|
||||||
|
{
|
||||||
|
if (response.resultClass == GdbResultDone)
|
||||||
|
reloadBreakListInternal();
|
||||||
|
}
|
||||||
|
|
||||||
void GdbEngine::reloadBreakListInternal()
|
void GdbEngine::reloadBreakListInternal()
|
||||||
{
|
{
|
||||||
postCommand("-break-list",
|
postCommand("-break-list",
|
||||||
@@ -2479,7 +2498,9 @@ void GdbEngine::insertBreakpoint(BreakpointId id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QByteArray cmd;
|
QByteArray cmd;
|
||||||
if (m_isMacGdb) {
|
if (handler->isTracepoint(id)) {
|
||||||
|
cmd = "-break-insert -a -f ";
|
||||||
|
} else if (m_isMacGdb) {
|
||||||
cmd = "-break-insert -l -1 -f ";
|
cmd = "-break-insert -l -1 -f ";
|
||||||
} else if (m_gdbAdapter->isTrkAdapter()) {
|
} else if (m_gdbAdapter->isTrkAdapter()) {
|
||||||
cmd = "-break-insert -h -f ";
|
cmd = "-break-insert -h -f ";
|
||||||
|
|||||||
@@ -354,6 +354,7 @@ private: ////////// View & Data Stuff //////////
|
|||||||
void handleBreakEnable(const GdbResponse &response);
|
void handleBreakEnable(const GdbResponse &response);
|
||||||
void handleBreakInsert1(const GdbResponse &response);
|
void handleBreakInsert1(const GdbResponse &response);
|
||||||
void handleBreakInsert2(const GdbResponse &response);
|
void handleBreakInsert2(const GdbResponse &response);
|
||||||
|
void handleTraceInsert2(const GdbResponse &response);
|
||||||
void handleBreakCondition(const GdbResponse &response);
|
void handleBreakCondition(const GdbResponse &response);
|
||||||
void handleBreakInfo(const GdbResponse &response);
|
void handleBreakInfo(const GdbResponse &response);
|
||||||
void handleBreakThreadSpec(const GdbResponse &response);
|
void handleBreakThreadSpec(const GdbResponse &response);
|
||||||
|
|||||||
Reference in New Issue
Block a user