summaryrefslogtreecommitdiff
path: root/src/plugins/debugger/gdb/gdbengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/debugger/gdb/gdbengine.cpp')
-rw-r--r--src/plugins/debugger/gdb/gdbengine.cpp75
1 files changed, 53 insertions, 22 deletions
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 2321d8b2c5..562f497e54 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -2038,8 +2038,8 @@ void GdbEngine::breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt
fullName = child.data();
} else if (child.hasName("line")) {
data->bpLineNumber = child.data();
- if (child.data().toInt())
- data->markerLineNumber = child.data().toInt();
+ if (child.data().toInt() && data->bpCorrectedLineNumber.isEmpty())
+ data->setMarkerLineNumber(child.data().toInt());
} else if (child.hasName("cond")) {
data->bpCondition = child.data();
// gdb 6.3 likes to "rewrite" conditions. Just accept that fact.
@@ -2067,8 +2067,10 @@ void GdbEngine::breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt
QString name;
if (!fullName.isEmpty()) {
name = cleanupFullName(QFile::decodeName(fullName));
- if (data->markerFileName.isEmpty())
- data->markerFileName = name;
+ if (data->markerFileName().isEmpty()) {
+ qDebug() << "222" << name;
+ data->setMarkerFileName(name);
+ }
} else {
name = QFile::decodeName(file);
// Use fullName() once we have a mapping which is more complete than
@@ -2221,7 +2223,7 @@ void GdbEngine::handleBreakDisable(const GdbResponse &response)
void GdbEngine::handleBreakIgnore(const GdbResponse &response)
{
- int index = response.cookie.toInt();
+ int bpNumber = response.cookie.toInt();
// gdb 6.8:
// ignore 2 0:
// ~"Will stop next time breakpoint 2 is reached.\n"
@@ -2233,9 +2235,9 @@ void GdbEngine::handleBreakIgnore(const GdbResponse &response)
//
// gdb 6.3 does not produce any console output
BreakHandler *handler = manager()->breakHandler();
- if (response.resultClass == GdbResultDone && index < handler->size()) {
+ BreakpointData *data = handler->findBreakpoint(bpNumber);
+ if (response.resultClass == GdbResultDone && data) {
QString msg = _(response.data.findChild("consolestreamoutput").data());
- BreakpointData *data = handler->at(index);
//if (msg.contains(__("Will stop next time breakpoint"))) {
// data->bpIgnoreCount = _("0");
//} else if (msg.contains(__("Will ignore next"))) {
@@ -2249,21 +2251,20 @@ void GdbEngine::handleBreakIgnore(const GdbResponse &response)
void GdbEngine::handleBreakCondition(const GdbResponse &response)
{
- int index = response.cookie.toInt();
+ int bpNumber = response.cookie.toInt();
BreakHandler *handler = manager()->breakHandler();
+ BreakpointData *data = handler->findBreakpoint(bpNumber);
if (response.resultClass == GdbResultDone) {
// We just assume it was successful. Otherwise we had to parse
// the output stream data.
- BreakpointData *data = handler->at(index);
- //qDebug() << "HANDLE BREAK CONDITION" << index << data->condition;
+ //qDebug() << "HANDLE BREAK CONDITION" << bpNumber << data->condition;
data->bpCondition = data->condition;
} else {
QByteArray msg = response.data.findChild("msg").data();
// happens on Mac
if (1 || msg.startsWith("Error parsing breakpoint condition. "
" Will try again when we hit the breakpoint.")) {
- BreakpointData *data = handler->at(index);
- //qDebug() << "ERROR BREAK CONDITION" << index << data->condition;
+ //qDebug() << "ERROR BREAK CONDITION" << bpNumber << data->condition;
data->bpCondition = data->condition;
}
}
@@ -2316,8 +2317,11 @@ void GdbEngine::extractDataFromInfoBreak(const QString &output, BreakpointData *
// the marker in more cases.
if (data->fileName.endsWith(full))
full = data->fileName;
- data->markerLineNumber = data->bpLineNumber.toInt();
- data->markerFileName = full;
+ data->setMarkerLineNumber(data->bpLineNumber.toInt());
+ if (data->markerFileName().isEmpty()) {
+ qDebug() << "111";
+ data->setMarkerFileName(full);
+ }
data->bpFileName = full;
} else {
qDebug() << "COULD NOT MATCH " << re.pattern() << " AND " << output;
@@ -2327,16 +2331,35 @@ void GdbEngine::extractDataFromInfoBreak(const QString &output, BreakpointData *
void GdbEngine::handleBreakInfo(const GdbResponse &response)
{
- int bpNumber = response.cookie.toInt();
- BreakHandler *handler = manager()->breakHandler();
if (response.resultClass == GdbResultDone) {
// Old-style output for multiple breakpoints, presumably in a
// constructor.
- int found = handler->findBreakpoint(bpNumber);
- if (found != -1) {
+ const int bpNumber = response.cookie.toInt();
+ const BreakHandler *handler = manager()->breakHandler();
+ BreakpointData *data = handler->findBreakpoint(bpNumber);
+ if (data) {
QString str = QString::fromLocal8Bit(
response.data.findChild("consolestreamoutput").data());
- extractDataFromInfoBreak(str, handler->at(found));
+ extractDataFromInfoBreak(str, data);
+ }
+ }
+}
+
+void GdbEngine::handleInfoLine(const GdbResponse &response)
+{
+ if (response.resultClass == GdbResultDone) {
+ // Old-style output: "Line 1102 of \"simple/app.cpp\" starts
+ // at address 0x80526aa <_Z10...+131> and ends at 0x80526b5
+ // <_Z10testQStackv+142>.\n"
+ const int bpNumber = response.cookie.toInt();
+ const BreakHandler *handler = manager()->breakHandler();
+ BreakpointData *data = handler->findBreakpoint(bpNumber);
+ QByteArray ba = response.data.findChild("consolestreamoutput").data();
+ const int pos = ba.indexOf(' ', 5);
+ if (ba.startsWith("Line ") && pos != -1) {
+ const QByteArray line = ba.mid(5, pos - 5);
+ data->bpCorrectedLineNumber = line;
+ data->setMarkerLineNumber(line.toInt());
}
}
}
@@ -2412,7 +2435,7 @@ void GdbEngine::attemptBreakpointSynchronization()
foreach (BreakpointData *data, handler->takeRemovedBreakpoints()) {
QByteArray bpNumber = data->bpNumber;
debugMessage(_("DELETING BP " + bpNumber + " IN "
- + data->markerFileName.toLocal8Bit()));
+ + data->markerFileName().toLocal8Bit()));
if (!bpNumber.trimmed().isEmpty())
postCommand("-break-delete " + bpNumber,
NeedsStop | RebuildBreakpointModel);
@@ -2435,14 +2458,14 @@ void GdbEngine::attemptBreakpointSynchronization()
// Update conditions if needed.
postCommand("condition " + data->bpNumber + ' ' + data->condition,
NeedsStop | RebuildBreakpointModel,
- CB(handleBreakCondition), index);
+ CB(handleBreakCondition), data->bpNumber.toInt());
}
else // Because gdb won't do both changes at a time anyway.
if (data->ignoreCount != data->bpIgnoreCount) {
// Update ignorecount if needed.
postCommand("ignore " + data->bpNumber + ' ' + data->ignoreCount,
NeedsStop | RebuildBreakpointModel,
- CB(handleBreakIgnore), index);
+ CB(handleBreakIgnore), data->bpNumber.toInt());
continue;
}
if (!data->enabled && data->bpEnabled) {
@@ -2452,6 +2475,14 @@ void GdbEngine::attemptBreakpointSynchronization()
data->bpEnabled = false;
continue;
}
+ if (!data->bpAddress.isEmpty()
+ && data->bpCorrectedLineNumber.isEmpty()) {
+ // Prevent endless loop.
+ data->bpCorrectedLineNumber = " ";
+ postCommand("info line *" + data->bpAddress,
+ NeedsStop | RebuildBreakpointModel,
+ CB(handleInfoLine), data->bpNumber.toInt());
+ }
}
}