summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@digia.com>2014-03-18 14:14:08 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-19 08:30:34 +0100
commit167cb8f63095c655e6897b544ee9776aae009a23 (patch)
tree04f630c2e3971b0d1b8791df4f70f026b8d41eb4
parent9ee8213c7becfdf906ca781df4895e18b273e023 (diff)
downloadqttools-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.cpp31
-rw-r--r--src/winrtrunner/appxengine.h3
-rw-r--r--src/winrtrunner/main.cpp38
-rw-r--r--src/winrtrunner/runner.cpp16
-rw-r--r--src/winrtrunner/runner.h2
-rw-r--r--src/winrtrunner/runnerengine.h2
-rw-r--r--src/winrtrunner/xapengine.cpp12
-rw-r--r--src/winrtrunner/xapengine.h3
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;