diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 379ad29f6d5..ddcabf2e5ea 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -1259,6 +1259,19 @@ BreakpointModelIds BreakHandler::engineBreakpointIds(DebuggerEngine *engine) con return ids; } +QStringList BreakHandler::engineBreakpointPaths(DebuggerEngine *engine) const +{ + QSet set; + ConstIterator it = m_storage.constBegin(), et = m_storage.constEnd(); + for ( ; it != et; ++it) { + if (it->engine == engine) { + if (it->data.type == BreakpointByFileAndLine) + set.insert(QFileInfo(it->data.fileName).dir().path()); + } + } + return set.toList(); +} + void BreakHandler::cleanupBreakpoint(BreakpointModelId id) { QTC_ASSERT(state(id) == BreakpointDead, qDebug() << state(id)); diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index 47917e46492..82a92b2d75d 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -79,6 +79,7 @@ public: BreakpointModelIds engineBreakpointIds(DebuggerEngine *engine) const; BreakpointModelIds unclaimedBreakpointIds() const; int size() const { return m_storage.size(); } + QStringList engineBreakpointPaths(DebuggerEngine *engine) const; // Find a breakpoint matching approximately the data in needle. BreakpointModelId findSimilarBreakpoint(const BreakpointResponse &needle) const; diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 9feac3ee45f..23aee74157a 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1198,11 +1198,10 @@ void DebuggerPluginPrivate::maybeEnrichParameters(DebuggerStartParameters *sp) return; if (sp->sysroot.isEmpty() && (sp->startMode == AttachToRemoteServer || sp->startMode == StartRemote)) { - // FIXME: Get from BaseQtVersion + // FIXME: Get from BaseQtVersion. sp->sysroot = QString::fromLocal8Bit(qgetenv("QTC_DEBUGGER_SYSROOT")); - //if (sp->sysroot.isEmpty()) - // sp->sysroot = debuggerCore()->configValue(_("LastSysroot")).toString(); - showMessage(QLatin1String("### USING FAKE SYSROOT ###") + sp->sysroot, LogWarning); + showMessage(QString::fromLatin1("USING QTC_DEBUGGER_SYSROOT %1") + .arg(sp->sysroot), LogWarning); } if (sp->debugInfoLocation.isEmpty()) sp->debugInfoLocation = sp->sysroot + "/usr/lib/debug"; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index cd3849325e1..2f7229724ef 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -4758,34 +4758,11 @@ void GdbEngine::handleAdapterStarted() void GdbEngine::setupInferior() { QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state()); - showStatusMessage(tr("Setting up inferior...")); - const DebuggerStartParameters &sp = startParameters(); - const QByteArray debugInfoLocation = sp.debugInfoLocation.toLocal8Bit(); - if (!debugInfoLocation.isEmpty()) - postCommand("set debug-file-directory " + debugInfoLocation); - // Spaces just will not work. - foreach (const QString &src, sp.debugSourceLocation) - postCommand("directory " + src.toLocal8Bit()); - if (!sp.solibSearchPath.isEmpty()) - postCommand("set solib-search-path " + sp.solibSearchPath.toLocal8Bit()); - m_gdbAdapter->setupInferior(); -} - -void GdbEngine::notifyInferiorSetupFailed() -{ - // FIXME: that's not enough to stop gdb from getting confused - // by a timeout of the adapter. - //resetCommandQueue(); - DebuggerEngine::notifyInferiorSetupFailed(); -} - -void GdbEngine::handleInferiorPrepared() -{ typedef GlobalDebuggerOptions::SourcePathMap SourcePathMap; typedef SourcePathMap::const_iterator SourcePathMapIterator; - const DebuggerStartParameters &sp = startParameters(); - QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state()); + showStatusMessage(tr("Setting up inferior...")); + const DebuggerStartParameters &sp = startParameters(); // Apply source path mappings from global options. const SourcePathMap sourcePathMap = @@ -4804,6 +4781,39 @@ void GdbEngine::handleInferiorPrepared() if (!sp.sysroot.isEmpty()) postCommand("set substitute-path / " + sp.sysroot.toLocal8Bit()); + const QByteArray debugInfoLocation = sp.debugInfoLocation.toLocal8Bit(); + if (!debugInfoLocation.isEmpty()) + postCommand("set debug-file-directory " + debugInfoLocation); + + // Spaces just will not work. + foreach (const QString &src, sp.debugSourceLocation) + postCommand("directory " + src.toLocal8Bit()); + if (!sp.solibSearchPath.isEmpty()) + postCommand("set solib-search-path " + sp.solibSearchPath.toLocal8Bit()); + + // Take locations of actual breakpoints into account. + if (debuggerCore()->boolSetting(AutoEnrichParameters)) { + foreach (const QString &src, breakHandler()->engineBreakpointPaths(this)) + postCommand("directory " + src.toLocal8Bit()); + } + + m_gdbAdapter->setupInferior(); +} + +void GdbEngine::notifyInferiorSetupFailed() +{ + // FIXME: that's not enough to stop gdb from getting confused + // by a timeout of the adapter. + //resetCommandQueue(); + DebuggerEngine::notifyInferiorSetupFailed(); +} + +void GdbEngine::handleInferiorPrepared() +{ + const DebuggerStartParameters &sp = startParameters(); + + QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state()); + // Initial attempt to set breakpoints. if (sp.startMode != AttachCore && !isSlaveEngine()) { showStatusMessage(tr("Setting breakpoints..."));