From c5d1ec5144d54b39f3316ac0d618d37208360f39 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 28 Nov 2018 09:59:19 +0100 Subject: [PATCH] Android: Fix debugging using old devices Uploading a binary file had been remade using base64 encoding, but base64 tool is not available on older devices. Fallback to the old approach of relying on the symlinked lib folder that contains a gdbserver if the upload failed. Task-number: QTCREATORBUG-21317 Task-number: QTCREATORBUG-21547 Change-Id: I54539d8912b1722bb799068c33e7a9175699ff70 Reviewed-by: Christian Stenger Reviewed-by: Eike Ziller --- src/plugins/android/androidrunnerworker.cpp | 27 +++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index f76f202bba2..8da140ab625 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -280,7 +280,7 @@ bool AndroidRunnerWorker::uploadFile(const QString &from, const QString &to, con runAdb({"shell", "run-as", m_packageName, "rm", to}); const QByteArray data = f.readAll(); const bool res = runAdb({"shell", "run-as", m_packageName, QString("sh -c 'base64 -d > %1'").arg(to)}, 60, data.toBase64()); - if (!res) + if (!res || m_lastRunAdbRawOutput.contains("base64: not found")) return false; return runAdb({"shell", "run-as", m_packageName, "chmod", flags, to}); } @@ -426,17 +426,34 @@ void AndroidRunnerWorker::asyncStartHelper() // e.g. on Android 8 with NDK 10e runAdb({"shell", "run-as", m_packageName, "chmod", "a+x", packageDir}); + QString gdbServerExecutable; + QString gdbServerPrefix = "./lib/"; if (m_gdbserverPath.isEmpty() || !uploadFile(m_gdbserverPath, "gdbserver")) { - emit remoteProcessFinished(tr("Cannot find/copy C++ debug server.")); - return; + // upload failed - check for old devices + if (runAdb({"shell", "run-as", m_packageName, "ls", "lib/"})) { + for (const auto &line: m_lastRunAdbRawOutput.split('\n')) { + if (line.indexOf("gdbserver") != -1/* || line.indexOf("lldb-server") != -1*/) { + gdbServerExecutable = QString::fromUtf8(line.trimmed()); + break; + } + } + } + if (gdbServerExecutable.isEmpty()) { + emit remoteProcessFinished(tr("Cannot find/copy C++ debug server.")); + return; + } + } else { + gdbServerPrefix = "./"; + gdbServerExecutable = "gdbserver"; } QString gdbServerSocket = packageDir + "/debug-socket"; - runAdb({"shell", "run-as", m_packageName, "killall", "gdbserver"}); + runAdb({"shell", "run-as", m_packageName, "killall", gdbServerExecutable}); runAdb({"shell", "run-as", m_packageName, "rm", gdbServerSocket}); + std::unique_ptr gdbServerProcess(new QProcess, deleter); gdbServerProcess->start(m_adb, selector() << "shell" << "run-as" - << m_packageName << "./gdbserver" + << m_packageName << gdbServerPrefix + gdbServerExecutable << "--multi" << "+" + gdbServerSocket); if (!gdbServerProcess->waitForStarted()) { emit remoteProcessFinished(tr("Failed to start C++ debugger."));