diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index ae30132b3bc6a39ddf20f273767d028a5173331b..40767c41baf3d6fecde86b53e44ab9da6c9549bc 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -170,6 +170,12 @@ QString CMakeRunConfiguration::dumperLibrary() const return dhl; } +QStringList CMakeRunConfiguration::dumperLibraryLocations() const +{ + QString qmakePath = ProjectExplorer::DebuggingHelperLibrary::findSystemQt(environment()); + return ProjectExplorer::DebuggingHelperLibrary::debuggingHelperLibraryLocations(qmakePath); +} + ProjectExplorer::Environment CMakeRunConfiguration::baseEnvironment() const { ProjectExplorer::Environment env; diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h index 57c09a3e4aba522b56e6767c4b69b26b36cdb471..35be599c57d3b68cd343b69cd7a3836ba64e3002 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h @@ -70,6 +70,7 @@ public: virtual void save(ProjectExplorer::PersistentSettingsWriter &writer) const; virtual void restore(const ProjectExplorer::PersistentSettingsReader &reader); virtual QString dumperLibrary() const; + virtual QStringList dumperLibraryLocations() const; virtual ProjectExplorer::ToolChain::ToolChainType toolChainType() const; signals: diff --git a/src/plugins/debugger/cdb/cdbdebugengine.cpp b/src/plugins/debugger/cdb/cdbdebugengine.cpp index 798f5234ff46edfc5d6879d4f29d6c1695ab6a94..365252f876a61688189f96c50ae7e09714bc0f40 100644 --- a/src/plugins/debugger/cdb/cdbdebugengine.cpp +++ b/src/plugins/debugger/cdb/cdbdebugengine.cpp @@ -539,12 +539,13 @@ bool CdbDebugEngine::startDebugger(const QSharedPointer<DebuggerStartParameters> const QString dumperLibName = QDir::toNativeSeparators(m_d->m_debuggerManagerAccess->qtDumperLibraryName()); bool dumperEnabled = mode != AttachCore && mode != AttachCrashedExternal - && !dumperLibName.isEmpty() && m_d->m_debuggerManagerAccess->qtDumperLibraryEnabled(); if (dumperEnabled) { const QFileInfo fi(dumperLibName); if (!fi.isFile()) { - const QString msg = tr("The dumper library '%1' does not exist.").arg(dumperLibName); + const QStringList &locations = m_d->m_debuggerManagerAccess->qtDumperLibraryLocations(); + const QString loc = locations.join(QLatin1String(", ")); + const QString msg = tr("The dumper library was not found at %1.").arg(loc); m_d->m_debuggerManagerAccess->showQtDumperLibraryWarning(msg); dumperEnabled = false; } diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index 15c586b5bba226397c49f1cf81c3a15ef912e571..87571d84027ef831fa2deeb4e4564a56f1fc4676 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -1004,6 +1004,11 @@ void DebuggerManager::setQtDumperLibraryName(const QString &dl) m_dumperLib = dl; } +void DebuggerManager::setQtDumperLibraryLocations(const QStringList &dl) +{ + m_dumperLibLocations = dl; +} + qint64 DebuggerManager::inferiorPid() const { return m_inferiorPid; @@ -1518,6 +1523,15 @@ QString DebuggerManager::qtDumperLibraryName() const return m_dumperLib; } +QStringList DebuggerManager::qtDumperLibraryLocations() const +{ + if (theDebuggerAction(UseCustomDebuggingHelperLocation)->value().toBool()) + return QStringList() << + ( theDebuggerAction(CustomDebuggingHelperLocation)->value().toString() + + tr(" (explicitly set in the Debugger Options)")); + return m_dumperLibLocations; +} + void DebuggerManager::showQtDumperLibraryWarning(const QString &details) { QMessageBox dialog(mainWindow()); diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index c153465c884ca1bf2a1b492a7a2c6fa0627e0f60..cc09c8f6bb480f48ebf8ddce10552d89ae450504 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -236,6 +236,7 @@ private: virtual bool qtDumperLibraryEnabled() const = 0; virtual QString qtDumperLibraryName() const = 0; + virtual QStringList qtDumperLibraryLocations() const = 0; virtual void showQtDumperLibraryWarning(const QString &details = QString()) = 0; virtual bool isReverseDebugging() const = 0; @@ -272,6 +273,7 @@ public slots: virtual qint64 inferiorPid() const; void setQtDumperLibraryName(const QString &dl); // Run Control + void setQtDumperLibraryLocations(const QStringList &dl); void setSimpleDockWidgetArrangement(); void setLocked(bool locked); @@ -376,6 +378,7 @@ private: virtual bool qtDumperLibraryEnabled() const; virtual QString qtDumperLibraryName() const; + virtual QStringList qtDumperLibraryLocations() const; virtual void showQtDumperLibraryWarning(const QString &details = QString()); virtual bool isReverseDebugging() const; @@ -434,6 +437,7 @@ private: QSharedPointer<DebuggerStartParameters> m_startParameters; DebuggerRunControl *m_runControl; QString m_dumperLib; + QStringList m_dumperLibLocations; qint64 m_inferiorPid; diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 4b151c52cfad6af2a7e409c14441b27248e6085c..b1d531493e4fe799e2b5ab92303d2fb5f6ff9408 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -158,6 +158,7 @@ void DebuggerRunControl::start() break; } m_manager->setQtDumperLibraryName(rc->dumperLibrary()); + m_manager->setQtDumperLibraryLocations(rc->dumperLibraryLocations()); if (const ProjectExplorer::Project *project = rc->project()) { m_startParameters->buildDir = project->buildDirectory(project->activeBuildConfiguration()); } diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index fa8f9d7a0a2514664fd9aec9978b19397a63396e..917d68c597cb4eb297bbbc393b425354aebecae1 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -3855,11 +3855,13 @@ void GdbEngine::tryLoadDebuggingHelpers() if (!qq->qtDumperLibraryEnabled()) return; const QString lib = qq->qtDumperLibraryName(); + const QStringList &locations = qq->qtDumperLibraryLocations(); //qDebug() << "DUMPERLIB:" << lib; // @TODO: same in CDB engine... const QFileInfo fi(lib); if (!fi.exists()) { - const QString msg = tr("The dumper library '%1' does not exist.").arg(lib); + const QString loc = locations.join(QLatin1String(", ")); + const QString msg = tr("The dumper library was not found at %1.").arg(loc); debugMessage(msg); qq->showQtDumperLibraryWarning(msg); return; diff --git a/src/plugins/projectexplorer/applicationrunconfiguration.h b/src/plugins/projectexplorer/applicationrunconfiguration.h index 6d347c0ab62aff007ddbe79c3070a6d8ee7552d5..0f4315844c1dfd716bcf8a12f0f250499eb3e309 100644 --- a/src/plugins/projectexplorer/applicationrunconfiguration.h +++ b/src/plugins/projectexplorer/applicationrunconfiguration.h @@ -57,6 +57,7 @@ public: virtual QStringList commandLineArguments() const = 0; virtual Environment environment() const = 0; virtual QString dumperLibrary() const = 0; + virtual QStringList dumperLibraryLocations() const = 0; virtual ProjectExplorer::ToolChain::ToolChainType toolChainType() const = 0; virtual void save(PersistentSettingsWriter &writer) const; diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp index 97de1178176ec1748a8f7cea50ce9a6fe510bab5..ad516a218a444903232bae7176b0e373b90fab52 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp @@ -459,6 +459,12 @@ QString CustomExecutableRunConfiguration::dumperLibrary() const return ProjectExplorer::DebuggingHelperLibrary::debuggingHelperLibrary(qmakePath); } +QStringList CustomExecutableRunConfiguration::dumperLibraryLocations() const +{ + QString qmakePath = ProjectExplorer::DebuggingHelperLibrary::findSystemQt(environment()); + return ProjectExplorer::DebuggingHelperLibrary::debuggingHelperLibraryLocations(qmakePath); +} + ProjectExplorer::ToolChain::ToolChainType CustomExecutableRunConfiguration::toolChainType() const { return ProjectExplorer::ToolChain::UNKNOWN; diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.h b/src/plugins/projectexplorer/customexecutablerunconfiguration.h index 894116fc08e46413cedb8e805502a6c7afa5c5ae..81db5a1fa7722f329e8c87b173775845521333e2 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.h +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.h @@ -89,6 +89,7 @@ public: virtual QWidget *configurationWidget(); virtual QString dumperLibrary() const; + virtual QStringList dumperLibraryLocations() const; virtual ProjectExplorer::ToolChain::ToolChainType toolChainType() const; diff --git a/src/plugins/projectexplorer/debugginghelper.cpp b/src/plugins/projectexplorer/debugginghelper.cpp index fbbab7f5f3a79b8631e488cf4b14126ae1c354fc..8af5ba3045612b045dd6f540ef2d5bc0bdee424c 100644 --- a/src/plugins/projectexplorer/debugginghelper.cpp +++ b/src/plugins/projectexplorer/debugginghelper.cpp @@ -66,11 +66,16 @@ QStringList DebuggingHelperLibrary::debuggingHelperLibraryDirectories(const QStr QStringList directories; directories << (qtInstallData + "/qtc-debugging-helper/") - << (QApplication::applicationDirPath() + "/../qtc-debugging-helper/" + QString::number(hash)) + "/" + << QDir::cleanPath((QApplication::applicationDirPath() + "/../qtc-debugging-helper/" + QString::number(hash))) + "/" << (QDesktopServices::storageLocation(QDesktopServices::DataLocation) + "/qtc-debugging-helper/" + QString::number(hash)) + "/"; return directories; } +QStringList DebuggingHelperLibrary::debuggingHelperLibraryLocations(const QString &qmakePath) +{ + return debuggingHelperLibraryLocations(qtInstallDataDir(qmakePath), qtDir(qmakePath)); +} + QString DebuggingHelperLibrary::debuggingHelperLibrary(const QString &qmakePath) { return debuggingHelperLibrary(qtInstallDataDir(qmakePath), qtDir(qmakePath)); @@ -94,6 +99,22 @@ QString DebuggingHelperLibrary::qtDir(const QString &qmakePath) // Debugging Helper Library +QStringList DebuggingHelperLibrary::debuggingHelperLibraryLocations(const QString &qtInstallData, const QString &qtpath) +{ + QStringList result; + foreach(const QString &directory, debuggingHelperLibraryDirectories(qtInstallData, qtpath)) { +#if defined(Q_OS_WIN) + QFileInfo fi(directory + "debug/gdbmacros.dll"); +#elif defined(Q_OS_MAC) + QFileInfo fi(directory + "libgdbmacros.dylib"); +#else // generic UNIX + QFileInfo fi(directory + "libgdbmacros.so"); +#endif + result << fi.filePath(); + } + return result; +} + QString DebuggingHelperLibrary::debuggingHelperLibrary(const QString &qtInstallData, const QString &qtpath) { foreach(const QString &directory, debuggingHelperLibraryDirectories(qtInstallData, qtpath)) { diff --git a/src/plugins/projectexplorer/debugginghelper.h b/src/plugins/projectexplorer/debugginghelper.h index 3717e32b85d22dee7a9352b1136520d154882cac..a98ab2a6166d4baaa6bc4b3eb2c0380e93181e6d 100644 --- a/src/plugins/projectexplorer/debugginghelper.h +++ b/src/plugins/projectexplorer/debugginghelper.h @@ -49,11 +49,18 @@ public: static QString qtVersionForQMake(const QString &qmakePath); static bool hasDebuggingHelperLibrary(const QString &qmakePath); + static QString debuggingHelperLibrary(const QString &qmakePath); - static QString buildDebuggingHelperLibrary(const QString &qmakePath, const QString &make, const Environment &env); static QString debuggingHelperLibrary(const QString &qtInstallData, const QString &qtpath); - static QString copyDebuggingHelperLibrary(const QString &qtInstallData, const QString &qtdir); + + static QString buildDebuggingHelperLibrary(const QString &qmakePath, const QString &make, const Environment &env); static QString buildDebuggingHelperLibrary(const QString &directory, const QString &makeCommand, const QString &qmakeCommand, const QString &mkspec, const Environment &env); + + static QStringList debuggingHelperLibraryLocations(const QString &qmakePath); + static QStringList debuggingHelperLibraryLocations(const QString &qtInstallData, const QString &qtpath); + + static QString copyDebuggingHelperLibrary(const QString &qtInstallData, const QString &qtdir); + private: static QStringList debuggingHelperLibraryDirectories(const QString &qtInstallData, const QString &qtpath); static QString qtInstallDataDir(const QString &qmakePath); diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 0c9670ca6bfbecd85287fbfc852c681fa7ffb499..b9a7d2e5d2b85849feb9323319dd4190a46ec8b2 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -381,6 +381,11 @@ QString QmlRunConfiguration::dumperLibrary() const return QString(); } +QStringList QmlRunConfiguration::dumperLibraryLocations() const +{ + return QStringList(); +} + QWidget *QmlRunConfiguration::configurationWidget() { QWidget *config = new QWidget; diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index b540f85c0f9a189a268690d7cad1de9d07632df9..662abdeb8828126d0b5a940c34a6cfe64c17480c 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -150,6 +150,7 @@ public: virtual QStringList commandLineArguments() const; virtual ProjectExplorer::Environment environment() const; virtual QString dumperLibrary() const; + virtual QStringList dumperLibraryLocations() const; virtual QWidget *configurationWidget(); ProjectExplorer::ToolChain::ToolChainType toolChainType() const { return ProjectExplorer::ToolChain::OTHER; } diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp index 8d07707e7f85e76c85dcfed792a7b8d707161c1e..953f90a9ab9586e9bd1929a4c40ab2f576d08ee7 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp @@ -637,6 +637,13 @@ QString Qt4RunConfiguration::dumperLibrary() const return version->debuggingHelperLibrary(); } +QStringList Qt4RunConfiguration::dumperLibraryLocations() const +{ + Qt4Project *pro = qobject_cast<Qt4Project *>(project()); + QtVersion *version = pro->qtVersion(pro->activeBuildConfiguration()); + return version->debuggingHelperLibraryLocations();; +} + void Qt4RunConfiguration::setBaseEnvironmentBase(BaseEnvironmentBase env) { if (m_baseEnvironmentBase == env) diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.h b/src/plugins/qt4projectmanager/qt4runconfiguration.h index db7b015d42bad88adcbdf25a2781d2b193adeec6..e2fb3845114857bac5a713bf886505aa630f9eb3 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.h @@ -74,6 +74,7 @@ public: virtual QStringList commandLineArguments() const; virtual ProjectExplorer::Environment environment() const; virtual QString dumperLibrary() const; + virtual QStringList dumperLibraryLocations() const; virtual ProjectExplorer::ToolChain::ToolChainType toolChainType() const; bool isUsingDyldImageSuffix() const; diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 6e49ff08dd25d4608aa1a6cb68190027bb1d4ca5..0005049ad4e263d3b65dd925ffd0cc5f41849bd6 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -1102,6 +1102,14 @@ QString QtVersion::debuggingHelperLibrary() const return DebuggingHelperLibrary::debuggingHelperLibrary(qtInstallData, path()); } +QStringList QtVersion::debuggingHelperLibraryLocations() const +{ + QString qtInstallData = versionInfo().value("QT_INSTALL_DATA"); + if (qtInstallData.isEmpty()) + qtInstallData = path(); + return DebuggingHelperLibrary::debuggingHelperLibraryLocations(qtInstallData, path()); +} + bool QtVersion::hasDocumentation() const { updateVersionInfo(); diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h index 6debdcc9d24259627a47c9780c1bcf2a60e24881..f76dd602ea95189bed4d2f88abf28b071ce188b5 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/qt4projectmanager/qtversionmanager.h @@ -96,6 +96,7 @@ public: bool hasDebuggingHelper() const; QString debuggingHelperLibrary() const; + QStringList debuggingHelperLibraryLocations() const; // Builds a debugging library // returns the output of the commands