blob: ec67999f80416bb1117e8ff94323a2d3e7653c76 [file] [log] [blame]
José Fonseca2208f5a2015-02-05 12:05:11 +00001# Basic usage #
José Fonseca21278192015-01-20 14:27:04 +00002
3Run the application you want to trace as
4
Chris 'Xenon' Hanson5d5d82b2016-08-31 12:35:57 -06005 apitrace trace --api [gl|egl|d3d7|d3d8|d3d9|dxgi] /path/to/application [args...]
José Fonseca21278192015-01-20 14:27:04 +00006
7and it will generate a trace named `application.trace` in the current
8directory. You can specify the written trace filename by passing the
Chris 'Xenon' Hanson5d5d82b2016-08-31 12:35:57 -06009`--output` command line option. The default API is `gl` if none is specified.
José Fonseca21278192015-01-20 14:27:04 +000010
11Problems while tracing (e.g, if the application uses calls/parameters
12unsupported by apitrace) will be reported via stderr output on Unices. On
13Windows you'll need to run
14[DebugView](http://technet.microsoft.com/en-us/sysinternals/bb896647) to view
15these messages.
16
José Fonseca91da6b52015-01-20 14:48:03 +000017If you cannot obtain a trace, check the [application specific instructions on
18the wiki](https://github.com/apitrace/apitrace/wiki/Applications), or the
19[manual tracing instructions below](#tracing-manually).
José Fonseca21278192015-01-20 14:27:04 +000020
21View the trace with
22
23 apitrace dump application.trace
24
25Replay an OpenGL trace with
26
27 apitrace replay application.trace
28
29Pass the `--sb` option to use a single buffered visual. Pass `--help` to
30`apitrace replay` for more options.
31
Jose Fonsecabc242172018-11-21 10:43:34 +000032On dual GPU macs one can choose the GPU by setting the `VENDOR` environment
33variable to the desired GPU vendor (e.g, `Intel`, or `AMD`.)
34
José Fonseca91da6b52015-01-20 14:48:03 +000035If you run into problems [check if it is a known issue and file an issue if
36not](BUGS.markdown).
37
José Fonseca21278192015-01-20 14:27:04 +000038
José Fonseca2208f5a2015-02-05 12:05:11 +000039# Basic GUI usage #
José Fonseca21278192015-01-20 14:27:04 +000040
41Start the GUI as
42
43 qapitrace application.trace
44
45You can also tell the GUI to go directly to a specific call
46
47 qapitrace application.trace 12345
48
Jose Fonsecaa5255fd2015-01-26 14:38:39 +000049Press `Ctrl-T` to see per-frame thumbnails. And while inspecting frame calls,
50press again `Ctrl-T` to see per-draw call thumbnails.
51
José Fonseca21278192015-01-20 14:27:04 +000052
José Fonseca2208f5a2015-02-05 12:05:11 +000053# Backtrace Capturing #
José Fonseca21278192015-01-20 14:27:04 +000054
José Fonseca91da6b52015-01-20 14:48:03 +000055apitrace now has the ability to capture the call stack to an OpenGL call on
56certain OSes (only Android and Linux at the moment). This can be helpful in
57determing which piece of code made that glDrawArrays call.
José Fonseca21278192015-01-20 14:27:04 +000058
59To use the feature you need to set an environment variable with the list of GL
60call prefixes you wish to capture stack traces to.
61
62 export APITRACE_BACKTRACE="glDraw* glUniform*"
63
64The backtrace data will show up in qapitrace in the bottom section as a new tab.
65
66
José Fonseca2208f5a2015-02-05 12:05:11 +000067# Advanced command line usage #
José Fonseca21278192015-01-20 14:27:04 +000068
69
José Fonseca2208f5a2015-02-05 12:05:11 +000070## Call sets ##
José Fonseca21278192015-01-20 14:27:04 +000071
72Several tools take `CALLSET` arguments, e.g:
73
74 apitrace dump --calls=CALLSET foo.trace
75 apitrace dump-images --calls=CALLSET foo.trace
76 apitrace trim --calls=CALLSET1 --calls=CALLSET2 foo.trace
77
78The call syntax is very flexible. Here are a few examples:
79
80 * `4` one call
81
82 * `0,2,4,5` set of calls
83
84 * `"0 2 4 5"` set of calls (commas are optional and can be replaced with whitespace)
85
86 * `0-100/2` calls 1, 3, 5, ..., 99
87
88 * `0-1000/draw` all draw calls between 0 and 1000
89
90 * `0-1000/fbo` all fbo changes between calls 0 and 1000
91
92 * `frame` all calls at end of frames
93
94 * `@foo.txt` read call numbers from `foo.txt`, using the same syntax as above
95
96
97
José Fonseca2208f5a2015-02-05 12:05:11 +000098## Tracing manually ##
José Fonseca21278192015-01-20 14:27:04 +000099
100### Linux ###
101
102On 64 bits systems, you'll need to determine whether the application is 64 bits
103or 32 bits. This can be done by doing
104
105 file /path/to/application
106
107But beware of wrapper shell scripts -- what matters is the architecture of the
108main process.
109
110Run the GLX application you want to trace as
111
112 LD_PRELOAD=/path/to/apitrace/wrappers/glxtrace.so /path/to/application
113
114and it will generate a trace named `application.trace` in the current
115directory. You can specify the written trace filename by setting the
116`TRACE_FILE` environment variable before running.
117
118For EGL applications you will need to use `egltrace.so` instead of
119`glxtrace.so`.
120
121The `LD_PRELOAD` mechanism should work with the majority of applications. There
122are some applications (e.g., Unigine Heaven, Android GPU emulator, etc.), that
123have global function pointers with the same name as OpenGL entrypoints, living in a
124shared object that wasn't linked with `-Bsymbolic` flag, so relocations to
125those global function pointers get overwritten with the address to our wrapper
126library, and the application will segfault when trying to write to them. For
127these applications it is possible to trace by using `glxtrace.so` as an
128ordinary `libGL.so` and injecting it via `LD_LIBRARY_PATH`:
129
130 ln -s glxtrace.so wrappers/libGL.so
131 ln -s glxtrace.so wrappers/libGL.so.1
132 ln -s glxtrace.so wrappers/libGL.so.1.2
133 export LD_LIBRARY_PATH=/path/to/apitrace/wrappers:$LD_LIBRARY_PATH
134 export TRACE_LIBGL=/path/to/real/libGL.so.1
135 /path/to/application
136
137If you are an application developer, you can avoid this either by linking with
138`-Bsymbolic` flag, or by using some unique prefix for your function pointers.
139
140See the `ld.so` man page for more information about `LD_PRELOAD` and
141`LD_LIBRARY_PATH` environment flags.
142
José Fonseca21278192015-01-20 14:27:04 +0000143### Mac OS X ###
144
145Run the application you want to trace as
146
147 DYLD_FRAMEWORK_PATH=/path/to/apitrace/wrappers /path/to/application
148
149Note that although Mac OS X has an `LD_PRELOAD` equivalent,
150`DYLD_INSERT_LIBRARIES`, it is mostly useless because it only works with
151`DYLD_FORCE_FLAT_NAMESPACE=1` which breaks most applications. See the `dyld` man
152page for more details about these environment flags.
153
154### Windows ###
155
156When tracing third-party applications, you can identify the target
157application's main executable, either by:
158
159* right clicking on the application's icon in the _Start Menu_, choose
160 _Properties_, and see the _Target_ field;
161
162* or by starting the application, run Windows Task Manager (taskmgr.exe), right
163 click on the application name in the _Applications_ tab, choose _Go To Process_,
164 note the highlighted _Image Name_, and search it on `C:\Program Files` or
165 `C:\Program Files (x86)`.
166
167On 64 bits Windows, you'll need to determine ether the application is a 64 bits
168or 32 bits. 32 bits applications will have a `*32` suffix in the _Image Name_
169column of the _Processes_ tab of _Windows Task Manager_ window.
170
171You also need to know which graphics API is being used. If you are unsure, the
172simplest way to determine what API an application uses is to:
173
174* download and run [Process Explorer](http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)
175
176* search and select the application's process in _Process Explorer_
177
178* list the DLLs by pressing `Ctrl + D`
179
180* sort DLLs alphabetically, and look for the DLLs such as `opengl32.dll`,
Jose Fonsecafc7902b2016-03-06 07:29:32 +0000181 `d3d9.dll`, etc.
José Fonseca21278192015-01-20 14:27:04 +0000182
Jose Fonsecab01a7302018-10-29 16:13:16 +0000183Copy the appropriate DLL from wrappers directory to the directory with the
184application you want to trace.
185
186| API | DLLs to copy |
187| ------ | ---------------------------------- |
188| OpenGL | opengl32.dll |
189| D3D11 | dxgitrace.dll, dxgi.dll, d3d11.dll |
190| D3D9 | d3d9.dll |
191| D3D8 | d3d8.dll |
192
José Fonseca21278192015-01-20 14:27:04 +0000193Then run the application as usual.
194
195You can specify the written trace filename by setting the `TRACE_FILE`
196environment variable before running.
197
198For D3D10 and higher you really must use `apitrace trace -a DXGI ...`. This is
199because D3D10-11 API span many DLLs which depend on each other, and once a DLL
200with a given name is loaded Windows will reuse it for LoadLibrary calls of the
201same name, causing internal calls to be traced erroneously. `apitrace trace`
202solves this issue by injecting a DLL `dxgitrace.dll` and patching all modules
203to hook only the APIs of interest.
204
205
José Fonseca2208f5a2015-02-05 12:05:11 +0000206## Emitting annotations to the trace ##
José Fonseca21278192015-01-20 14:27:04 +0000207
José Fonsecae354d8d2015-02-06 10:30:01 +0000208### OpenGL annotations ###
209
José Fonseca21278192015-01-20 14:27:04 +0000210From within OpenGL applications you can embed annotations in the trace file
211through the following extensions:
212
213* [`GL_KHR_debug`](http://www.opengl.org/registry/specs/KHR/debug.txt)
214
215* [`GL_ARB_debug_output`](http://www.opengl.org/registry/specs/ARB/debug_output.txt)
216
217* [`GL_EXT_debug_marker`](http://www.khronos.org/registry/gles/extensions/EXT/EXT_debug_marker.txt)
218
219* [`GL_EXT_debug_label`](http://www.opengl.org/registry/specs/EXT/EXT_debug_label.txt)
220
221* [`GL_AMD_debug_output`](http://www.opengl.org/registry/specs/AMD/debug_output.txt)
222
223* [`GL_GREMEDY_string_marker`](http://www.opengl.org/registry/specs/GREMEDY/string_marker.txt)
224
225* [`GL_GREMEDY_frame_terminator`](http://www.opengl.org/registry/specs/GREMEDY/frame_terminator.txt)
226
227**apitrace** will advertise and intercept these OpenGL extensions regardless
228of whether the OpenGL implementation supports them or not. So all you have
229to do is to use these extensions when available, and you can be sure they
230will be available when tracing inside **apitrace**.
231
232For example, if you use [GLEW](http://glew.sourceforge.net/) to dynamically
233detect and use OpenGL extensions, you could easily accomplish this by doing:
234
235 void foo() {
236
237 if (GLEW_KHR_debug) {
238 glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, __FUNCTION__);
239 }
240
241 ...
242
243 if (GLEW_KHR_debug) {
244 glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER,
245 0, GL_DEBUG_SEVERITY_MEDIUM, -1, "bla bla");
246 }
247
248 ...
249
250 if (GLEW_KHR_debug) {
251 glPopDebugGroup();
252 }
253
254 }
255
256This has the added advantage of working equally well with other OpenGL debugging tools.
257
258Also, provided that the OpenGL implementation supports `GL_KHR_debug`, labels
259defined via glObjectLabel() , and the labels of several objects (textures,
260framebuffers, samplers, etc. ) will appear in the GUI state dumps, in the
261parameters tab.
262
263
264For OpenGL ES applications you can embed annotations in the trace file through the
265[`GL_KHR_debug`](http://www.khronos.org/registry/gles/extensions/KHR/debug.txt) or
266[`GL_EXT_debug_marker`](http://www.khronos.org/registry/gles/extensions/EXT/EXT_debug_marker.txt)
267extensions.
268
269
José Fonsecae354d8d2015-02-06 10:30:01 +0000270### Direct3D annotations ###
271
José Fonseca21278192015-01-20 14:27:04 +0000272For Direct3D applications you can follow the standard procedure for
273[adding user defined events to Visual Studio Graphics Debugger / PIX](http://msdn.microsoft.com/en-us/library/vstudio/hh873200.aspx):
274
José Fonsecae354d8d2015-02-06 10:30:01 +0000275- `D3DPERF_BeginEvent`, `D3DPERF_EndEvent`, and `D3DPERF_SetMarker` for D3D9,
276 D3D10, and D3D11.0 applications.
José Fonseca21278192015-01-20 14:27:04 +0000277
278- `ID3DUserDefinedAnnotation::BeginEvent`,
279 `ID3DUserDefinedAnnotation::EndEvent`, and
280 `ID3DUserDefinedAnnotation::SetMarker` for D3D11.1 applications.
281
José Fonseca3be2c672015-02-06 15:36:40 +0000282And for [naming objects](http://blogs.msdn.com/b/chuckw/archive/2010/04/15/object-naming.aspx)
283which support `SetPrivateData` method:
284
285 pObject->SetPrivateData(WKPDID_D3DDebugObjectName, strlen(szName), szName);
286
287Note that [programmatic capture interfaces](https://msdn.microsoft.com/en-us/library/hh780905.aspx)
288are currently _not_ supported.
289
290See also:
291
292* <http://seanmiddleditch.com/direct3d-11-debug-api-tricks/>
293
294* <http://blogs.msdn.com/b/chuckw/archive/2012/11/30/direct3d-sdk-debug-layer-tricks.aspx>
295
José Fonseca21278192015-01-20 14:27:04 +0000296
José Fonsecabda81f02015-02-05 12:15:15 +0000297## Mask OpenGL features ##
298
299It's now possible to mask some of OpenGL features while tracing via a configuration file:
300
301 * `$XDG_CONFIG_HOME/apitrace/gltrace.conf` or `$HOME/.config/apitrace/gltrace.conf` on Linux
302
303 * `$HOME/Library/Preferences/apitrace/gltrace.conf` on MacOS X
304
305 * `%LOCALAPPDATA%\apitrace\gltrace.conf` on Windows
306
307Here's an example `gltrace.conf` config file showing some variables:
308
309 # comment line
310 GL_VERSION = "2.0"
311 GL_VENDOR = "Acme, Inc."
312 GL_EXTENSIONS = "GL_EXT_texture_swizzle GL_ARB_multitexture"
313 GL_RENDERER = "Acme rasterizer"
314 GL_SHADING_LANGUAGE_VERSION = "1.30"
315 GL_MAX_TEXTURE_SIZE = 1024
316
317This basically overrides the respective `glGetString()` and `glGetIntegerv()`
318parameters.
319
320String values are contained inside `""` pairs and may span multiple lines.
321Integer values are given without quotes.
322
comicfansff00df32016-01-25 09:02:54 +0800323## Identify OpenGL object leaks ##
324
325You can identify OpenGL object leaks by running:
326
327 apitrace leaks application.trace
328
329This will print leaked object list and its generated call numbers.
330
331apitrace provides very basic leak tracking: it tracks all textures/
332framebuffers/renderbuffers/buffers name generate and delete call. If a object is not
333deleted until context destruction, it's treated as 'leaked'. This logic doesn't
334consider multi-context in multi-thread situation, so may report incorrect
335results in such scenarios.
336
337To use this fomr the GUI, go to menu -> Trace -> LeakTrace
José Fonsecabda81f02015-02-05 12:15:15 +0000338
José Fonseca2208f5a2015-02-05 12:05:11 +0000339## Dump OpenGL state at a particular call ##
José Fonseca21278192015-01-20 14:27:04 +0000340
341You can get a dump of the bound OpenGL state at call 12345 by doing:
342
343 apitrace replay -D 12345 application.trace > 12345.json
344
345This is precisely the mechanism the GUI uses to obtain its own state.
346
347You can compare two state dumps by doing:
348
349 apitrace diff-state 12345.json 67890.json
350
351
José Fonseca2208f5a2015-02-05 12:05:11 +0000352## Comparing two traces side by side ##
José Fonseca21278192015-01-20 14:27:04 +0000353
354 apitrace diff trace1.trace trace2.trace
355
356This works only on Unices, and it will truncate the traces due to performance
357limitations.
358
359
José Fonseca2208f5a2015-02-05 12:05:11 +0000360## Recording a video with FFmpeg/Libav ##
José Fonseca21278192015-01-20 14:27:04 +0000361
362You can make a video of the output with FFmpeg by doing
363
364 apitrace dump-images -o - application.trace \
365 | ffmpeg -r 30 -f image2pipe -vcodec ppm -i pipe: -vcodec mpeg4 -y output.mp4
366
367or Libav (which replaces FFmpeg on recent Debian/Ubuntu distros) doing
368
369 apitrace dump-images -o - application.trace \
370 | avconv -r 30 -f image2pipe -vcodec ppm -i - -vcodec mpeg4 -y output.mp4
371
José Fonseca2208f5a2015-02-05 12:05:11 +0000372
373## Recording a video with gstreamer ##
José Fonseca21278192015-01-20 14:27:04 +0000374
375You can make a video of the output with gstreamer by doing
376
377 glretrace --snapshot-format=RGB -s - smokinguns.trace | gst-launch-0.10 fdsrc blocksize=409600 ! queue \
378 ! videoparse format=rgb width=1920 height=1080 ! queue ! ffmpegcolorspace ! queue \
379 ! vaapiupload direct-rendering=0 ! queue ! vaapiencodeh264 ! filesink location=xxx.264
380
José Fonseca2208f5a2015-02-05 12:05:11 +0000381
382## Trimming a trace ##
José Fonseca21278192015-01-20 14:27:04 +0000383
384You can truncate a trace by doing:
385
Jose Fonsecad9809aa2015-08-06 12:19:25 +0100386 apitrace trim --calls 0-12345 -o trimed.trace application.trace
José Fonseca21278192015-01-20 14:27:04 +0000387
388If you need precise control over which calls to trim you can specify the
389individual call numbers in a plain text file, as described in the 'Call sets'
390section above.
391
José Fonseca21278192015-01-20 14:27:04 +0000392
José Fonseca2208f5a2015-02-05 12:05:11 +0000393## Profiling a trace ##
José Fonseca21278192015-01-20 14:27:04 +0000394
395You can perform gpu and cpu profiling with the command line options:
396
397 * `--pgpu` record gpu times for frames and draw calls.
398
399 * `--pcpu` record cpu times for frames and draw calls.
400
401 * `--ppd` record pixels drawn for each draw call.
402
403The results from these can then be read by hand or analyzed with a script.
404
405`scripts/profileshader.py` will read the profile results and format them into a
406table which displays profiling results per shader.
407
408For example, to record all profiling data and utilise the per shader script:
409
410 apitrace replay --pgpu --pcpu --ppd foo.trace | ./scripts/profileshader.py
411
412
José Fonseca2208f5a2015-02-05 12:05:11 +0000413# Advanced usage for OpenGL implementers #
José Fonseca21278192015-01-20 14:27:04 +0000414
415There are several advanced usage examples meant for OpenGL implementors.
416
417
José Fonseca2208f5a2015-02-05 12:05:11 +0000418## Regression testing ##
José Fonseca21278192015-01-20 14:27:04 +0000419
420These are the steps to create a regression test-suite around **apitrace**:
421
422* obtain a trace
423
424* obtain reference snapshots, by doing on a reference system:
425
426 mkdir /path/to/reference/snapshots/
427 apitrace dump-images -o /path/to/reference/snapshots/ application.trace
428
429* prune the snapshots which are not interesting
430
431* to do a regression test, use `apitrace diff-images`:
432
433 apitrace dump-images -o /path/to/test/snapshots/ application.trace
434 apitrace diff-images --output summary.html /path/to/reference/snapshots/ /path/to/test/snapshots/
435
436
José Fonseca2208f5a2015-02-05 12:05:11 +0000437## Automated git-bisection ##
José Fonseca21278192015-01-20 14:27:04 +0000438
439With tracecheck.py it is possible to automate git bisect and pinpoint the
440commit responsible for a regression.
441
442Below is an example of using tracecheck.py to bisect a regression in the
443Mesa-based Intel 965 driver. But the procedure could be applied to any OpenGL
444driver hosted on a git repository.
445
446First, create a build script, named build-script.sh, containing:
447
448 #!/bin/sh
449 set -e
450 export PATH=/usr/lib/ccache:$PATH
451 export CFLAGS='-g'
452 export CXXFLAGS='-g'
453 ./autogen.sh --disable-egl --disable-gallium --disable-glut --disable-glu --disable-glw --with-dri-drivers=i965
454 make clean
455 make "$@"
456
457It is important that builds are both robust, and efficient. Due to broken
458dependency discovery in Mesa's makefile system, it was necessary to invoke `make
459clean` in every iteration step. `ccache` should be installed to avoid
460recompiling unchanged source files.
461
462Then do:
463
464 cd /path/to/mesa
465 export LIBGL_DEBUG=verbose
466 export LD_LIBRARY_PATH=$PWD/lib
467 export LIBGL_DRIVERS_DIR=$PWD/lib
468 git bisect start \
469 6491e9593d5cbc5644eb02593a2f562447efdcbb 71acbb54f49089b03d3498b6f88c1681d3f649ac \
470 -- src/mesa/drivers/dri/intel src/mesa/drivers/dri/i965/
471 git bisect run /path/to/tracecheck.py \
472 --precision-threshold 8.0 \
473 --build /path/to/build-script.sh \
474 --gl-renderer '.*Mesa.*Intel.*' \
475 --retrace=/path/to/glretrace \
476 -c /path/to/reference/snapshots/ \
477 topogun-1.06-orc-84k.trace
478
479The trace-check.py script will skip automatically when there are build
480failures.
481
482The `--gl-renderer` option will also cause a commit to be skipped if the
483`GL_RENDERER` is unexpected (e.g., when a software renderer or another OpenGL
484driver is unintentionally loaded due to a missing symbol in the DRI driver, or
485another runtime fault).
486
487
José Fonseca2208f5a2015-02-05 12:05:11 +0000488## Side by side retracing ##
José Fonseca21278192015-01-20 14:27:04 +0000489
490In order to determine which draw call a regression first manifests one could
491generate snapshots for every draw call, using the `-S` option. That is, however,
492very inefficient for big traces with many draw calls.
493
494A faster approach is to run both the bad and a good OpenGL driver side-by-side.
495The latter can be either a previously known good build of the OpenGL driver, or a
496reference software renderer.
497
498This can be achieved with retracediff.py script, which invokes glretrace with
499different environments, allowing to choose the desired OpenGL driver by
500manipulating variables such as `LD_LIBRARY_PATH`, `LIBGL_DRIVERS_DIR`, or
501`TRACE_LIBGL`.
502
503For example, on Linux:
504
505 ./scripts/retracediff.py \
506 --ref-env LD_LIBRARY_PATH=/path/to/reference/OpenGL/implementation \
507 --retrace /path/to/glretrace \
508 --diff-prefix=/path/to/output/diffs \
509 application.trace
510
511Or on Windows:
512
513 python scripts\retracediff.py --retrace \path\to\glretrace.exe --ref-env TRACE_LIBGL=\path\to\reference\opengl32.dll application.trace
514
515
José Fonseca2208f5a2015-02-05 12:05:11 +0000516# Advanced GUI usage #
José Fonseca21278192015-01-20 14:27:04 +0000517
518qapitrace has rudimentary support for replaying traces on a remote
519target device. This can be useful, for example, when developing for an
520embedded system. The primary GUI will run on the local host, while any
521replays will be performed on the target device.
522
523In order to target a remote device, use the command-line:
524
525 qapitrace --remote-target <HOST> <trace-file>
526
527In order for this to work, the following must be available in the
528system configuration:
529
5301. It must be possible for the current user to initiate an ssh session
531 that has access to the target's window system. The command to be
532 exectuted by qapitrace will be:
533
534 ssh <HOST> glretrace
535
536 For example, if the target device is using the X window system, one
537 can test whether an ssh session has access to the target X server
538 with:
539
540 ssh <HOST> xdpyinfo
541
542 If this command fails with something like "cannot open display"
543 then the user will have to configure the target to set the DISPLAY
544 environment variable, (for example, setting DISPLAY=:0 in the
545 .bashrc file on the target or similar).
546
547 Also, note that if the ssh session requires a custom username, then
548 this must be configured on the host side so that ssh can be
549 initiated without a username.
550
551 For example, if you normally connect with `ssh user@192.168.0.2`
552 you could configure ~/.ssh/config on the host with a block such as:
553
554 Host target
555 HostName 192.168.0.2
556 User user
557
558 And after this you should be able to connect with `ssh target` so
559 that you can also use `qapitrace --remote-target target`.
560
5612. The target host must have a functional glretrace binary available
562
Nicholas Bishop91753392016-08-20 21:40:00 -04005633. The target host must have access to `trace-file` at the same path
564 in the filesystem as the `trace-file` path on the host system being
José Fonseca21278192015-01-20 14:27:04 +0000565 passed to the qapitrace command line.