[![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.
#include <QVariant>
#include <QImage>
+#include <stdio.h>
+
Q_DECLARE_METATYPE(QList<ApiTraceFrame*>);
Q_DECLARE_METATYPE(QVector<ApiTraceCall*>);
Q_DECLARE_METATYPE(Qt::CaseSensitivity);
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)
#endif
QStringList args = app.arguments();
+ QString remoteTarget;
int i = 1;
while (i < args.count()) {
++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();
window.loadTrace(fileName, callNum);
}
+ if (remoteTarget.length()) {
+ window.setRemoteTarget(remoteTarget);
+ }
+
app.exec();
}
newTraceFile(fileName);
}
+void MainWindow::setRemoteTarget(const QString &host)
+{
+ m_retracer->setRemoteTarget(host);
+}
+
void MainWindow::callItemSelected(const QModelIndex &index)
{
ApiTraceEvent *event =
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);
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;
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.
*/
if (m_captureState) {
ApiTraceState *state = new ApiTraceState(parsedJson);
emit foundState(state);
- msg = QLatin1String("State fetched.");
}
if (m_captureThumbnails && !thumbnails.isEmpty()) {
QString fileName() const;
void setFileName(const QString &name);
+ QString remoteTarget() const;
+ void setRemoteTarget(const QString &host);
+
void setAPI(trace::API api);
bool isBenchmarking() const;
private:
QString m_fileName;
+ QString m_remoteTarget;
trace::API m_api;
bool m_benchmarking;
bool m_doubleBuffered;