From: Carl Worth Date: Thu, 9 Aug 2012 15:21:42 +0000 (-0700) Subject: qapitrace: Support executing glretrace on a remote target host. X-Git-Url: https://git.cworth.org/git?p=apitrace;a=commitdiff_plain;h=7257dfcc57b3a1af576a8a2ca69992ae8d77dea4 qapitrace: Support executing glretrace on a remote target host. This is supported with a new command-line argument: qapitrace --remote-target See README.markdown for documentation on usage and current limitations of this feature. --- diff --git a/README.markdown b/README.markdown index d7e0d53..4bf809e 100644 --- a/README.markdown +++ b/README.markdown @@ -419,3 +419,54 @@ Or on Windows: [![githalytics.com alpha](https://cruel-carlota.pagodabox.com/c1062ad633aa7a458e9d7520021307e4 "githalytics.com")](http://githalytics.com/apitrace/apitrace) + +Advanced GUI usage +================== +qapitrace has rudimentary support for replaying traces on a remote +target device. This can be useful, for example, when developing for an +embedded system. The primary GUI will run on the local host, while any +replays will be performed on the target device. + +In order to target a remote device, use the command-line: + + qapitrace --remote-target + +In order for this to work, the following must be available in the +system configuration: + +1. It must be possible for the current user to initiate an ssh session + that has access to the target's window system. The command to be + exectuted by qapitrace will be: + + ssh glretrace + + For example, if the target device is using the X window system, one + can test whether an ssh session has access to the target X server + with: + + ssh xdpyinfo + + If this command fails with something like "cannot open display" + then the user will have to configure the target to set the DISPLAY + environment variable, (for example, setting DISPLAY=:0 in the + .bashrc file on the target or similar). + + Also, note that if the ssh session requires a custom username, then + this must be configured on the host side so that ssh can be + initiated without a username. + + For example, if you normally connect with "ssh user@192.168.0.2" + you could configure ~/.ssh/config on the host with a block such as: + + Host target + HostName 192.168.0.2 + User user + + And after this you should be able to connect with "ssh target" so + that you can also use "qapitrace --remote-target target". + +2. The target host must have a functional glretrace binary available + +3. The target host must have access to at the same path + in the filesystem as the path on the host system being + passed to the qapitrace command line. diff --git a/gui/main.cpp b/gui/main.cpp index 471dec7..121e323 100644 --- a/gui/main.cpp +++ b/gui/main.cpp @@ -11,6 +11,8 @@ #include #include +#include + Q_DECLARE_METATYPE(QList); Q_DECLARE_METATYPE(QVector); Q_DECLARE_METATYPE(Qt::CaseSensitivity); @@ -20,7 +22,10 @@ Q_DECLARE_METATYPE(QList); static void usage(void) { - qWarning("usage: qapitrace [TRACE] [CALLNO]\n"); + qWarning("usage: qapitrace [options] [TRACE] [CALLNO]\n" + "Valid options include:\n" + " -h, --help Print this help message\n" + " --remote-target HOST Replay trace on remote target HOST\n"); } int main(int argc, char **argv) @@ -45,6 +50,7 @@ int main(int argc, char **argv) #endif QStringList args = app.arguments(); + QString remoteTarget; int i = 1; while (i < args.count()) { @@ -55,6 +61,13 @@ int main(int argc, char **argv) ++i; if (arg == QLatin1String("--")) { break; + } else if (arg == QLatin1String("--remote-target")) { + if (i == args.count()) { + qWarning("Option --remote-target requires an argument.\n"); + exit(1); + } + remoteTarget = args[i]; + ++i; } else if (arg == QLatin1String("-h") || arg == QLatin1String("--help")) { usage(); @@ -78,5 +91,9 @@ int main(int argc, char **argv) window.loadTrace(fileName, callNum); } + if (remoteTarget.length()) { + window.setRemoteTarget(remoteTarget); + } + app.exec(); } diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index d6ebd2f..8905fbb 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -109,6 +109,11 @@ void MainWindow::loadTrace(const QString &fileName, int callNum) newTraceFile(fileName); } +void MainWindow::setRemoteTarget(const QString &host) +{ + m_retracer->setRemoteTarget(host); +} + void MainWindow::callItemSelected(const QModelIndex &index) { ApiTraceEvent *event = diff --git a/gui/mainwindow.h b/gui/mainwindow.h index 78267ef..4d1358c 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -45,6 +45,8 @@ public: public slots: void loadTrace(const QString &fileName, int callNum = -1); + void setRemoteTarget(const QString &host); + private slots: void callItemSelected(const QModelIndex &index); void callItemActivated(const QModelIndex &index); diff --git a/gui/retracer.cpp b/gui/retracer.cpp index 2928ed6..2de9d23 100644 --- a/gui/retracer.cpp +++ b/gui/retracer.cpp @@ -149,6 +149,16 @@ void Retracer::setFileName(const QString &name) m_fileName = name; } +QString Retracer::remoteTarget() const +{ + return m_remoteTarget; +} + +void Retracer::setRemoteTarget(const QString &host) +{ + m_remoteTarget = host; +} + void Retracer::setAPI(trace::API api) { m_api = api; @@ -303,6 +313,16 @@ void Retracer::run() arguments << m_fileName; + /* + * Support remote execution on a separate target. + */ + + if (m_remoteTarget.length() != 0) { + arguments.prepend(prog); + arguments.prepend(m_remoteTarget); + prog = QLatin1String("ssh"); + } + /* * Start the process. */ @@ -472,7 +492,6 @@ void Retracer::run() if (m_captureState) { ApiTraceState *state = new ApiTraceState(parsedJson); emit foundState(state); - msg = QLatin1String("State fetched."); } if (m_captureThumbnails && !thumbnails.isEmpty()) { diff --git a/gui/retracer.h b/gui/retracer.h index af1a3d9..915b97f 100644 --- a/gui/retracer.h +++ b/gui/retracer.h @@ -20,6 +20,9 @@ public: QString fileName() const; void setFileName(const QString &name); + QString remoteTarget() const; + void setRemoteTarget(const QString &host); + void setAPI(trace::API api); bool isBenchmarking() const; @@ -56,6 +59,7 @@ protected: private: QString m_fileName; + QString m_remoteTarget; trace::API m_api; bool m_benchmarking; bool m_doubleBuffered;