forked from qt-creator/qt-creator
AndroidRunnerWorker: Replace jdb process with Utils::Process
Change-Id: I269c9910a6d0ca1f259a3632abe3601bcdb19f8e Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user