diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 187381ac6ee661012500deb01d83c2d0269bfd77..49842b4bc6f2139557408342afecc4a44b84e48b 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -250,6 +250,7 @@ void GdbEngine::initializeVariables() m_debuggingHelperState = DebuggingHelperUninitialized; m_gdbVersion = 100; m_gdbBuildVersion = -1; + m_isMacGdb = false; m_isSynchroneous = false; m_fullToShortName.clear(); @@ -1263,6 +1264,7 @@ void GdbEngine::handleShowVersion(const GdbResponse &response) if (response.resultClass == GdbResultDone) { m_gdbVersion = 100; m_gdbBuildVersion = -1; + m_isMacGdb = false; QString msg = QString::fromLocal8Bit(response.data.findChild("consolestreamoutput").data()); QRegExp supported(_("GNU gdb(.*) (\\d+)\\.(\\d+)(\\.(\\d+))?(-(\\d+))?")); if (supported.indexIn(msg) == -1) { @@ -1290,8 +1292,9 @@ void GdbEngine::handleShowVersion(const GdbResponse &response) + 100 * supported.cap(3).toInt() + 1 * supported.cap(5).toInt(); m_gdbBuildVersion = supported.cap(7).toInt(); - debugMessage(_("GDB VERSION: %1, BUILD: %2 ").arg(m_gdbVersion) - .arg(m_gdbBuildVersion)); + m_isMacGdb = msg.contains(__("Apple version")); + debugMessage(_("GDB VERSION: %1, BUILD: %2%3").arg(m_gdbVersion) + .arg(m_gdbBuildVersion).arg(_(m_isMacGdb ? " (APPLE)" : ""))); } //qDebug () << "VERSION 3:" << m_gdbVersion << m_gdbBuildVersion; } @@ -1805,21 +1808,15 @@ void GdbEngine::sendInsertBreakpoint(int index) // set up fallback in case of pending breakpoints which aren't handled // by the MI interface -#if defined(Q_OS_WIN) - QString cmd = _("-break-insert "); - //if (!data->condition.isEmpty()) - // cmd += "-c " + data->condition + " "; -#elif defined(Q_OS_MAC) - QString cmd = _("-break-insert -l -1 "); - //if (!data->condition.isEmpty()) - // cmd += "-c " + data->condition + " "; -#else - QString cmd = _("-break-insert -f "); - if (m_gdbAdapter->isTrkAdapter()) + QString cmd; + if (m_isMacGdb) + cmd = _("-break-insert -l -1 "); + else if (m_gdbVersion >= 60800) // Probably some earlier version would work as well ... + cmd = _("-break-insert -f "); + else cmd = _("-break-insert "); //if (!data->condition.isEmpty()) - // cmd += _("-c ") + data->condition + ' '; -#endif + // cmd += _("-c ") + data->condition + _c(' '); cmd += where; gdbOutputAvailable(LogStatus, _("Current state: %1").arg(state())); postCommand(cmd, NeedsStop, CB(handleBreakInsert), index); @@ -1942,20 +1939,18 @@ void GdbEngine::handleBreakInsert(const GdbResponse &response) attemptBreakpointSynchronization(); handler->updateMarkers(); } else { - const BreakpointData *data = handler->at(index); - // Note that it is perfectly correct that the file name is put - // in quotes but not escaped. GDB simply is like that. -#if defined(Q_OS_WIN) || defined(Q_OS_MAC) - QFileInfo fi(data->fileName); - QString where = _c('"') + fi.fileName() + _("\":") - + data->lineNumber; -#else - QString where = _c('"') + data->fileName + _("\":") - + data->lineNumber; - // Should not happen with -break-insert -f. gdb older than 6.8? - QTC_ASSERT(false, /**/); -#endif - postCommand(_("break ") + where, CB(handleBreakInsert1), index); + if (m_gdbVersion < 60800 && !m_isMacGdb) { + // Note that it is perfectly correct that the file name is put + // in quotes but not escaped. GDB simply is like that. + const BreakpointData *data = handler->at(index); + QFileInfo fi(data->fileName); + QString where = _c('"') + fi.fileName() + _("\":") + + data->lineNumber; + postCommand(_("break ") + where, CB(handleBreakInsert1), index); + } else { + // The breakpoint would be pending even if the path simply cannot be found. + QTC_ASSERT(false, /**/); + } } } @@ -2296,11 +2291,7 @@ StackFrame GdbEngine::parseStackFrame(const GdbMi &frameMi, int level) void GdbEngine::handleStackListFrames(const GdbResponse &response) { - #if defined(Q_OS_MAC) - bool handleIt = true; - #else - bool handleIt = response.resultClass == GdbResultDone; - #endif + bool handleIt = (m_isMacGdb || response.resultClass == GdbResultDone); if (!handleIt) { // That always happens on symbian gdb with // ^error,data={msg="Previous frame identical to this frame (corrupt stack?)" @@ -2371,15 +2362,11 @@ void GdbEngine::handleStackListFrames(const GdbResponse &response) if (targetFrame == -1) targetFrame = 0; - #ifdef Q_OS_MAC // Mac gdb does not add the location to the "stopped" message, // so the early gotoLocation() was not triggered. Force it here. - bool jump = true; - #else // For targetFrame == 0 we already issued a 'gotoLocation' // when reading the *stopped message. - bool jump = targetFrame != 0; - #endif + bool jump = (m_isMacGdb || targetFrame != 0); manager()->stackHandler()->setCurrentIndex(targetFrame); if (jump || cookie.gotoLocation) { @@ -2520,12 +2507,9 @@ void GdbEngine::handleRegisterListValues(const GdbResponse &response) bool GdbEngine::supportsThreads() const { -#ifdef Q_OS_MAC - return true; -#endif // FSF gdb 6.3 crashes happily on -thread-list-ids. So don't use it. // The test below is a semi-random pick, 6.8 works fine - return m_gdbVersion > 60500; + return m_isMacGdb || m_gdbVersion > 60500; } @@ -3588,16 +3572,17 @@ WatchData GdbEngine::localVariable(const GdbMi &item, // numchild="1",type="const QtSharedPointer::Basic<CPlusPlus::..."}} // We do not want these at all. Current hypotheses is that those // "spurious" locals have _two_ "exp" field. Try to filter them: -#ifdef Q_OS_MAC - int numExps = 0; - foreach (const GdbMi &child, item.children()) - numExps += int(child.name() == "exp"); - if (numExps > 1) - return WatchData(); - QByteArray name = item.findChild("exp").data(); -#else - QByteArray name = item.findChild("name").data(); -#endif + QByteArray name; + if (m_isMacGdb) { + int numExps = 0; + foreach (const GdbMi &child, item.children()) + numExps += int(child.name() == "exp"); + if (numExps > 1) + return WatchData(); + name = item.findChild("exp").data(); + } else { + name = item.findChild("name").data(); + } const QMap<QByteArray, int>::iterator it = seen->find(name); if (it != seen->end()) { const int n = it.value(); @@ -4260,9 +4245,9 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb) postCommand(_("set width 0")); postCommand(_("set height 0")); - #ifdef Q_OS_MAC - postCommand(_("-gdb-set inferior-auto-start-cfm off")); - postCommand(_("-gdb-set sharedLibrary load-rules " + if (m_isMacGdb) { + postCommand(_("-gdb-set inferior-auto-start-cfm off")); + postCommand(_("-gdb-set sharedLibrary load-rules " "dyld \".*libSystem.*\" all " "dyld \".*libauto.*\" all " "dyld \".*AppKit.*\" all " @@ -4271,7 +4256,7 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb) "dyld \".*CFDataFormatters.*\" all " "dyld \".*libobjc.*\" all " "dyld \".*CarbonDataFormatters.*\" all")); - #endif + } QString scriptFileName = theDebuggerStringSetting(GdbScriptFile); if (!scriptFileName.isEmpty()) { diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index a891a557472fe80b30fa780b10eec5cbd9f1348f..6e6db609c48fa99ae1af77c431590b4d615db7b4 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -260,8 +260,9 @@ private: ////////// Gdb Output, State & Capability Handling ////////// void handleShowVersion(const GdbResponse &response); void handleIsSynchroneous(const GdbResponse &response); - int m_gdbVersion; // 6.8.0 is 680 + int m_gdbVersion; // 6.8.0 is 60800 int m_gdbBuildVersion; // MAC only? + bool m_isMacGdb; bool m_isSynchroneous; // Can act synchroneously? private: ////////// Inferior Management //////////