AndroidRunnerWorker: Replace jdb process with Utils::Process

Change-Id: I269c9910a6d0ca1f259a3632abe3601bcdb19f8e
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2023-08-08 21:58:37 +02:00
parent af731de4df
commit 97461f6f18
2 changed files with 16 additions and 22 deletions

View File

@@ -53,6 +53,8 @@ namespace Internal {
static const QString pidPollingScript = QStringLiteral("while [ -d /proc/%1 ]; do sleep 1; done"); static const QString pidPollingScript = QStringLiteral("while [ -d /proc/%1 ]; do sleep 1; done");
static const QRegularExpression userIdPattern("u(\\d+)_a"); static const QRegularExpression userIdPattern("u(\\d+)_a");
static const int s_jdbTimeout = 5000;
static int APP_START_TIMEOUT = 45000; static int APP_START_TIMEOUT = 45000;
static bool isTimedOut(const chrono::high_resolution_clock::time_point &start, static bool isTimedOut(const chrono::high_resolution_clock::time_point &start,
int msecs = APP_START_TIMEOUT) int msecs = APP_START_TIMEOUT)
@@ -217,8 +219,6 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa
: m_packageName(packageName) : m_packageName(packageName)
, m_psIsAlive(nullptr, deleter) , m_psIsAlive(nullptr, deleter)
, m_debugServerProcess(nullptr, deleter) , m_debugServerProcess(nullptr, deleter)
, m_jdbProcess(nullptr, deleter)
{ {
auto runControl = runner->runControl(); auto runControl = runner->runControl();
m_useLldb = Debugger::DebuggerKitAspect::engineType(runControl->kit()) m_useLldb = Debugger::DebuggerKitAspect::engineType(runControl->kit())
@@ -755,7 +755,7 @@ void AndroidRunnerWorker::handleJdbWaiting()
} }
m_afterFinishAdbCommands.push_back(removeForward.join(' ')); m_afterFinishAdbCommands.push_back(removeForward.join(' '));
FilePath jdbPath = AndroidConfigurations::currentConfig().openJDKLocation() const FilePath jdbPath = AndroidConfigurations::currentConfig().openJDKLocation()
.pathAppended("bin/jdb").withExecutableSuffix(); .pathAppended("bin/jdb").withExecutableSuffix();
QStringList jdbArgs("-connect"); QStringList jdbArgs("-connect");
@@ -763,14 +763,16 @@ void AndroidRunnerWorker::handleJdbWaiting()
.arg(m_localJdbServerPort.toString()); .arg(m_localJdbServerPort.toString());
qCDebug(androidRunWorkerLog).noquote() qCDebug(androidRunWorkerLog).noquote()
<< "Starting JDB:" << CommandLine(jdbPath, jdbArgs).toUserOutput(); << "Starting JDB:" << CommandLine(jdbPath, jdbArgs).toUserOutput();
std::unique_ptr<QProcess, Deleter> jdbProcess(new QProcess, &deleter); m_jdbProcess.reset(new Process);
jdbProcess->setProcessChannelMode(QProcess::MergedChannels); m_jdbProcess->setProcessChannelMode(QProcess::MergedChannels);
jdbProcess->start(jdbPath.toString(), jdbArgs); m_jdbProcess->setCommand({jdbPath, jdbArgs});
if (!jdbProcess->waitForStarted()) { m_jdbProcess->setReaperTimeout(s_jdbTimeout);
m_jdbProcess->start();
if (!m_jdbProcess->waitForStarted()) {
emit remoteProcessFinished(Tr::tr("Failed to start JDB.")); emit remoteProcessFinished(Tr::tr("Failed to start JDB."));
m_jdbProcess.reset();
return; return;
} }
m_jdbProcess = std::move(jdbProcess);
m_jdbProcess->setObjectName("JdbProcess"); m_jdbProcess->setObjectName("JdbProcess");
} }
@@ -780,7 +782,7 @@ void AndroidRunnerWorker::handleJdbSettled()
auto waitForCommand = [this] { auto waitForCommand = [this] {
for (int i = 0; i < 120 && m_jdbProcess->state() == QProcess::Running; ++i) { for (int i = 0; i < 120 && m_jdbProcess->state() == QProcess::Running; ++i) {
m_jdbProcess->waitForReadyRead(500); m_jdbProcess->waitForReadyRead(500);
QByteArray lines = m_jdbProcess->readAll(); const QByteArray lines = m_jdbProcess->readAllRawStandardOutput();
const auto linesList = lines.split('\n'); const auto linesList = lines.split('\n');
for (const auto &line : linesList) { for (const auto &line : linesList) {
auto msg = line.trimmed(); auto msg = line.trimmed();
@@ -792,22 +794,14 @@ void AndroidRunnerWorker::handleJdbSettled()
}; };
const QStringList commands{"threads", "cont", "exit"}; const QStringList commands{"threads", "cont", "exit"};
const int jdbTimeout = 5000;
for (const QString &command : commands) { for (const QString &command : commands) {
if (waitForCommand()) { if (waitForCommand())
m_jdbProcess->write(QString("%1\n").arg(command).toLatin1()); m_jdbProcess->write(QString("%1\n").arg(command));
m_jdbProcess->waitForBytesWritten(jdbTimeout);
}
} }
if (!m_jdbProcess->waitForFinished(jdbTimeout)) { if (!m_jdbProcess->waitForFinished(s_jdbTimeout)) {
m_jdbProcess->terminate(); m_jdbProcess.reset();
if (!m_jdbProcess->waitForFinished(jdbTimeout)) {
qCDebug(androidRunWorkerLog) << "Killing JDB process";
m_jdbProcess->kill();
m_jdbProcess->waitForFinished();
}
} else if (m_jdbProcess->exitStatus() == QProcess::NormalExit && m_jdbProcess->exitCode() == 0) { } else if (m_jdbProcess->exitStatus() == QProcess::NormalExit && m_jdbProcess->exitCode() == 0) {
qCDebug(androidRunWorkerLog) << "JDB settled"; qCDebug(androidRunWorkerLog) << "JDB settled";
return; return;

View File

@@ -104,7 +104,7 @@ private:
JDBState m_jdbState = JDBState::Idle; JDBState m_jdbState = JDBState::Idle;
Utils::Port m_localJdbServerPort; Utils::Port m_localJdbServerPort;
std::unique_ptr<QProcess, Deleter> m_debugServerProcess; // gdbserver or lldb-server std::unique_ptr<QProcess, Deleter> m_debugServerProcess; // gdbserver or lldb-server
std::unique_ptr<QProcess, Deleter> m_jdbProcess; std::unique_ptr<Utils::Process> m_jdbProcess;
QString m_deviceSerialNumber; QString m_deviceSerialNumber;
int m_apiLevel = -1; int m_apiLevel = -1;
QString m_extraAppParams; QString m_extraAppParams;