Android: Fix the executable permission of the package dir

This fixes the problem where gdb fails to connect to the gdbserver on
Android with API > 23

Task-number: QTCREATORBUG-20583
Change-Id: Ia581f8ae5dd6d819ac5ffedf633d1423e9e30074
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
This commit is contained in:
Vikas Pachdha
2018-08-06 11:56:20 +02:00
parent f45f1a8cef
commit 960fccc763

View File

@@ -399,13 +399,16 @@ void AndroidRunnerWorker::asyncStartHelper()
args << "-n" << m_intentName; args << "-n" << m_intentName;
if (m_useCppDebugger) { if (m_useCppDebugger) {
args << "-D"; args << "-D";
QString gdbServerSocket;
// run-as <package-name> pwd fails on API 22 so route the pwd through shell. // run-as <package-name> pwd fails on API 22 so route the pwd through shell.
if (!runAdb({"shell", "run-as", m_packageName, "/system/bin/sh", "-c", "pwd"})) { if (!runAdb({"shell", "run-as", m_packageName, "/system/bin/sh", "-c", "pwd"})) {
emit remoteProcessFinished(tr("Failed to get process path. Reason: %1.").arg(m_lastRunAdbError)); emit remoteProcessFinished(tr("Failed to get process path. Reason: %1.").arg(m_lastRunAdbError));
return; return;
} }
gdbServerSocket = QString::fromUtf8(m_lastRunAdbRawOutput.trimmed()) + "/debug-socket";
QString packageDir = QString::fromUtf8(m_lastRunAdbRawOutput.trimmed());
// Add executable flag to package dir. Gdb can't connect to running server on device on
// e.g. on Android 8 with NDK 10e
runAdb({"shell", "run-as", m_packageName, "chmod", "a+x", packageDir});
QString gdbServerExecutable; QString gdbServerExecutable;
if (!runAdb({"shell", "run-as", m_packageName, "ls", "lib/"})) { if (!runAdb({"shell", "run-as", m_packageName, "ls", "lib/"})) {
@@ -425,6 +428,7 @@ void AndroidRunnerWorker::asyncStartHelper()
return; return;
} }
QString gdbServerSocket = packageDir + "/debug-socket";
runAdb({"shell", "run-as", m_packageName, "killall", gdbServerExecutable}); runAdb({"shell", "run-as", m_packageName, "killall", gdbServerExecutable});
runAdb({"shell", "run-as", m_packageName, "rm", gdbServerSocket}); runAdb({"shell", "run-as", m_packageName, "rm", gdbServerSocket});
std::unique_ptr<QProcess, Deleter> gdbServerProcess(new QProcess, deleter); std::unique_ptr<QProcess, Deleter> gdbServerProcess(new QProcess, deleter);