blob: c20c4140c6b4901fa89ae40e19923b72ca70e23b [file] [log] [blame] [view]
andybonse6a8f2bd2015-08-31 22:46:011# Tips for debugging on Linux
andybons3322f762015-08-24 21:37:092
andybonsad92aa32015-08-31 02:27:443This page is for Chromium-specific debugging tips; learning how to run gdb is
4out of scope.
andybons3322f762015-08-24 21:37:095
andybonsad92aa32015-08-31 02:27:446[TOC]
andybons3322f762015-08-24 21:37:097
8## Symbolized stack trace
9
andybonsad92aa32015-08-31 02:27:4410The sandbox can interfere with the internal symbolizer. Use `--no-sandbox` (but
11keep this temporary) or an external symbolizer (see
12`tools/valgrind/asan/asan_symbolize.py`).
andybons3322f762015-08-24 21:37:0913
andybonsad92aa32015-08-31 02:27:4414Generally, do not use `--no-sandbox` on waterfall bots, sandbox testing is
15needed. Talk to security@chromium.org.
andybons3322f762015-08-24 21:37:0916
17## GDB
andybonsad92aa32015-08-31 02:27:4418
nodira6074d4c2015-09-01 04:26:4519*** promo
20GDB-7.7 is required in order to debug Chrome on Linux.
21***
andybons3322f762015-08-24 21:37:0922
23Any prior version will fail to resolve symbols or segfault.
24
25### Basic browser process debugging
26
andybonsad92aa32015-08-31 02:27:4427 gdb -tui -ex=r --args out/Debug/chrome --disable-seccomp-sandbox \
28 http://google.com
andybons3322f762015-08-24 21:37:0929
30### Allowing attaching to foreign processes
andybonsad92aa32015-08-31 02:27:4431
32On distributions that use the
33[Yama LSM](https://www.kernel.org/doc/Documentation/security/Yama.txt) (that
34includes Ubuntu and Chrome OS), process A can attach to process B only if A is
35an ancestor of B.
andybons3322f762015-08-24 21:37:0936
37You will probably want to disable this feature by using
andybonsad92aa32015-08-31 02:27:4438
39 echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
andybons3322f762015-08-24 21:37:0940
41If you don't you'll get an error message such as "Could not attach to process".
42
andybonsad92aa32015-08-31 02:27:4443Note that you'll also probably want to use `--no-sandbox`, as explained below.
andybons3322f762015-08-24 21:37:0944
45### Multiprocess Tricks
andybonsad92aa32015-08-31 02:27:4446
andybons3322f762015-08-24 21:37:0947#### Getting renderer subprocesses into gdb
andybonsad92aa32015-08-31 02:27:4448
49Since Chromium itself spawns the renderers, it can be tricky to grab a
50particular with gdb. This command does the trick:
51
andybons3322f762015-08-24 21:37:0952```
53chrome --no-sandbox --renderer-cmd-prefix='xterm -title renderer -e gdb --args'
54```
andybonsad92aa32015-08-31 02:27:4455
56The `--no-sandbox` flag is needed because otherwise the seccomp sandbox will
57kill the renderer process on startup, or the setuid sandbox will prevent xterm's
58execution. The "xterm" is necessary or gdb will run in the current terminal,
59which can get particularly confusing since it's running in the background, and
60if you're also running the main process in gdb, won't work at all (the two
61instances will fight over the terminal). To auto-start the renderers in the
62debugger, send the "run" command to the debugger:
63
nodira6074d4c2015-09-01 04:26:4564 chrome --no-sandbox --renderer-cmd-prefix='xterm -title renderer -e gdb \
65 -ex run --args
andybonsad92aa32015-08-31 02:27:4466
andybons3322f762015-08-24 21:37:0967If you're using Emacs and `M-x gdb`, you can do
andybons3322f762015-08-24 21:37:0968
andybonsad92aa32015-08-31 02:27:4469 chrome "--renderer-cmd-prefix=gdb --args"
andybons3322f762015-08-24 21:37:0970
nodira6074d4c2015-09-01 04:26:4571*** note
andybonsad92aa32015-08-31 02:27:4472Note: using the `--renderer-cmd-prefix` option bypasses the zygote launcher, so
73the renderers won't be sandboxed. It is generally not an issue, except when you
74are trying to debug interactions with the sandbox. If that's what you are doing,
75you will need to attach your debugger to a running renderer process (see below).
nodira6074d4c2015-09-01 04:26:4576***
andybons3322f762015-08-24 21:37:0977
andybonsad92aa32015-08-31 02:27:4478You may also want to pass `--disable-hang-monitor` to suppress the hang monitor,
79which is rather annoying.
80
81You can also use `--renderer-startup-dialog` and attach to the process in order
82to debug the renderer code. Go to
83http://www.chromium.org/blink/getting-started-with-blink-debugging for more
84information on how this can be done.
andybons3322f762015-08-24 21:37:0985
86#### Choosing which renderers to debug
andybons3322f762015-08-24 21:37:0987
andybonsad92aa32015-08-31 02:27:4488If you are starting multiple renderers then the above means that multiple gdb's
89start and fight over the console. Instead, you can set the prefix to point to
90this shell script:
91
92```sh
andybons3322f762015-08-24 21:37:0993#!/bin/sh
94
95echo "**** Child $$ starting: y to debug"
96read input
97if [ "$input" = "y" ] ; then
98 gdb --args $*
99else
100 $*
101fi
102```
103
104#### Selective breakpoints
andybonsad92aa32015-08-31 02:27:44105
106When debugging both the browser and renderer process, you might want to have
107separate set of breakpoints to hit. You can use gdb's command files to
108accomplish this by putting breakpoints in separate files and instructing gdb to
109load them.
andybons3322f762015-08-24 21:37:09110
111```
andybonsad92aa32015-08-31 02:27:44112gdb -x ~/debug/browser --args chrome --no-sandbox --disable-hang-monitor \
113 --renderer-cmd-prefix='xterm -title renderer -e gdb -x ~/debug/renderer \
114 --args '
andybons3322f762015-08-24 21:37:09115```
116
andybonsad92aa32015-08-31 02:27:44117Also, instead of running gdb, you can use the script above, which let's you
118select which renderer process to debug. Note: you might need to use the full
119path to the script and avoid `$HOME` or `~/.`
andybons3322f762015-08-24 21:37:09120
121#### Connecting to a running renderer
122
andybonsad92aa32015-08-31 02:27:44123Usually `ps aux | grep chrome` will not give very helpful output. Try
124`pstree -p | grep chrome` to get something like
andybons3322f762015-08-24 21:37:09125
126```
127 | |-bash(21969)---chrome(672)-+-chrome(694)
128 | | |-chrome(695)---chrome(696)-+-{chrome}(697)
129 | | | \-{chrome}(709)
130 | | |-{chrome}(675)
131 | | |-{chrome}(678)
132 | | |-{chrome}(679)
133 | | |-{chrome}(680)
134 | | |-{chrome}(681)
135 | | |-{chrome}(682)
136 | | |-{chrome}(684)
137 | | |-{chrome}(685)
138 | | |-{chrome}(705)
139 | | \-{chrome}(717)
140```
141
andybonsad92aa32015-08-31 02:27:44142Most of those are threads. In this case the browser process would be 672 and the
143(sole) renderer process is 696. You can use `gdb -p 696` to attach.
144Alternatively, you might find out the process ID from Chrome's built-in Task
145Manager (under the Tools menu). Right-click on the Task Manager, and enable
146"Process ID" in the list of columns.
andybons3322f762015-08-24 21:37:09147
andybonsad92aa32015-08-31 02:27:44148Note: by default, sandboxed processes can't be attached by a debugger. To be
149able to do so, you will need to pass the `--allow-sandbox-debugging` option.
andybons3322f762015-08-24 21:37:09150
andybonsad92aa32015-08-31 02:27:44151If the problem only occurs with the seccomp sandbox enabled (and the previous
152tricks don't help), you could try enabling core-dumps (see the **Core files**
153section). That would allow you to get a backtrace and see some local variables,
154though you won't be able to step through the running program.
andybons3322f762015-08-24 21:37:09155
andybonsad92aa32015-08-31 02:27:44156Note: If you're interested in debugging LinuxSandboxIPC process, you can attach
157to 694 in the above diagram. The LinuxSandboxIPC process has the same command
158line flag as the browser process so that it's easy to identify it if you run
159`pstree -pa`.
andybons3322f762015-08-24 21:37:09160
161#### Getting GPU subprocesses into gdb
andybons3322f762015-08-24 21:37:09162
andybonsad92aa32015-08-31 02:27:44163Use `--gpu-launcher` flag instead of `--renderer-cmd-prefix` in the instructions
164for renderer above.
165
166#### Getting `browser_tests` launched browsers into gdb
167
168Use environment variable `BROWSER_WRAPPER` instead of `--renderer-cmd-prefix`
169switch in the instructions above.
andybons3322f762015-08-24 21:37:09170
171Example:
andybonsad92aa32015-08-31 02:27:44172
173```shell
174BROWSER_WRAPPER='xterm -title renderer -e gdb --eval-command=run \
175 --eval-command=quit --args' out/Debug/browser_tests --gtest_filter=Print
176```
andybons3322f762015-08-24 21:37:09177
178#### Plugin Processes
andybons3322f762015-08-24 21:37:09179
andybonsad92aa32015-08-31 02:27:44180Same strategies as renderers above, but the flag is called `--plugin-launcher`:
181
182 chrome --plugin-launcher='xterm -e gdb --args'
183
nodira6074d4c2015-09-01 04:26:45184*** note
185Note: For now, this does not currently apply to PPAPI plugins because they
186currently run in the renderer process.
187***
andybons3322f762015-08-24 21:37:09188
189#### Single-Process mode
andybons3322f762015-08-24 21:37:09190
andybonsad92aa32015-08-31 02:27:44191Depending on whether it's relevant to the problem, it's often easier to just run
192in "single process" mode where the renderer threads are in-process. Then you can
193just run gdb on the main process.
andybons3322f762015-08-24 21:37:09194
andybonsad92aa32015-08-31 02:27:44195 gdb --args chrome --single-process
196
197Currently, the `--disable-gpu` flag is also required, as there are known crashes
198that occur under TextureImageTransportSurface without it. The crash described in
199http://crbug.com/361689 can also sometimes occur, but that crash can be
200continued from without harm.
201
202Note that for technical reasons plugins cannot be in-process, so
203`--single-process` only puts the renderers in the browser process. The flag is
204still useful for debugging plugins (since it's only two processes instead of
205three) but you'll still need to use `--plugin-launcher` or another approach.
andybons3322f762015-08-24 21:37:09206
207### Printing Chromium types
andybons3322f762015-08-24 21:37:09208
andybonsad92aa32015-08-31 02:27:44209gdb 7 lets us use Python to write pretty-printers for Chromium types. The
210directory `tools/gdb/` contains a Python gdb scripts useful for Chromium code.
211There are similar scripts [in WebKit](http://trac.webkit.org/wiki/GDB) (in fact,
212the Chromium script relies on using it with the WebKit one).
213
214To include these pretty-printers with your gdb, put the following into
215`~/.gdbinit`:
216
217```python
andybons3322f762015-08-24 21:37:09218python
219import sys
220sys.path.insert(0, "<path/to/chromium/src>/third_party/WebKit/Tools/gdb/")
221import webkit
222sys.path.insert(0, "<path/to/chromium/src>/tools/gdb/")
223import gdb_chrome
224```
225
andybonsad92aa32015-08-31 02:27:44226Pretty printers for std types shouldn't be necessary in gdb 7, but they're
227provided here in case you're using an older gdb. Put the following into
228`~/.gdbinit`:
229
andybons3322f762015-08-24 21:37:09230```
231# Print a C++ string.
232define ps
233 print $arg0.c_str()
234end
235
236# Print a C++ wstring or wchar_t*.
237define pws
238 printf "\""
239 set $c = (wchar_t*)$arg0
240 while ( *$c )
241 if ( *$c > 0x7f )
242 printf "[%x]", *$c
243 else
244 printf "%c", *$c
245 end
246 set $c++
247 end
248 printf "\"\n"
249end
250```
251
252[More STL GDB macros](http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.01.txt)
253
254### Graphical Debugging Aid for Chromium Views
255
256The following link describes a tool that can be used on Linux, Windows and Mac under GDB.
257
andybonsad92aa32015-08-31 02:27:44258[graphical_debugging_aid_chromium_views](graphical_debugging_aid_chromium_views.md)
andybons3322f762015-08-24 21:37:09259
260### Faster startup
261
andybonsad92aa32015-08-31 02:27:44262Use the `gdb-add-index` script (e.g.
263`build/gdb-add-index out/Debug/browser_tests`)
andybons3322f762015-08-24 21:37:09264
andybonsad92aa32015-08-31 02:27:44265Only makes sense if you run the binary multiple times or maybe if you use the
nodira6074d4c2015-09-01 04:26:45266component build since most `.so` files won't require reindexing on a rebuild.
andybons3322f762015-08-24 21:37:09267
andybonsad92aa32015-08-31 02:27:44268See
269https://groups.google.com/a/chromium.org/forum/#!searchin/chromium-dev/gdb-add-index/chromium-dev/ELRuj1BDCL4/5Ki4LGx41CcJ
270for more info.
andybons3322f762015-08-24 21:37:09271
272Alternatively, specify:
andybons3322f762015-08-24 21:37:09273
andybonsad92aa32015-08-31 02:27:44274 linux_use_debug_fission=0
275
276in `GYP_DEFINES`. This improves load time of gdb significantly at the cost of
277link time.
andybons3322f762015-08-24 21:37:09278
279## Core files
andybons3322f762015-08-24 21:37:09280
andybonsad92aa32015-08-31 02:27:44281`ulimit -c unlimited` should cause all Chrome processes (run from that shell) to
282dump cores, with the possible exception of some sandboxed processes.
andybons3322f762015-08-24 21:37:09283
andybonsad92aa32015-08-31 02:27:44284Some sandboxed subprocesses might not dump cores unless you pass the
285`--allow-sandbox-debugging` flag.
286
287If the problem is a freeze rather than a crash, you may be able to trigger a
288core-dump by sending SIGABRT to the relevant process:
289
290 kill -6 [process id]
andybons3322f762015-08-24 21:37:09291
292## Breakpad minidump files
293
andybonsad92aa32015-08-31 02:27:44294See [linux_minidump_to_core.md](linux_minidump_to_core.md)
andybons3322f762015-08-24 21:37:09295
296## Running Tests
andybonsad92aa32015-08-31 02:27:44297
298Many of our tests bring up windows on screen. This can be annoying (they steal
299your focus) and hard to debug (they receive extra events as you mouse over them).
300Instead, use `Xvfb` or `Xephyr` to run a nested X session to debug them, as
301outlined on [layout_tests_linux.md](layout_tests_linux.md).
andybons3322f762015-08-24 21:37:09302
303### Browser tests
andybonsad92aa32015-08-31 02:27:44304
305By default the `browser_tests` forks a new browser for each test. To debug the
306browser side of a single test, use a command like
307
andybons3322f762015-08-24 21:37:09308```
309gdb --args out/Debug/browser_tests --single_process --gtest_filter=MyTestName
310```
andybonsad92aa32015-08-31 02:27:44311
312**note the underscore in `single_process`** -- this makes the test harness and
313browser process share the outermost process.
andybons3322f762015-08-24 21:37:09314
315
316To debug a renderer process in this case, use the tips above about renderers.
317
318### Layout tests
andybonsad92aa32015-08-31 02:27:44319
320See [layout_tests_linux.md](layout_tests_linux.md) for some tips. In particular,
321note that it's possible to debug a layout test via `ssh`ing to a Linux box; you
322don't need anything on screen if you use `Xvfb`.
andybons3322f762015-08-24 21:37:09323
324### UI tests
andybons3322f762015-08-24 21:37:09325
andybonsad92aa32015-08-31 02:27:44326UI tests are run in forked browsers. Unlike browser tests, you cannot do any
327single process tricks here to debug the browser. See below about
328`BROWSER_WRAPPER`.
329
330To pass flags to the browser, use a command line like
331`--extra-chrome-flags="--foo --bar"`.
andybons3322f762015-08-24 21:37:09332
333### Timeouts
andybonsad92aa32015-08-31 02:27:44334
335UI tests have a confusing array of timeouts in place. (Pawel is working on
336reducing the number of timeouts.) To disable them while you debug, set the
337timeout flags to a large value:
338
339* `--test-timeout=100000000`
340* `--ui-test-action-timeout=100000000`
341* `--ui-test-terminate-timeout=100000000`
andybons3322f762015-08-24 21:37:09342
343### To replicate Window Manager setup on the bots
andybonsad92aa32015-08-31 02:27:44344
345Chromium try bots and main waterfall's bots run tests under Xvfb&openbox
346combination. Xvfb is an X11 server that redirects the graphical output to the
347memory, and openbox is a simple window manager that is running on top of Xvfb.
348The behavior of openbox is markedly different when it comes to focus management
349and other window tasks, so test that runs fine locally may fail or be flaky on
350try bots. To run the tests on a local machine as on a bot, follow these steps:
andybons3322f762015-08-24 21:37:09351
352Make sure you have openbox:
andybonsad92aa32015-08-31 02:27:44353
354 apt-get install openbox
355
andybons3322f762015-08-24 21:37:09356Start Xvfb and openbox on a particular display:
andybonsad92aa32015-08-31 02:27:44357
358 Xvfb :6.0 -screen 0 1280x1024x24 & DISPLAY=:6.0 openbox &
359
andybons3322f762015-08-24 21:37:09360Run your tests with graphics output redirected to that display:
andybonsad92aa32015-08-31 02:27:44361
362 DISPLAY=:6.0 out/Debug/browser_tests --gtest_filter="MyBrowserTest.MyActivateWindowTest"
363
andybons3322f762015-08-24 21:37:09364You can look at a snapshot of the output by:
andybonsad92aa32015-08-31 02:27:44365
366 xwd -display :6.0 -root | xwud
andybons3322f762015-08-24 21:37:09367
368Alternatively, you can use testing/xvfb.py to set up your environment for you:
andybons3322f762015-08-24 21:37:09369
andybonsad92aa32015-08-31 02:27:44370 testing/xvfb.py out/Debug out/Debug/browser_tests \
371 --gtest_filter="MyBrowserTest.MyActivateWindowTest"
andybons3322f762015-08-24 21:37:09372
nodira6074d4c2015-09-01 04:26:45373### BROWSER_WRAPPER
andybonsad92aa32015-08-31 02:27:44374
375You can also get the browser under a debugger by setting the `BROWSER_WRAPPER`
376environment variable. (You can use this for `browser_tests` too, but see above
377for discussion of a simpler way.)
378
379 BROWSER_WRAPPER='xterm -e gdb --args' out/Debug/browser_tests
andybons3322f762015-08-24 21:37:09380
381### Replicating Trybot Slowness
382
andybonsad92aa32015-08-31 02:27:44383Trybots are pretty stressed, and can sometimes expose timing issues you can't
384normally reproduce locally.
andybons3322f762015-08-24 21:37:09385
andybonsad92aa32015-08-31 02:27:44386You can simulate this by shutting down all but one of the CPUs
387(http://www.cyberciti.biz/faq/debian-rhel-centos-redhat-suse-hotplug-cpu/) and
388running a CPU loading tool (e.g., http://www.devin.com/lookbusy/). Now run your
389test. It will run slowly, but any flakiness found by the trybot should replicate
390locally now - and often nearly 100% of the time.
andybons3322f762015-08-24 21:37:09391
392## Logging
andybons3322f762015-08-24 21:37:09393
andybonsad92aa32015-08-31 02:27:44394### Seeing all LOG(foo) messages
395
396Default log level hides `LOG(INFO)`. Run with `--log-level=0` and
397`--enable-logging=stderr` flags.
398
399Newer versions of chromium with VLOG may need --v=1 too. For more VLOG tips, see
nodira6074d4c2015-09-01 04:26:45400[the chromium-dev thread](http://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/dcd0cd7752b35de6?pli=1).
andybons3322f762015-08-24 21:37:09401
402### Seeing IPC debug messages
andybons3322f762015-08-24 21:37:09403
andybonsad92aa32015-08-31 02:27:44404Run with `CHROME_IPC_LOGGING=1` eg.
405
406 CHROME_IPC_LOGGING=1 out/Debug/chrome
407
408or within gdb:
409
410 set environment CHROME_IPC_LOGGING 1
411
412If some messages show as unknown, check if the list of IPC message headers in
nodira6074d4c2015-09-01 04:26:45413[chrome/common/logging_chrome.cc](/chrome/common/logging_chrome.cc) is
414up-to-date. In case this file reference goes out of date, try looking for usage
415of macros like `IPC_MESSAGE_LOG_ENABLED` or `IPC_MESSAGE_MACROS_LOG_ENABLED`.
andybons3322f762015-08-24 21:37:09416
417## Using valgrind
418
andybonsad92aa32015-08-31 02:27:44419To run valgrind on the browser and renderer processes, with our suppression file
420and flags:
421
422 $ cd $CHROMIUM_ROOT/src
423 $ tools/valgrind/valgrind.sh out/Debug/chrome
andybons3322f762015-08-24 21:37:09424
425You can use valgrind on chrome and/or on the renderers e.g
426`valgrind --smc-check=all ../sconsbuild/Debug/chrome`
427or by passing valgrind as the argument to `--render-cmd-prefix`.
428
andybonsad92aa32015-08-31 02:27:44429Beware that there are several valgrind "false positives" e.g. pickle, sqlite and
430some instances in webkit that are ignorable. On systems with prelink and address
431space randomization (e.g. Fedora), you may also see valgrind errors in libstdc++
432on startup and in gnome-breakpad.
andybons3322f762015-08-24 21:37:09433
434Valgrind doesn't seem to play nice with tcmalloc. To disable tcmalloc run GYP
andybonsad92aa32015-08-31 02:27:44435
436 $ cd $CHROMIUM_ROOT/src
437 $ build/gyp_chromium -Duse_allocator=none
438
andybons3322f762015-08-24 21:37:09439and rebuild.
440
441## Profiling
andybonsad92aa32015-08-31 02:27:44442
443See
444https://sites.google.com/a/chromium.org/dev/developers/profiling-chromium-and-webkit
445and
446http://code.google.com/p/chromium/wiki/LinuxProfiling
andybons3322f762015-08-24 21:37:09447
448## i18n
andybons3322f762015-08-24 21:37:09449
andybonsad92aa32015-08-31 02:27:44450We obey your system locale. Try something like:
andybons3322f762015-08-24 21:37:09451
andybonsad92aa32015-08-31 02:27:44452 LANG=ja_JP.UTF-8 out/Debug/chrome
453
454If this doesn't work, make sure that the `LANGUAGE`, `LC_ALL` and `LC_MESSAGE`
455environment variables aren't set -- they have higher priority than LANG in the
456order listed. Alternatively, just do this:
457
458 LANGUAGE=fr out/Debug/chrome
459
460Note that because we use GTK, some locale data comes from the system -- for
461example, file save boxes and whether the current language is considered RTL.
462Without all the language data available, Chrome will use a mixture of your
463system language and the language you run Chrome in.
andybons3322f762015-08-24 21:37:09464
465Here's how to install the Arabic (ar) and Hebrew (he) language packs:
andybonsad92aa32015-08-31 02:27:44466
467 sudo apt-get install language-pack-ar language-pack-he \
468 language-pack-gnome-ar language-pack-gnome-he
469
andybons3322f762015-08-24 21:37:09470Note that the `--lang` flag does **not** work properly for this.
471
andybonsad92aa32015-08-31 02:27:44472On non-Debian systems, you need the `gtk20.mo` files. (Please update these docs
473with the appropriate instructions if you know what they are.)
andybons3322f762015-08-24 21:37:09474
475## Breakpad
andybonsad92aa32015-08-31 02:27:44476
nodira6074d4c2015-09-01 04:26:45477See the last section of [Linux Crash Dumping](linux_crash_dumping.md); you
andybonsad92aa32015-08-31 02:27:44478need to set a gyp variable and an environment variable for the crash dump tests
479to work.
andybons3322f762015-08-24 21:37:09480
481## Drag and Drop
andybonsad92aa32015-08-31 02:27:44482
483If you break in a debugger during a drag, Chrome will have grabbed your mouse
484and keyboard so you won't be able to interact with the debugger! To work around
485this, run via `Xephyr`. Instructions for how to use `Xephyr` are on the
nodira6074d4c2015-09-01 04:26:45486[Running layout tests on Linux](layout_tests_linux.md) page.
andybons3322f762015-08-24 21:37:09487
488## Tracking Down Bugs
489
490### Isolating Regressions
andybons3322f762015-08-24 21:37:09491
andybonsad92aa32015-08-31 02:27:44492Old builds are archived here:
493http://build.chromium.org/buildbot/snapshots/chromium-rel-linux/
nodira6074d4c2015-09-01 04:26:45494(TODO: does not exist).
andybonsad92aa32015-08-31 02:27:44495
496`tools/bisect-builds.py` in the tree automates bisecting through the archived
497builds. Despite a computer science education, I am still amazed how quickly
498binary search will find its target.
andybons3322f762015-08-24 21:37:09499
500### Screen recording for bug reports
andybonsad92aa32015-08-31 02:27:44501
502 sudo apt-get install gtk-recordmydesktop
andybons3322f762015-08-24 21:37:09503
504## Version-specific issues
505
506### Google Chrome
andybonsad92aa32015-08-31 02:27:44507
508Google Chrome binaries don't include symbols. Googlers can read where to get
509symbols from
510[the Google-internal wiki](http://wiki/Main/ChromeOfficialBuildLinux#The_Build_Archive).
andybons3322f762015-08-24 21:37:09511
512### Ubuntu Chromium
andybonsad92aa32015-08-31 02:27:44513
514Since we don't build the Ubuntu packages (Ubuntu does) we can't get useful
515backtraces from them. Direct users to https://wiki.ubuntu.com/Chromium/Debugging
andybons3322f762015-08-24 21:37:09516
517### Fedora's Chromium
andybonsad92aa32015-08-31 02:27:44518
519Like Ubuntu, but direct users to
520https://fedoraproject.org/wiki/TomCallaway/Chromium_Debug
andybons3322f762015-08-24 21:37:09521
522### Xlib
andybonsad92aa32015-08-31 02:27:44523
andybons3322f762015-08-24 21:37:09524If you're trying to track down X errors like:
andybonsad92aa32015-08-31 02:27:44525
andybons3322f762015-08-24 21:37:09526```
527The program 'chrome' received an X Window System error.
528This probably reflects a bug in the program.
529The error was 'BadDrawable (invalid Pixmap or Window parameter)'.
530```
andybonsad92aa32015-08-31 02:27:44531
andybons3322f762015-08-24 21:37:09532Some strategies are:
andybonsad92aa32015-08-31 02:27:44533
534* pass `--sync` on the command line to make all X calls synchronous
535* run chrome via [xtrace](http://xtrace.alioth.debian.org/)
536* turn on IPC debugging (see above section)
andybons3322f762015-08-24 21:37:09537
538### Window Managers
andybons3322f762015-08-24 21:37:09539
andybonsad92aa32015-08-31 02:27:44540To test on various window managers, you can use a nested X server like `Xephyr`.
541Instructions for how to use `Xephyr` are on the
nodira6074d4c2015-09-01 04:26:45542[Running layout tests on Linux](layout_tests_linux.md) page.
andybonsad92aa32015-08-31 02:27:44543
544If you need to test something with hardware accelerated compositing
545(e.g., compiz), you can use `Xgl` (`sudo apt-get install xserver-xgl`). E.g.:
546
547 Xgl :1 -ac -accel glx:pbuffer -accel xv:pbuffer -screen 1024x768
548
andybons3322f762015-08-24 21:37:09549## Mozilla Tips
andybonsad92aa32015-08-31 02:27:44550
551https://developer.mozilla.org/en/Debugging_Mozilla_on_Linux_FAQ