diff options
author | David Schulz <david.schulz@digia.com> | 2014-03-18 14:14:08 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-19 08:30:34 +0100 |
commit | 167cb8f63095c655e6897b544ee9776aae009a23 (patch) | |
tree | 04f630c2e3971b0d1b8791df4f70f026b8d41eb4 | |
parent | 9ee8213c7becfdf906ca781df4895e18b273e023 (diff) | |
download | qttools-167cb8f63095c655e6897b544ee9776aae009a23.tar.gz |
Adding debug option to the winrtrunner.
Added an option that automatically enables debugging for a package with a
provided debugger. An additinal winrtrunner option was introduced to pass
arguments to the debugger.
Change-Id: I55dbc809d26748674e5633f3eb31e7a4b8963655
Reviewed-by: Andrew Knight <andrew.knight@digia.com>
Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
-rw-r--r-- | src/winrtrunner/appxengine.cpp | 31 | ||||
-rw-r--r-- | src/winrtrunner/appxengine.h | 3 | ||||
-rw-r--r-- | src/winrtrunner/main.cpp | 38 | ||||
-rw-r--r-- | src/winrtrunner/runner.cpp | 16 | ||||
-rw-r--r-- | src/winrtrunner/runner.h | 2 | ||||
-rw-r--r-- | src/winrtrunner/runnerengine.h | 2 | ||||
-rw-r--r-- | src/winrtrunner/xapengine.cpp | 12 | ||||
-rw-r--r-- | src/winrtrunner/xapengine.h | 3 |
8 files changed, 105 insertions, 2 deletions
diff --git a/src/winrtrunner/appxengine.cpp b/src/winrtrunner/appxengine.cpp index 32f84714b..81512845a 100644 --- a/src/winrtrunner/appxengine.cpp +++ b/src/winrtrunner/appxengine.cpp @@ -685,6 +685,37 @@ bool AppxEngine::start() return true; } +bool AppxEngine::enableDebugging(const QString &debuggerExecutable, const QString &debuggerArguments) +{ + Q_D(AppxEngine); + + const QString &debuggerCommand = debuggerExecutable + QLatin1Char(' ') + debuggerArguments; + HRESULT hr = d->packageDebug->EnableDebugging(wchar(d->packageFullName), + wchar(debuggerCommand), + NULL); + if (FAILED(hr)) { + qCWarning(lcWinRtRunner).nospace() << "Failed to enable debugging for application. (0x" + << QByteArray::number(hr, 16).constData() + << ' ' << qt_error_string(hr) << ')'; + return false; + } + return true; +} + +bool AppxEngine::disableDebugging() +{ + Q_D(AppxEngine); + + HRESULT hr = d->packageDebug->DisableDebugging(wchar(d->packageFullName)); + if (FAILED(hr)) { + qCWarning(lcWinRtRunner).nospace() << "Failed to disable debugging for application. (0x" + << QByteArray::number(hr, 16).constData() + << ' ' << qt_error_string(hr) << ')'; + return false; + } + return true; +} + bool AppxEngine::suspend() { Q_D(AppxEngine); diff --git a/src/winrtrunner/appxengine.h b/src/winrtrunner/appxengine.h index 1a7893771..7bc369462 100644 --- a/src/winrtrunner/appxengine.h +++ b/src/winrtrunner/appxengine.h @@ -61,6 +61,9 @@ public: bool install(bool removeFirst = false) Q_DECL_OVERRIDE; bool remove() Q_DECL_OVERRIDE; bool start() Q_DECL_OVERRIDE; + bool enableDebugging(const QString &debuggerExecutable, + const QString &debuggerArguments) Q_DECL_OVERRIDE; + bool disableDebugging() Q_DECL_OVERRIDE; bool suspend() Q_DECL_OVERRIDE; bool waitForFinished(int secs) Q_DECL_OVERRIDE; bool stop() Q_DECL_OVERRIDE; diff --git a/src/winrtrunner/main.cpp b/src/winrtrunner/main.cpp index 9311a4725..115bc7a06 100644 --- a/src/winrtrunner/main.cpp +++ b/src/winrtrunner/main.cpp @@ -75,6 +75,22 @@ int main(int argc, char *argv[]) "force reinstallation.")); parser.addOption(startOption); + QCommandLineOption debugOption(QStringLiteral("debug"), + QLatin1String("Start the package with the debugger attached. " + "The package is installed if it is not already " + "installed. Pass --install to force " + "reinstallation."), + QLatin1Literal("debugger")); + parser.addOption(debugOption); + + QCommandLineOption debuggerArgumentsOption(QStringLiteral("debugger-arguments"), + QLatin1String("Arguments that are passed to the " + "debugger when --debug is used. If no " + "debugger was provided this option is " + "ignored."), + QLatin1String("arguments")); + parser.addOption(debuggerArgumentsOption); + QCommandLineOption suspendOption(QStringLiteral("suspend"), QLatin1String("Suspend a running package. When combined " "with --stop or --test, the app will be " @@ -196,11 +212,12 @@ int main(int argc, char *argv[]) // 7 - Stop failed // 8 - Test setup failed // 9 - Test results retrieval failed + // 10 - Enabling debugging failed // In "test" mode, the exit code of the app is returned bool ignoreErrors = parser.isSet(ignoreErrorsOption); bool testEnabled = parser.isSet(testOption); - bool startEnabled = testEnabled || parser.isSet(startOption); + bool startEnabled = testEnabled || parser.isSet(startOption) || parser.isSet(debugOption); bool suspendEnabled = parser.isSet(suspendOption); bool waitEnabled = testEnabled || parser.isSet(waitOption); bool stopEnabled = !testEnabled && parser.isSet(stopOption); // test and stop are mutually exclusive @@ -230,7 +247,24 @@ int main(int argc, char *argv[]) return ignoreErrors ? 0 : 3; } - if (startEnabled && !runner.start()) { + if (parser.isSet(debugOption)) { + const QString &debuggerExecutable = parser.value(debugOption); + const QString &debuggerArguments = parser.value(debuggerArgumentsOption); + qCDebug(lcWinRtRunner) << "Debugger: " << debuggerExecutable; + qCDebug(lcWinRtRunner) << "Debugger Options: " << debuggerArguments; + if (debuggerExecutable.isEmpty() + || !runner.enableDebugging(debuggerExecutable, debuggerArguments)) { + qCDebug(lcWinRtRunner) << "Failed to enable debugging, exiting with code 10."; + return ignoreErrors ? 0 : 10; + } + } + + bool startFailed = startEnabled && !runner.start(); + + if (parser.isSet(debugOption) && !runner.disableDebugging()) + qCDebug(lcWinRtRunner) << "Failed to disable debugging"; + + if (startFailed) { qCDebug(lcWinRtRunner) << "Start failed, exiting with code 5."; return ignoreErrors ? 0 : 5; } diff --git a/src/winrtrunner/runner.cpp b/src/winrtrunner/runner.cpp index 4e5ba43dd..9bf6a91b2 100644 --- a/src/winrtrunner/runner.cpp +++ b/src/winrtrunner/runner.cpp @@ -187,6 +187,22 @@ bool Runner::start() return d->engine->start(); } +bool Runner::enableDebugging(const QString &debuggerExecutable, const QString &debuggerArguments) +{ + Q_D(Runner); + Q_ASSERT(d->engine); + + return d->engine->enableDebugging(debuggerExecutable, debuggerArguments); +} + +bool Runner::disableDebugging() +{ + Q_D(Runner); + Q_ASSERT(d->engine); + + return d->engine->disableDebugging(); +} + bool Runner::suspend() { Q_D(Runner); diff --git a/src/winrtrunner/runner.h b/src/winrtrunner/runner.h index b5f108e47..fe0c9006c 100644 --- a/src/winrtrunner/runner.h +++ b/src/winrtrunner/runner.h @@ -68,6 +68,8 @@ public: bool install(bool removeFirst = false); bool remove(); bool start(); + bool enableDebugging(const QString &debuggerExecutable, const QString &debuggerArguments); + bool disableDebugging(); bool suspend(); bool stop(); bool wait(int maxWaitTime = 0); diff --git a/src/winrtrunner/runnerengine.h b/src/winrtrunner/runnerengine.h index 187be5f1a..de2c12ed7 100644 --- a/src/winrtrunner/runnerengine.h +++ b/src/winrtrunner/runnerengine.h @@ -53,6 +53,8 @@ public: virtual bool install(bool removeFirst = false) = 0; virtual bool remove() = 0; virtual bool start() = 0; + virtual bool enableDebugging(const QString &debugger, const QString &debuggerArguments) = 0; + virtual bool disableDebugging() = 0; virtual bool suspend() = 0; virtual bool waitForFinished(int secs) = 0; virtual bool stop() = 0; diff --git a/src/winrtrunner/xapengine.cpp b/src/winrtrunner/xapengine.cpp index 53c64c6ba..21466c9f8 100644 --- a/src/winrtrunner/xapengine.cpp +++ b/src/winrtrunner/xapengine.cpp @@ -517,6 +517,18 @@ bool XapEngine::start() return true; } +bool XapEngine::enableDebugging(const QString &debuggerExecutable, const QString &debuggerArguments) +{ + Q_UNUSED(debuggerExecutable); + Q_UNUSED(debuggerArguments); + return false; +} + +bool XapEngine::disableDebugging() +{ + return false; +} + bool XapEngine::suspend() { qCDebug(lcWinRtRunner) << __FUNCTION__; diff --git a/src/winrtrunner/xapengine.h b/src/winrtrunner/xapengine.h index cd0df78e1..7c96273e5 100644 --- a/src/winrtrunner/xapengine.h +++ b/src/winrtrunner/xapengine.h @@ -60,6 +60,9 @@ public: bool install(bool removeFirst = false) Q_DECL_OVERRIDE; bool remove() Q_DECL_OVERRIDE; bool start() Q_DECL_OVERRIDE; + bool enableDebugging(const QString &debuggerExecutable, + const QString &debuggerArguments) Q_DECL_OVERRIDE; + bool disableDebugging() Q_DECL_OVERRIDE; bool suspend() Q_DECL_OVERRIDE; bool waitForFinished(int secs) Q_DECL_OVERRIDE; bool stop() Q_DECL_OVERRIDE; |