Debugger: Enforce use of target-async for Android gdbserver

Since NDK r11 this seems to be needed to get breakpoints set
correctly on Linux and Mac.

Change-Id: I54281feecc0a915d4761228c612b72889756aecf
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2016-04-19 14:01:44 +02:00
parent 043218971f
commit 3d34ccf4d9
5 changed files with 14 additions and 3 deletions

View File

@@ -42,6 +42,8 @@
#include <qtsupport/qtkitinformation.h> #include <qtsupport/qtkitinformation.h>
#include <utils/hostosinfo.h>
#include <QDirIterator> #include <QDirIterator>
#include <QTcpServer> #include <QTcpServer>
@@ -93,6 +95,8 @@ RunControl *AndroidDebugSupport::createDebugRunControl(AndroidRunConfiguration *
params.displayName = AndroidManager::packageName(target); params.displayName = AndroidManager::packageName(target);
params.remoteSetupNeeded = true; params.remoteSetupNeeded = true;
params.useContinueInsteadOfRun = true; params.useContinueInsteadOfRun = true;
if (!Utils::HostOsInfo::isWindowsHost()) // Workaround for NDK 11c(b?)
params.useTargetAsync = true;
auto aspect = runConfig->extraAspect<DebuggerRunConfigurationAspect>(); auto aspect = runConfig->extraAspect<DebuggerRunConfigurationAspect>();
if (aspect->useCppDebugger()) { if (aspect->useCppDebugger()) {

View File

@@ -98,6 +98,7 @@ public:
// Used by Android to avoid false positives on warnOnRelease // Used by Android to avoid false positives on warnOnRelease
bool skipExecutableValidation = false; bool skipExecutableValidation = false;
bool useTargetAsync = false;
QStringList additionalSearchDirectories; QStringList additionalSearchDirectories;
// Used by iOS. // Used by iOS.

View File

@@ -4436,7 +4436,12 @@ bool GdbEngine::usesExecInterrupt() const
{ {
DebuggerStartMode mode = runParameters().startMode; DebuggerStartMode mode = runParameters().startMode;
return (mode == AttachToRemoteServer || mode == AttachToRemoteProcess) return (mode == AttachToRemoteServer || mode == AttachToRemoteProcess)
&& boolSetting(TargetAsync); && usesTargetAsync();
}
bool GdbEngine::usesTargetAsync() const
{
return runParameters().useTargetAsync || boolSetting(TargetAsync);
} }
void GdbEngine::scheduleTestResponse(int testCase, const QByteArray &response) void GdbEngine::scheduleTestResponse(int testCase, const QByteArray &response)

View File

@@ -423,6 +423,7 @@ protected:
bool m_terminalTrap; bool m_terminalTrap;
bool m_temporaryStopPending; bool m_temporaryStopPending;
bool usesExecInterrupt() const; bool usesExecInterrupt() const;
bool usesTargetAsync() const;
QHash<int, QByteArray> m_scheduledTestResponses; QHash<int, QByteArray> m_scheduledTestResponses;
QSet<int> m_testCases; QSet<int> m_testCases;

View File

@@ -205,7 +205,7 @@ void GdbRemoteServerEngine::setupInferior()
// gdb/mi/mi-main.c:1958: internal-error: // gdb/mi/mi-main.c:1958: internal-error:
// mi_execute_async_cli_command: Assertion `is_running (inferior_ptid)' // mi_execute_async_cli_command: Assertion `is_running (inferior_ptid)'
// failed.\nA problem internal to GDB has been detected,[...] // failed.\nA problem internal to GDB has been detected,[...]
if (boolSetting(TargetAsync)) if (usesTargetAsync())
runCommand({"set target-async on", NoFlags, CB(handleSetTargetAsync)}); runCommand({"set target-async on", NoFlags, CB(handleSetTargetAsync)});
if (symbolFile.isEmpty()) { if (symbolFile.isEmpty()) {
@@ -429,7 +429,7 @@ void GdbRemoteServerEngine::handleExecRun(const DebuggerResponse &response)
void GdbRemoteServerEngine::interruptInferior2() void GdbRemoteServerEngine::interruptInferior2()
{ {
QTC_ASSERT(state() == InferiorStopRequested, qDebug() << state()); QTC_ASSERT(state() == InferiorStopRequested, qDebug() << state());
if (boolSetting(TargetAsync)) { if (usesTargetAsync()) {
runCommand({"-exec-interrupt", NoFlags, CB(handleInterruptInferior)}); runCommand({"-exec-interrupt", NoFlags, CB(handleInterruptInferior)});
} else if (m_isQnxGdb && HostOsInfo::isWindowsHost()) { } else if (m_isQnxGdb && HostOsInfo::isWindowsHost()) {
m_gdbProc.interrupt(); m_gdbProc.interrupt();