forked from qt-creator/qt-creator
debugger: move breakpoint marker to the line where the breakpoint will be
actually hit
This commit is contained in:
@@ -124,9 +124,9 @@ public:
|
|||||||
return;
|
return;
|
||||||
//if (m_data->markerLineNumber == lineNumber)
|
//if (m_data->markerLineNumber == lineNumber)
|
||||||
// return;
|
// return;
|
||||||
if (m_data->markerLineNumber != lineNumber) {
|
if (m_data->markerLineNumber() != lineNumber) {
|
||||||
m_data->markerLineNumber = lineNumber;
|
m_data->setMarkerLineNumber(lineNumber);
|
||||||
// FIXME: should we tell gdb about the change?
|
// FIXME: Should we tell gdb about the change?
|
||||||
// Ignore it for now, as we would require re-compilation
|
// Ignore it for now, as we would require re-compilation
|
||||||
// and debugger re-start anyway.
|
// and debugger re-start anyway.
|
||||||
if (0 && !m_data->bpLineNumber.isEmpty()) {
|
if (0 && !m_data->bpLineNumber.isEmpty()) {
|
||||||
@@ -135,9 +135,15 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Ignore updates to the "real" line number while the debugger is
|
||||||
|
// running, as this can be triggered by moving the breakpoint to
|
||||||
|
// the next line that generated code.
|
||||||
|
// FIXME: Do we need yet another data member?
|
||||||
|
if (m_data->bpNumber.trimmed().isEmpty()) {
|
||||||
m_data->lineNumber = QByteArray::number(lineNumber);
|
m_data->lineNumber = QByteArray::number(lineNumber);
|
||||||
m_data->handler()->updateMarkers();
|
m_data->handler()->updateMarkers();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BreakpointData *m_data;
|
BreakpointData *m_data;
|
||||||
@@ -163,7 +169,7 @@ BreakpointData::BreakpointData(BreakHandler *handler)
|
|||||||
enabled = true;
|
enabled = true;
|
||||||
pending = true;
|
pending = true;
|
||||||
marker = 0;
|
marker = 0;
|
||||||
markerLineNumber = 0;
|
m_markerLineNumber = 0;
|
||||||
bpMultiple = false;
|
bpMultiple = false;
|
||||||
//#if defined(Q_OS_MAC)
|
//#if defined(Q_OS_MAC)
|
||||||
// // full names do not work on Mac/MI
|
// // full names do not work on Mac/MI
|
||||||
@@ -189,26 +195,36 @@ void BreakpointData::removeMarker()
|
|||||||
|
|
||||||
void BreakpointData::updateMarker()
|
void BreakpointData::updateMarker()
|
||||||
{
|
{
|
||||||
if (marker && (markerFileName != marker->fileName()
|
if (marker && (m_markerFileName != marker->fileName()
|
||||||
|| markerLineNumber != marker->lineNumber()))
|
|| m_markerLineNumber != marker->lineNumber()))
|
||||||
removeMarker();
|
removeMarker();
|
||||||
|
|
||||||
if (!marker && !markerFileName.isEmpty() && markerLineNumber > 0)
|
if (!marker && !m_markerFileName.isEmpty() && m_markerLineNumber > 0)
|
||||||
marker = new BreakpointMarker(this, markerFileName, markerLineNumber);
|
marker = new BreakpointMarker(this, m_markerFileName, m_markerLineNumber);
|
||||||
|
|
||||||
if (marker)
|
if (marker)
|
||||||
marker->setPending(pending, enabled);
|
marker->setPending(pending, enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BreakpointData::setMarkerFileName(const QString &fileName)
|
||||||
|
{
|
||||||
|
m_markerFileName = fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BreakpointData::setMarkerLineNumber(int lineNumber)
|
||||||
|
{
|
||||||
|
m_markerLineNumber = lineNumber;
|
||||||
|
}
|
||||||
|
|
||||||
QString BreakpointData::toToolTip() const
|
QString BreakpointData::toToolTip() const
|
||||||
{
|
{
|
||||||
QString rc;
|
QString rc;
|
||||||
QTextStream str(&rc);
|
QTextStream str(&rc);
|
||||||
str << "<html><body><table>"
|
str << "<html><body><table>"
|
||||||
<< "<tr><td>" << BreakHandler::tr("Marker File:")
|
<< "<tr><td>" << BreakHandler::tr("Marker File:")
|
||||||
<< "</td><td>" << markerFileName << "</td></tr>"
|
<< "</td><td>" << m_markerFileName << "</td></tr>"
|
||||||
<< "<tr><td>" << BreakHandler::tr("Marker Line:")
|
<< "<tr><td>" << BreakHandler::tr("Marker Line:")
|
||||||
<< "</td><td>" << markerLineNumber << "</td></tr>"
|
<< "</td><td>" << m_markerLineNumber << "</td></tr>"
|
||||||
<< "<tr><td>" << BreakHandler::tr("Breakpoint Number:")
|
<< "<tr><td>" << BreakHandler::tr("Breakpoint Number:")
|
||||||
<< "</td><td>" << bpNumber << "</td></tr>"
|
<< "</td><td>" << bpNumber << "</td></tr>"
|
||||||
<< "<tr><td>" << BreakHandler::tr("Breakpoint Address:")
|
<< "<tr><td>" << BreakHandler::tr("Breakpoint Address:")
|
||||||
@@ -226,8 +242,7 @@ QString BreakpointData::toToolTip() const
|
|||||||
<< "<tr><td>" << BreakHandler::tr("Line Number:")
|
<< "<tr><td>" << BreakHandler::tr("Line Number:")
|
||||||
<< "</td><td>" << lineNumber << "</td><td>" << bpLineNumber << "</td></tr>"
|
<< "</td><td>" << lineNumber << "</td><td>" << bpLineNumber << "</td></tr>"
|
||||||
<< "<tr><td>" << BreakHandler::tr("Corrected Line Number:")
|
<< "<tr><td>" << BreakHandler::tr("Corrected Line Number:")
|
||||||
<< "</td><td>" << lineNumber
|
<< "</td><td>-</td><td>" << bpCorrectedLineNumber << "</td></tr>"
|
||||||
<< "</td><td>" << bpCorrectedLineNumber << "</td></tr>"
|
|
||||||
<< "<tr><td>" << BreakHandler::tr("Condition:")
|
<< "<tr><td>" << BreakHandler::tr("Condition:")
|
||||||
<< "</td><td>" << condition << "</td><td>" << bpCondition << "</td></tr>"
|
<< "</td><td>" << condition << "</td><td>" << bpCondition << "</td></tr>"
|
||||||
<< "<tr><td>" << BreakHandler::tr("Ignore Count:")
|
<< "<tr><td>" << BreakHandler::tr("Ignore Count:")
|
||||||
@@ -240,8 +255,8 @@ QString BreakpointData::toString() const
|
|||||||
{
|
{
|
||||||
QString rc;
|
QString rc;
|
||||||
QTextStream str(&rc);
|
QTextStream str(&rc);
|
||||||
str << BreakHandler::tr("Marker File:") << markerFileName << ' '
|
str << BreakHandler::tr("Marker File:") << m_markerFileName << ' '
|
||||||
<< BreakHandler::tr("Marker Line:") << markerLineNumber << ' '
|
<< BreakHandler::tr("Marker Line:") << m_markerLineNumber << ' '
|
||||||
<< BreakHandler::tr("Breakpoint Number:") << bpNumber << ' '
|
<< BreakHandler::tr("Breakpoint Number:") << bpNumber << ' '
|
||||||
<< BreakHandler::tr("Breakpoint Address:") << bpAddress << '\n'
|
<< BreakHandler::tr("Breakpoint Address:") << bpAddress << '\n'
|
||||||
<< BreakHandler::tr("File Name:")
|
<< BreakHandler::tr("File Name:")
|
||||||
@@ -268,7 +283,8 @@ bool BreakpointData::isLocatedAt(const QString &fileName_, int lineNumber_) cons
|
|||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
*/
|
*/
|
||||||
return lineNumber_ == markerLineNumber && fileNameMatch(fileName_, markerFileName);
|
return lineNumber_ == m_markerLineNumber
|
||||||
|
&& fileNameMatch(fileName_, m_markerFileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BreakpointData::conditionsMatch() const
|
bool BreakpointData::conditionsMatch() const
|
||||||
@@ -343,7 +359,7 @@ void BreakHandler::clear()
|
|||||||
m_inserted.clear();
|
m_inserted.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
int BreakHandler::findBreakpoint(const BreakpointData &needle)
|
int BreakHandler::findBreakpoint(const BreakpointData &needle) const
|
||||||
{
|
{
|
||||||
// Search a breakpoint we might refer to.
|
// Search a breakpoint we might refer to.
|
||||||
for (int index = 0; index != size(); ++index) {
|
for (int index = 0; index != size(); ++index) {
|
||||||
@@ -360,7 +376,7 @@ int BreakHandler::findBreakpoint(const BreakpointData &needle)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BreakHandler::findBreakpoint(const QString &fileName, int lineNumber)
|
int BreakHandler::findBreakpoint(const QString &fileName, int lineNumber) const
|
||||||
{
|
{
|
||||||
for (int index = 0; index != size(); ++index)
|
for (int index = 0; index != size(); ++index)
|
||||||
if (at(index)->isLocatedAt(fileName, lineNumber))
|
if (at(index)->isLocatedAt(fileName, lineNumber))
|
||||||
@@ -368,15 +384,15 @@ int BreakHandler::findBreakpoint(const QString &fileName, int lineNumber)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BreakHandler::findBreakpoint(int bpNumber)
|
BreakpointData *BreakHandler::findBreakpoint(int bpNumber) const
|
||||||
{
|
{
|
||||||
if (!size())
|
if (!size())
|
||||||
return -1;
|
return 0;
|
||||||
QString numStr = QString::number(bpNumber);
|
QString numStr = QString::number(bpNumber);
|
||||||
for (int index = 0; index != size(); ++index)
|
for (int index = 0; index != size(); ++index)
|
||||||
if (at(index)->bpNumber == numStr)
|
if (at(index)->bpNumber == numStr)
|
||||||
return index;
|
return at(index);
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BreakHandler::saveBreakpoints()
|
void BreakHandler::saveBreakpoints()
|
||||||
@@ -433,8 +449,8 @@ void BreakHandler::loadBreakpoints()
|
|||||||
v = map.value(QLatin1String("usefullpath"));
|
v = map.value(QLatin1String("usefullpath"));
|
||||||
if (v.isValid())
|
if (v.isValid())
|
||||||
data->useFullPath = bool(v.toInt());
|
data->useFullPath = bool(v.toInt());
|
||||||
data->markerFileName = data->fileName;
|
data->setMarkerFileName(data->fileName);
|
||||||
data->markerLineNumber = data->lineNumber.toInt();
|
data->setMarkerLineNumber(data->lineNumber.toInt());
|
||||||
append(data);
|
append(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -450,14 +466,15 @@ void BreakHandler::resetBreakpoints()
|
|||||||
data->bpFuncName.clear();
|
data->bpFuncName.clear();
|
||||||
data->bpFileName.clear();
|
data->bpFileName.clear();
|
||||||
data->bpLineNumber.clear();
|
data->bpLineNumber.clear();
|
||||||
|
data->bpCorrectedLineNumber.clear();
|
||||||
data->bpCondition.clear();
|
data->bpCondition.clear();
|
||||||
data->bpIgnoreCount.clear();
|
data->bpIgnoreCount.clear();
|
||||||
data->bpAddress.clear();
|
data->bpAddress.clear();
|
||||||
// Keep marker data if it was primary.
|
// Keep marker data if it was primary.
|
||||||
if (data->markerFileName != data->fileName)
|
if (data->markerFileName() != data->fileName)
|
||||||
data->markerFileName.clear();
|
data->setMarkerFileName(QString());
|
||||||
if (data->markerLineNumber != data->lineNumber.toInt())
|
if (data->markerLineNumber() != data->lineNumber.toInt())
|
||||||
data->markerLineNumber = 0;
|
data->setMarkerLineNumber(0);
|
||||||
}
|
}
|
||||||
m_enabled.clear();
|
m_enabled.clear();
|
||||||
m_disabled.clear();
|
m_disabled.clear();
|
||||||
@@ -696,8 +713,8 @@ void BreakHandler::setBreakpoint(const QString &fileName, int lineNumber)
|
|||||||
data->fileName = fileName;
|
data->fileName = fileName;
|
||||||
data->lineNumber = QByteArray::number(lineNumber);
|
data->lineNumber = QByteArray::number(lineNumber);
|
||||||
data->pending = true;
|
data->pending = true;
|
||||||
data->markerFileName = fileName;
|
data->setMarkerFileName(fileName);
|
||||||
data->markerLineNumber = lineNumber;
|
data->setMarkerLineNumber(lineNumber);
|
||||||
append(data);
|
append(data);
|
||||||
emit layoutChanged();
|
emit layoutChanged();
|
||||||
saveBreakpoints();
|
saveBreakpoints();
|
||||||
@@ -738,10 +755,10 @@ void BreakHandler::loadSessionData()
|
|||||||
void BreakHandler::activateBreakpoint(int index)
|
void BreakHandler::activateBreakpoint(int index)
|
||||||
{
|
{
|
||||||
const BreakpointData *data = at(index);
|
const BreakpointData *data = at(index);
|
||||||
if (!data->markerFileName.isEmpty()) {
|
if (!data->markerFileName().isEmpty()) {
|
||||||
StackFrame frame;
|
StackFrame frame;
|
||||||
frame.file = data->markerFileName;
|
frame.file = data->markerFileName();
|
||||||
frame.line = data->markerLineNumber;
|
frame.line = data->markerLineNumber();
|
||||||
m_manager->gotoLocation(frame, false);
|
m_manager->gotoLocation(frame, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ public:
|
|||||||
QByteArray bpCondition; // Condition acknowledged by the debugger engine.
|
QByteArray bpCondition; // Condition acknowledged by the debugger engine.
|
||||||
QByteArray bpIgnoreCount;// Ignore count acknowledged by the debugger engine.
|
QByteArray bpIgnoreCount;// Ignore count acknowledged by the debugger engine.
|
||||||
QString bpFileName; // File name acknowledged by the debugger engine.
|
QString bpFileName; // File name acknowledged by the debugger engine.
|
||||||
|
QString bpFullName; // Full file name acknowledged by the debugger engine.
|
||||||
QByteArray bpLineNumber; // Line number acknowledged by the debugger engine.
|
QByteArray bpLineNumber; // Line number acknowledged by the debugger engine.
|
||||||
QByteArray bpCorrectedLineNumber; // Acknowledged by the debugger engine.
|
QByteArray bpCorrectedLineNumber; // Acknowledged by the debugger engine.
|
||||||
QString bpFuncName; // Function name acknowledged by the debugger engine.
|
QString bpFuncName; // Function name acknowledged by the debugger engine.
|
||||||
@@ -95,9 +96,16 @@ public:
|
|||||||
bool bpMultiple; // Happens in constructors/gdb.
|
bool bpMultiple; // Happens in constructors/gdb.
|
||||||
bool bpEnabled; // Enable/disable command sent.
|
bool bpEnabled; // Enable/disable command sent.
|
||||||
|
|
||||||
|
void setMarkerFileName(const QString &fileName);
|
||||||
|
QString markerFileName() const { return m_markerFileName; }
|
||||||
|
|
||||||
|
void setMarkerLineNumber(int lineNumber);
|
||||||
|
int markerLineNumber() const { return m_markerLineNumber; }
|
||||||
|
|
||||||
|
private:
|
||||||
// Taken from either user input or gdb responses.
|
// Taken from either user input or gdb responses.
|
||||||
QString markerFileName; // Used to locate the marker.
|
QString m_markerFileName; // Used to locate the marker.
|
||||||
int markerLineNumber;
|
int m_markerLineNumber;
|
||||||
|
|
||||||
// Our red blob in the editor.
|
// Our red blob in the editor.
|
||||||
BreakpointMarker *marker;
|
BreakpointMarker *marker;
|
||||||
@@ -132,9 +140,9 @@ public:
|
|||||||
void removeAt(int index); // This also deletes the marker.
|
void removeAt(int index); // This also deletes the marker.
|
||||||
void clear(); // This also deletes all the marker.
|
void clear(); // This also deletes all the marker.
|
||||||
int indexOf(BreakpointData *data) { return m_bp.indexOf(data); }
|
int indexOf(BreakpointData *data) { return m_bp.indexOf(data); }
|
||||||
int findBreakpoint(const QString &fileName, int lineNumber);
|
int findBreakpoint(const QString &fileName, int lineNumber) const;
|
||||||
int findBreakpoint(const BreakpointData &data); // Returns index.
|
int findBreakpoint(const BreakpointData &data) const; // Returns index.
|
||||||
int findBreakpoint(int bpNumber); // Returns index.
|
BreakpointData *findBreakpoint(int bpNumber) const;
|
||||||
void updateMarkers();
|
void updateMarkers();
|
||||||
|
|
||||||
QList<BreakpointData *> insertedBreakpoints() const;
|
QList<BreakpointData *> insertedBreakpoints() const;
|
||||||
|
|||||||
@@ -2038,8 +2038,8 @@ void GdbEngine::breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt
|
|||||||
fullName = child.data();
|
fullName = child.data();
|
||||||
} else if (child.hasName("line")) {
|
} else if (child.hasName("line")) {
|
||||||
data->bpLineNumber = child.data();
|
data->bpLineNumber = child.data();
|
||||||
if (child.data().toInt())
|
if (child.data().toInt() && data->bpCorrectedLineNumber.isEmpty())
|
||||||
data->markerLineNumber = child.data().toInt();
|
data->setMarkerLineNumber(child.data().toInt());
|
||||||
} else if (child.hasName("cond")) {
|
} else if (child.hasName("cond")) {
|
||||||
data->bpCondition = child.data();
|
data->bpCondition = child.data();
|
||||||
// gdb 6.3 likes to "rewrite" conditions. Just accept that fact.
|
// 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;
|
QString name;
|
||||||
if (!fullName.isEmpty()) {
|
if (!fullName.isEmpty()) {
|
||||||
name = cleanupFullName(QFile::decodeName(fullName));
|
name = cleanupFullName(QFile::decodeName(fullName));
|
||||||
if (data->markerFileName.isEmpty())
|
if (data->markerFileName().isEmpty()) {
|
||||||
data->markerFileName = name;
|
qDebug() << "222" << name;
|
||||||
|
data->setMarkerFileName(name);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
name = QFile::decodeName(file);
|
name = QFile::decodeName(file);
|
||||||
// Use fullName() once we have a mapping which is more complete than
|
// 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)
|
void GdbEngine::handleBreakIgnore(const GdbResponse &response)
|
||||||
{
|
{
|
||||||
int index = response.cookie.toInt();
|
int bpNumber = response.cookie.toInt();
|
||||||
// gdb 6.8:
|
// gdb 6.8:
|
||||||
// ignore 2 0:
|
// ignore 2 0:
|
||||||
// ~"Will stop next time breakpoint 2 is reached.\n"
|
// ~"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
|
// gdb 6.3 does not produce any console output
|
||||||
BreakHandler *handler = manager()->breakHandler();
|
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());
|
QString msg = _(response.data.findChild("consolestreamoutput").data());
|
||||||
BreakpointData *data = handler->at(index);
|
|
||||||
//if (msg.contains(__("Will stop next time breakpoint"))) {
|
//if (msg.contains(__("Will stop next time breakpoint"))) {
|
||||||
// data->bpIgnoreCount = _("0");
|
// data->bpIgnoreCount = _("0");
|
||||||
//} else if (msg.contains(__("Will ignore next"))) {
|
//} else if (msg.contains(__("Will ignore next"))) {
|
||||||
@@ -2249,21 +2251,20 @@ void GdbEngine::handleBreakIgnore(const GdbResponse &response)
|
|||||||
|
|
||||||
void GdbEngine::handleBreakCondition(const GdbResponse &response)
|
void GdbEngine::handleBreakCondition(const GdbResponse &response)
|
||||||
{
|
{
|
||||||
int index = response.cookie.toInt();
|
int bpNumber = response.cookie.toInt();
|
||||||
BreakHandler *handler = manager()->breakHandler();
|
BreakHandler *handler = manager()->breakHandler();
|
||||||
|
BreakpointData *data = handler->findBreakpoint(bpNumber);
|
||||||
if (response.resultClass == GdbResultDone) {
|
if (response.resultClass == GdbResultDone) {
|
||||||
// We just assume it was successful. Otherwise we had to parse
|
// We just assume it was successful. Otherwise we had to parse
|
||||||
// the output stream data.
|
// the output stream data.
|
||||||
BreakpointData *data = handler->at(index);
|
//qDebug() << "HANDLE BREAK CONDITION" << bpNumber << data->condition;
|
||||||
//qDebug() << "HANDLE BREAK CONDITION" << index << data->condition;
|
|
||||||
data->bpCondition = data->condition;
|
data->bpCondition = data->condition;
|
||||||
} else {
|
} else {
|
||||||
QByteArray msg = response.data.findChild("msg").data();
|
QByteArray msg = response.data.findChild("msg").data();
|
||||||
// happens on Mac
|
// happens on Mac
|
||||||
if (1 || msg.startsWith("Error parsing breakpoint condition. "
|
if (1 || msg.startsWith("Error parsing breakpoint condition. "
|
||||||
" Will try again when we hit the breakpoint.")) {
|
" Will try again when we hit the breakpoint.")) {
|
||||||
BreakpointData *data = handler->at(index);
|
//qDebug() << "ERROR BREAK CONDITION" << bpNumber << data->condition;
|
||||||
//qDebug() << "ERROR BREAK CONDITION" << index << data->condition;
|
|
||||||
data->bpCondition = data->condition;
|
data->bpCondition = data->condition;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2316,8 +2317,11 @@ void GdbEngine::extractDataFromInfoBreak(const QString &output, BreakpointData *
|
|||||||
// the marker in more cases.
|
// the marker in more cases.
|
||||||
if (data->fileName.endsWith(full))
|
if (data->fileName.endsWith(full))
|
||||||
full = data->fileName;
|
full = data->fileName;
|
||||||
data->markerLineNumber = data->bpLineNumber.toInt();
|
data->setMarkerLineNumber(data->bpLineNumber.toInt());
|
||||||
data->markerFileName = full;
|
if (data->markerFileName().isEmpty()) {
|
||||||
|
qDebug() << "111";
|
||||||
|
data->setMarkerFileName(full);
|
||||||
|
}
|
||||||
data->bpFileName = full;
|
data->bpFileName = full;
|
||||||
} else {
|
} else {
|
||||||
qDebug() << "COULD NOT MATCH " << re.pattern() << " AND " << output;
|
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)
|
void GdbEngine::handleBreakInfo(const GdbResponse &response)
|
||||||
{
|
{
|
||||||
int bpNumber = response.cookie.toInt();
|
|
||||||
BreakHandler *handler = manager()->breakHandler();
|
|
||||||
if (response.resultClass == GdbResultDone) {
|
if (response.resultClass == GdbResultDone) {
|
||||||
// Old-style output for multiple breakpoints, presumably in a
|
// Old-style output for multiple breakpoints, presumably in a
|
||||||
// constructor.
|
// constructor.
|
||||||
int found = handler->findBreakpoint(bpNumber);
|
const int bpNumber = response.cookie.toInt();
|
||||||
if (found != -1) {
|
const BreakHandler *handler = manager()->breakHandler();
|
||||||
|
BreakpointData *data = handler->findBreakpoint(bpNumber);
|
||||||
|
if (data) {
|
||||||
QString str = QString::fromLocal8Bit(
|
QString str = QString::fromLocal8Bit(
|
||||||
response.data.findChild("consolestreamoutput").data());
|
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()) {
|
foreach (BreakpointData *data, handler->takeRemovedBreakpoints()) {
|
||||||
QByteArray bpNumber = data->bpNumber;
|
QByteArray bpNumber = data->bpNumber;
|
||||||
debugMessage(_("DELETING BP " + bpNumber + " IN "
|
debugMessage(_("DELETING BP " + bpNumber + " IN "
|
||||||
+ data->markerFileName.toLocal8Bit()));
|
+ data->markerFileName().toLocal8Bit()));
|
||||||
if (!bpNumber.trimmed().isEmpty())
|
if (!bpNumber.trimmed().isEmpty())
|
||||||
postCommand("-break-delete " + bpNumber,
|
postCommand("-break-delete " + bpNumber,
|
||||||
NeedsStop | RebuildBreakpointModel);
|
NeedsStop | RebuildBreakpointModel);
|
||||||
@@ -2435,14 +2458,14 @@ void GdbEngine::attemptBreakpointSynchronization()
|
|||||||
// Update conditions if needed.
|
// Update conditions if needed.
|
||||||
postCommand("condition " + data->bpNumber + ' ' + data->condition,
|
postCommand("condition " + data->bpNumber + ' ' + data->condition,
|
||||||
NeedsStop | RebuildBreakpointModel,
|
NeedsStop | RebuildBreakpointModel,
|
||||||
CB(handleBreakCondition), index);
|
CB(handleBreakCondition), data->bpNumber.toInt());
|
||||||
}
|
}
|
||||||
else // Because gdb won't do both changes at a time anyway.
|
else // Because gdb won't do both changes at a time anyway.
|
||||||
if (data->ignoreCount != data->bpIgnoreCount) {
|
if (data->ignoreCount != data->bpIgnoreCount) {
|
||||||
// Update ignorecount if needed.
|
// Update ignorecount if needed.
|
||||||
postCommand("ignore " + data->bpNumber + ' ' + data->ignoreCount,
|
postCommand("ignore " + data->bpNumber + ' ' + data->ignoreCount,
|
||||||
NeedsStop | RebuildBreakpointModel,
|
NeedsStop | RebuildBreakpointModel,
|
||||||
CB(handleBreakIgnore), index);
|
CB(handleBreakIgnore), data->bpNumber.toInt());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!data->enabled && data->bpEnabled) {
|
if (!data->enabled && data->bpEnabled) {
|
||||||
@@ -2452,6 +2475,14 @@ void GdbEngine::attemptBreakpointSynchronization()
|
|||||||
data->bpEnabled = false;
|
data->bpEnabled = false;
|
||||||
continue;
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -342,6 +342,7 @@ private: ////////// View & Data Stuff //////////
|
|||||||
void handleBreakInsert2(const GdbResponse &response);
|
void handleBreakInsert2(const GdbResponse &response);
|
||||||
void handleBreakCondition(const GdbResponse &response);
|
void handleBreakCondition(const GdbResponse &response);
|
||||||
void handleBreakInfo(const GdbResponse &response);
|
void handleBreakInfo(const GdbResponse &response);
|
||||||
|
void handleInfoLine(const GdbResponse &response);
|
||||||
void extractDataFromInfoBreak(const QString &output, BreakpointData *data);
|
void extractDataFromInfoBreak(const QString &output, BreakpointData *data);
|
||||||
void breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt);
|
void breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt);
|
||||||
QByteArray breakpointLocation(int index);
|
QByteArray breakpointLocation(int index);
|
||||||
|
|||||||
@@ -425,9 +425,9 @@ void ScriptEngine::attemptBreakpointSynchronization()
|
|||||||
data->bpNumber = QByteArray::number(index + 1);
|
data->bpNumber = QByteArray::number(index + 1);
|
||||||
updateNeeded = true;
|
updateNeeded = true;
|
||||||
}
|
}
|
||||||
if (!data->fileName.isEmpty() && data->markerFileName.isEmpty()) {
|
if (!data->fileName.isEmpty() && data->markerFileName().isEmpty()) {
|
||||||
data->markerFileName = data->fileName;
|
data->setMarkerFileName(data->fileName);
|
||||||
data->markerLineNumber = data->lineNumber.toInt();
|
data->setMarkerLineNumber(data->lineNumber.toInt());
|
||||||
updateNeeded = true;
|
updateNeeded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -607,8 +607,8 @@ bool ScriptEngine::checkForBreakCondition(bool byFunction)
|
|||||||
data->bpLineNumber = QByteArray::number(lineNumber);
|
data->bpLineNumber = QByteArray::number(lineNumber);
|
||||||
data->bpFileName = fileName;
|
data->bpFileName = fileName;
|
||||||
data->bpFuncName = functionName;
|
data->bpFuncName = functionName;
|
||||||
data->markerLineNumber = lineNumber;
|
data->setMarkerLineNumber(lineNumber);
|
||||||
data->markerFileName = fileName;
|
data->setMarkerFileName(fileName);
|
||||||
data->pending = false;
|
data->pending = false;
|
||||||
data->updateMarker();
|
data->updateMarker();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user