]> git.cworth.org Git - apitrace/commitdiff
qapitrace: Support executing glretrace on a remote target host.
authorCarl Worth <cworth@cworth.org>
Thu, 9 Aug 2012 15:21:42 +0000 (08:21 -0700)
committerJosé Fonseca <jfonseca@vmware.com>
Fri, 12 Apr 2013 09:19:20 +0000 (10:19 +0100)
This is supported with a new command-line argument:

qapitrace --remote-target <HOST> <trace-file>

See README.markdown for documentation on usage and current limitations
of this feature.

README.markdown
gui/main.cpp
gui/mainwindow.cpp
gui/mainwindow.h
gui/retracer.cpp
gui/retracer.h

index d7e0d53431a0c1c54699d1cf941e1173f9427261..4bf809e9e0946d5cc0aac360852ea86229a608f6 100644 (file)
@@ -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 <HOST> <trace-file>
+    
+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 <HOST> 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 <HOST> 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 <trace-file> at the same path
+   in the filesystem as the <trace-file> path on the host system being
+   passed to the qapitrace command line.
index 471dec7939c7eccd88c4d1c882a121ea2a587b08..121e323a3344f4dae5a8d827afad3d7977888d16 100644 (file)
@@ -11,6 +11,8 @@
 #include <QVariant>
 #include <QImage>
 
+#include <stdio.h>
+
 Q_DECLARE_METATYPE(QList<ApiTraceFrame*>);
 Q_DECLARE_METATYPE(QVector<ApiTraceCall*>);
 Q_DECLARE_METATYPE(Qt::CaseSensitivity);
@@ -20,7 +22,10 @@ Q_DECLARE_METATYPE(QList<QImage>);
 
 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();
 }
index d6ebd2f9e1ecbe3a107222b684cda6c1e826c7e3..8905fbb05047c5f4ba2f76165fe978f4825fc554 100644 (file)
@@ -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 =
index 78267efca4c9f5cd98bb4eb0b48a5bc980ae3ceb..4d1358ceb0743c5337d97ebddc1436051a1b983a 100644 (file)
@@ -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);
index 2928ed63f321f31e34667e2448e1b8f765f2fdbf..2de9d23ee849de85f12c6cbf51461750ba7edf68 100644 (file)
@@ -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()) {
index af1a3d9f7b727b70f1173dcc058980bba590f6a6..915b97fe0252cf86d01d74ee7a02df775eba2a16 100644 (file)
@@ -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;