blob: 59820fbef09f044a4a46c8fad71883cd5add6f3c [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
Brett Wilson41a7de02023-04-27 18:56:5425### Setup
26
27#### Build setup
28
29In your build set the GN build variable `symbol_level = 2` for interactive
30debugging. (`symbol_level = 1` only provides backtrace information). And while
31release-mode debugging is possible, things will be much easier in a debug build.
32Set your build args with `gn args out/<your_dir>` (substituting your build
33directory), and set:
34
35```
36is_debug = true
37symbol_level = 2
38```
39
40#### GDB setup
41
42The Chrome build requires some GDB configuration for it to be able to find
Taiyo Mizuhashid0f90c9d2023-05-31 00:55:2343source files. See [gdbinit](../gdbinit.md) to configure GDB. There is a similar
44process for [LLDB](../lldbinit.md).
Brett Wilson41a7de02023-04-27 18:56:5445
andybons3322f762015-08-24 21:37:0946### Basic browser process debugging
47
andybonsad92aa32015-08-31 02:27:4448 gdb -tui -ex=r --args out/Debug/chrome --disable-seccomp-sandbox \
49 http://google.com
andybons3322f762015-08-24 21:37:0950
51### Allowing attaching to foreign processes
andybonsad92aa32015-08-31 02:27:4452
53On distributions that use the
54[Yama LSM](https://www.kernel.org/doc/Documentation/security/Yama.txt) (that
55includes Ubuntu and Chrome OS), process A can attach to process B only if A is
56an ancestor of B.
andybons3322f762015-08-24 21:37:0957
58You will probably want to disable this feature by using
andybonsad92aa32015-08-31 02:27:4459
60 echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
andybons3322f762015-08-24 21:37:0961
62If you don't you'll get an error message such as "Could not attach to process".
63
andybonsad92aa32015-08-31 02:27:4464Note that you'll also probably want to use `--no-sandbox`, as explained below.
andybons3322f762015-08-24 21:37:0965
66### Multiprocess Tricks
andybonsad92aa32015-08-31 02:27:4467
andybons3322f762015-08-24 21:37:0968#### Getting renderer subprocesses into gdb
andybonsad92aa32015-08-31 02:27:4469
70Since Chromium itself spawns the renderers, it can be tricky to grab a
71particular with gdb. This command does the trick:
72
andybons3322f762015-08-24 21:37:0973```
74chrome --no-sandbox --renderer-cmd-prefix='xterm -title renderer -e gdb --args'
75```
andybonsad92aa32015-08-31 02:27:4476
77The `--no-sandbox` flag is needed because otherwise the seccomp sandbox will
78kill the renderer process on startup, or the setuid sandbox will prevent xterm's
79execution. The "xterm" is necessary or gdb will run in the current terminal,
80which can get particularly confusing since it's running in the background, and
81if you're also running the main process in gdb, won't work at all (the two
82instances will fight over the terminal). To auto-start the renderers in the
83debugger, send the "run" command to the debugger:
84
nodira6074d4c2015-09-01 04:26:4585 chrome --no-sandbox --renderer-cmd-prefix='xterm -title renderer -e gdb \
Zhang Haoa95224882021-05-12 11:26:3686 -ex run --args'
andybonsad92aa32015-08-31 02:27:4487
andybons3322f762015-08-24 21:37:0988If you're using Emacs and `M-x gdb`, you can do
andybons3322f762015-08-24 21:37:0989
andybonsad92aa32015-08-31 02:27:4490 chrome "--renderer-cmd-prefix=gdb --args"
andybons3322f762015-08-24 21:37:0991
nodira6074d4c2015-09-01 04:26:4592*** note
andybonsad92aa32015-08-31 02:27:4493Note: using the `--renderer-cmd-prefix` option bypasses the zygote launcher, so
94the renderers won't be sandboxed. It is generally not an issue, except when you
95are trying to debug interactions with the sandbox. If that's what you are doing,
96you will need to attach your debugger to a running renderer process (see below).
nodira6074d4c2015-09-01 04:26:4597***
andybons3322f762015-08-24 21:37:0998
andybonsad92aa32015-08-31 02:27:4499You may also want to pass `--disable-hang-monitor` to suppress the hang monitor,
100which is rather annoying.
101
102You can also use `--renderer-startup-dialog` and attach to the process in order
103to debug the renderer code. Go to
xiaoyin.l1003c0b2016-12-06 02:51:17104https://www.chromium.org/blink/getting-started-with-blink-debugging for more
andybonsad92aa32015-08-31 02:27:44105information on how this can be done.
andybons3322f762015-08-24 21:37:09106
Alex Gough20926742021-05-13 20:11:30107For utilities you can use `--utility-startup-dialog` to have all utilities
108prompt, or `--utility-startup-dialog=data_decoder.mojom.DataDecoderService`
109to debug only a particular service type.
110
andybons3322f762015-08-24 21:37:09111#### Choosing which renderers to debug
andybons3322f762015-08-24 21:37:09112
andybonsad92aa32015-08-31 02:27:44113If you are starting multiple renderers then the above means that multiple gdb's
114start and fight over the console. Instead, you can set the prefix to point to
115this shell script:
116
117```sh
andybons3322f762015-08-24 21:37:09118#!/bin/sh
119
120echo "**** Child $$ starting: y to debug"
121read input
122if [ "$input" = "y" ] ; then
123 gdb --args $*
124else
125 $*
126fi
127```
128
Robert Flackcdbf8c4a2022-11-18 18:12:34129#### Choosing renderer to debug by URL
130
131In most cases you'll want to debug the renderer which is loading a particular
132site. If you want a script which will automatically debug the renderer which has
133visited a given target URL and continue all other renderers, you can use the
134following:
135
136```sh
137./third_party/blink/tools/debug_renderer out/Default/content_shell https://example.domain/path
138```
139
140The script also supports specifying a different URL than the navigation URL.
141This is useful when the renderer you want to debug is not the top frame but one
142of the subframes on the page. For example, you could debug a particular subframe
143on a page with:
144
145```sh
146./third_party/blink/tools/debug_renderer -d https://subframe.url/path out/Default/content_shell https://example.domain/path
147```
148
149However, if you need more fine-grained control over which renderers to debug
150you can run chrome or content_shell directly with the
151`--wait-for-debugger-on-navigation` flag which will pause each renderer at the
152point of navigation (when the URL is known).
153
154This will result in a series of lines such as the following in the output:
155```
156...:content_switches_internal.cc(119)] Renderer url="https://example.domain/path" (PID) paused waiting for debugger to attach. Send SIGUSR1 to unpause.
157```
158
159You can signal the renderers you aren't interested in to continue running with:
160```sh
161kill -s SIGUSR1 <pid>
162```
163
164And debug the renderer you are interested in debugging with:
165```sh
166gdb -p <pid>
167```
168
Robert Flack6bbefe72023-02-24 18:49:51169#### Debugging run_web_tests.py renderers
170
171The `debug_renderer` script can also be used to debug the renderer running
172a web test. To do so, simply call `run_web_tests.py` from `debug_renderer.py`
173with all of the standard arguments for `run_web_tests.py`. For example:
174
175```sh
176./third_party/blink/tools/debug_renderer ./third_party/blink/tools/run_web_tests.py [run_web_test args]
177```
178
andybons3322f762015-08-24 21:37:09179#### Selective breakpoints
andybonsad92aa32015-08-31 02:27:44180
181When debugging both the browser and renderer process, you might want to have
182separate set of breakpoints to hit. You can use gdb's command files to
183accomplish this by putting breakpoints in separate files and instructing gdb to
184load them.
andybons3322f762015-08-24 21:37:09185
186```
andybonsad92aa32015-08-31 02:27:44187gdb -x ~/debug/browser --args chrome --no-sandbox --disable-hang-monitor \
188 --renderer-cmd-prefix='xterm -title renderer -e gdb -x ~/debug/renderer \
189 --args '
andybons3322f762015-08-24 21:37:09190```
191
andybonsad92aa32015-08-31 02:27:44192Also, instead of running gdb, you can use the script above, which let's you
193select which renderer process to debug. Note: you might need to use the full
194path to the script and avoid `$HOME` or `~/.`
andybons3322f762015-08-24 21:37:09195
196#### Connecting to a running renderer
197
andybonsad92aa32015-08-31 02:27:44198Usually `ps aux | grep chrome` will not give very helpful output. Try
199`pstree -p | grep chrome` to get something like
andybons3322f762015-08-24 21:37:09200
201```
202 | |-bash(21969)---chrome(672)-+-chrome(694)
203 | | |-chrome(695)---chrome(696)-+-{chrome}(697)
204 | | | \-{chrome}(709)
205 | | |-{chrome}(675)
206 | | |-{chrome}(678)
207 | | |-{chrome}(679)
208 | | |-{chrome}(680)
209 | | |-{chrome}(681)
210 | | |-{chrome}(682)
211 | | |-{chrome}(684)
212 | | |-{chrome}(685)
213 | | |-{chrome}(705)
214 | | \-{chrome}(717)
215```
216
andybonsad92aa32015-08-31 02:27:44217Most of those are threads. In this case the browser process would be 672 and the
218(sole) renderer process is 696. You can use `gdb -p 696` to attach.
219Alternatively, you might find out the process ID from Chrome's built-in Task
220Manager (under the Tools menu). Right-click on the Task Manager, and enable
221"Process ID" in the list of columns.
andybons3322f762015-08-24 21:37:09222
andybonsad92aa32015-08-31 02:27:44223Note: by default, sandboxed processes can't be attached by a debugger. To be
224able to do so, you will need to pass the `--allow-sandbox-debugging` option.
andybons3322f762015-08-24 21:37:09225
andybonsad92aa32015-08-31 02:27:44226If the problem only occurs with the seccomp sandbox enabled (and the previous
227tricks don't help), you could try enabling core-dumps (see the **Core files**
228section). That would allow you to get a backtrace and see some local variables,
229though you won't be able to step through the running program.
andybons3322f762015-08-24 21:37:09230
andybonsad92aa32015-08-31 02:27:44231Note: If you're interested in debugging LinuxSandboxIPC process, you can attach
232to 694 in the above diagram. The LinuxSandboxIPC process has the same command
233line flag as the browser process so that it's easy to identify it if you run
234`pstree -pa`.
andybons3322f762015-08-24 21:37:09235
236#### Getting GPU subprocesses into gdb
andybons3322f762015-08-24 21:37:09237
andybonsad92aa32015-08-31 02:27:44238Use `--gpu-launcher` flag instead of `--renderer-cmd-prefix` in the instructions
239for renderer above.
240
241#### Getting `browser_tests` launched browsers into gdb
242
243Use environment variable `BROWSER_WRAPPER` instead of `--renderer-cmd-prefix`
244switch in the instructions above.
andybons3322f762015-08-24 21:37:09245
246Example:
andybonsad92aa32015-08-31 02:27:44247
248```shell
249BROWSER_WRAPPER='xterm -title renderer -e gdb --eval-command=run \
250 --eval-command=quit --args' out/Debug/browser_tests --gtest_filter=Print
251```
andybons3322f762015-08-24 21:37:09252
253#### Plugin Processes
andybons3322f762015-08-24 21:37:09254
andybonsad92aa32015-08-31 02:27:44255Same strategies as renderers above, but the flag is called `--plugin-launcher`:
256
257 chrome --plugin-launcher='xterm -e gdb --args'
258
nodira6074d4c2015-09-01 04:26:45259*** note
260Note: For now, this does not currently apply to PPAPI plugins because they
261currently run in the renderer process.
262***
andybons3322f762015-08-24 21:37:09263
264#### Single-Process mode
andybons3322f762015-08-24 21:37:09265
andybonsad92aa32015-08-31 02:27:44266Depending on whether it's relevant to the problem, it's often easier to just run
267in "single process" mode where the renderer threads are in-process. Then you can
268just run gdb on the main process.
andybons3322f762015-08-24 21:37:09269
andybonsad92aa32015-08-31 02:27:44270 gdb --args chrome --single-process
271
272Currently, the `--disable-gpu` flag is also required, as there are known crashes
273that occur under TextureImageTransportSurface without it. The crash described in
xiaoyin.l1003c0b2016-12-06 02:51:17274https://crbug.com/361689 can also sometimes occur, but that crash can be
andybonsad92aa32015-08-31 02:27:44275continued from without harm.
276
277Note that for technical reasons plugins cannot be in-process, so
278`--single-process` only puts the renderers in the browser process. The flag is
279still useful for debugging plugins (since it's only two processes instead of
280three) but you'll still need to use `--plugin-launcher` or another approach.
andybons3322f762015-08-24 21:37:09281
282### Printing Chromium types
andybons3322f762015-08-24 21:37:09283
Tom Andersonf06ac382019-04-10 03:49:38284gdb 7 lets us use Python to write pretty-printers for Chromium types. See
Taiyo Mizuhashid0f90c9d2023-05-31 00:55:23285[gdbinit](../gdbinit.md)
Tom Andersonf06ac382019-04-10 03:49:38286to enable pretty-printing of Chromium types. This will import Blink
287pretty-printers as well.
Kenichi Ishibashie17b8d9f2018-04-26 03:32:46288
andybonsad92aa32015-08-31 02:27:44289Pretty printers for std types shouldn't be necessary in gdb 7, but they're
290provided here in case you're using an older gdb. Put the following into
291`~/.gdbinit`:
292
andybons3322f762015-08-24 21:37:09293```
294# Print a C++ string.
295define ps
296 print $arg0.c_str()
297end
298
299# Print a C++ wstring or wchar_t*.
300define pws
301 printf "\""
302 set $c = (wchar_t*)$arg0
303 while ( *$c )
304 if ( *$c > 0x7f )
305 printf "[%x]", *$c
306 else
307 printf "%c", *$c
308 end
309 set $c++
310 end
311 printf "\"\n"
312end
313```
314
315[More STL GDB macros](http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.01.txt)
316
Christian Biesinger3332bb3a2019-08-13 05:45:23317### JsDbg -- visualize data structures in the browser
318
319JsDbg is a debugger plugin to display various Chrome data structures in a
320browser window, such as the accessibility tree, layout object tree, DOM tree,
321and others.
322[Installation instructions are here](https://github.com/MicrosoftEdge/JsDbg),
323and see [here](https://github.com/MicrosoftEdge/JsDbg/blob/master/docs/FEATURES.md)
324for screenshots and an introduction.
325
326For Googlers, please see [go/jsdbg](https://goto.google.com/jsdbg) for
327installation instructions.
328
329### Time travel debugging with rr
330
331You can use [rr](https://rr-project.org) for time travel debugging, so you
332can also step or execute backwards. This works by first recording a trace
L. David Barone99d91eb2021-03-30 20:18:00333and then debugging based on that.
Christian Biesinger3332bb3a2019-08-13 05:45:23334
Steve Kobes8ce3e44d2022-01-28 22:36:59335You need an up-to-date version of rr, since rr is frequently updated to support
336new parts of the Linux system call API surface that Chromium uses. If you have
337any issues with the latest release version, try compiling rr
L. David Barone99d91eb2021-03-30 20:18:00338[from source](https://github.com/rr-debugger/rr/wiki/Building-And-Installing).
Robert Flackc9e69952020-05-13 19:52:31339
Christian Biesinger3332bb3a2019-08-13 05:45:23340Once installed, you can use it like this:
341```
Steve Kobes8ce3e44d2022-01-28 22:36:59342rr record out/Debug/content_shell --single-process
Christian Biesinger3332bb3a2019-08-13 05:45:23343rr replay
Steve Kobes8ce3e44d2022-01-28 22:36:59344(rr) c
345(rr) break blink::NGBlockNode::Layout
346(rr) rc # reverse-continue to the last Layout call
347(rr) jsdbg # run JsDbg as described above to find the interesting object
348(rr) watch -l box_->frame_rect_.size_.width_.value_
349(rr) rc # reverse-continue to the last time the width was changed
350(rr) rn # reverse-next to the previous line
351(rr) reverse-fin # run to where this function was called from
Christian Biesinger3332bb3a2019-08-13 05:45:23352```
353
L. David Barone99d91eb2021-03-30 20:18:00354You can debug multi-process chrome using `rr -f [PID]`
Steve Kobes8ce3e44d2022-01-28 22:36:59355for processes `fork()`ed from a [zygote process](zygote.md) without exec,
356which includes renderer processes,
357or `rr -p [PID]` for other processes.
358To find the process id you can either run `rr ps` after recording, or for
359renderer processes use `--vmodule=render_frame_impl=1` which will log a
360message on navigations. Example:
Robert Flacke13e0b12020-04-16 17:03:58361
362```
Steve Kobes8ce3e44d2022-01-28 22:36:59363$ rr record out/Debug/content_shell --disable-hang-monitor --vmodule=render_frame_impl=1 https://www.google.com/
Robert Flacke13e0b12020-04-16 17:03:58364rr: Saving execution to trace directory `...'.
365...
366[128515:128515:0320/164124.768687:VERBOSE1:render_frame_impl.cc(4244)] Committed provisional load: https://www.google.com/
367```
368
369From the log message we can see that the site was loaded into process 128515
370and can set a breakpoint for when that process is forked.
371
372```
373rr replay -f 128515
374```
375
L. David Barone99d91eb2021-03-30 20:18:00376If you want to call debugging functions from gdb that use `LOG()`,
Steve Kobes8ce3e44d2022-01-28 22:36:59377then those functions need to disable the printing of timestamps using
378[`SetLogItems`](https://source.chromium.org/search?q=SetLogItems&sq=&ss=chromium%2Fchromium%2Fsrc).
379See `LayoutObject::ShowLayoutObject()` for an example of this, and
380[issue 2829](https://github.com/rr-debugger/rr/issues/2829) for why it is needed.
L. David Barone99d91eb2021-03-30 20:18:00381
Steve Kobes8ce3e44d2022-01-28 22:36:59382If rr doesn't work correctly, the rr developers are generally quite responsive
383to [bug reports](https://github.com/rr-debugger/rr/issues),
L. David Barone99d91eb2021-03-30 20:18:00384especially ones that have enough information so that
385they don't have to build Chromium.
386
387See Also:
Steve Kobes8ce3e44d2022-01-28 22:36:59388
L. David Barone99d91eb2021-03-30 20:18:00389* [The Chromium Chronicle #13: Time-Travel Debugging with RR](https://developer.chrome.com/blog/chromium-chronicle-13/)
Steve Kobes8ce3e44d2022-01-28 22:36:59390* [@davidbaron demo using rr](https://twitter.com/davidbaron/status/1473761042278887433)
391* [@davidbaron demo using pernosco](https://twitter.com/davidbaron/status/1475836824409022469)
392(Googlers: see [go/pernosco](https://goto.google.com/pernosco))
L. David Barone99d91eb2021-03-30 20:18:00393
andybons3322f762015-08-24 21:37:09394### Graphical Debugging Aid for Chromium Views
395
396The following link describes a tool that can be used on Linux, Windows and Mac under GDB.
397
sisidovskif270241c2021-08-04 07:07:44398[graphical_debugging_aid_chromium_views](../graphical_debugging_aid_chromium_views.md)
andybons3322f762015-08-24 21:37:09399
400### Faster startup
401
andybonsad92aa32015-08-31 02:27:44402Use the `gdb-add-index` script (e.g.
403`build/gdb-add-index out/Debug/browser_tests`)
andybons3322f762015-08-24 21:37:09404
andybonsad92aa32015-08-31 02:27:44405Only makes sense if you run the binary multiple times or maybe if you use the
nodira6074d4c2015-09-01 04:26:45406component build since most `.so` files won't require reindexing on a rebuild.
andybons3322f762015-08-24 21:37:09407
andybonsad92aa32015-08-31 02:27:44408See
409https://groups.google.com/a/chromium.org/forum/#!searchin/chromium-dev/gdb-add-index/chromium-dev/ELRuj1BDCL4/5Ki4LGx41CcJ
410for more info.
andybons3322f762015-08-24 21:37:09411
Takuto Ikutaa093dc22020-11-11 03:17:50412You can improve GDB load time significantly at the cost of link time by not
brettw20d800c2016-04-12 00:10:49413splitting symbols from the object files. In GN, set `use_debug_fission=false` in
414your "gn args".
andybons3322f762015-08-24 21:37:09415
416## Core files
andybons3322f762015-08-24 21:37:09417
andybonsad92aa32015-08-31 02:27:44418`ulimit -c unlimited` should cause all Chrome processes (run from that shell) to
419dump cores, with the possible exception of some sandboxed processes.
andybons3322f762015-08-24 21:37:09420
andybonsad92aa32015-08-31 02:27:44421Some sandboxed subprocesses might not dump cores unless you pass the
422`--allow-sandbox-debugging` flag.
423
424If the problem is a freeze rather than a crash, you may be able to trigger a
425core-dump by sending SIGABRT to the relevant process:
426
427 kill -6 [process id]
andybons3322f762015-08-24 21:37:09428
429## Breakpad minidump files
430
Tom Andersonabdbd6a2020-01-09 16:59:27431See [minidump_to_core.md](minidump_to_core.md)
andybons3322f762015-08-24 21:37:09432
433## Running Tests
andybonsad92aa32015-08-31 02:27:44434
435Many of our tests bring up windows on screen. This can be annoying (they steal
436your focus) and hard to debug (they receive extra events as you mouse over them).
437Instead, use `Xvfb` or `Xephyr` to run a nested X session to debug them, as
sisidovskif270241c2021-08-04 07:07:44438outlined on [testing/web_tests_linux.md](../testing/web_tests_linux.md).
Brett Wilson41a7de02023-04-27 18:56:54439
andybons3322f762015-08-24 21:37:09440### Browser tests
andybonsad92aa32015-08-31 02:27:44441
442By default the `browser_tests` forks a new browser for each test. To debug the
443browser side of a single test, use a command like
444
andybons3322f762015-08-24 21:37:09445```
Thomas Lukaszewicz2c5fb6142019-10-14 19:20:05446gdb --args out/Debug/browser_tests --single-process-tests --gtest_filter=MyTestName
andybons3322f762015-08-24 21:37:09447```
andybonsad92aa32015-08-31 02:27:44448
Thomas Lukaszewicz2c5fb6142019-10-14 19:20:05449**note the use of `single-process-tests`** -- this makes the test harness and
andybonsad92aa32015-08-31 02:27:44450browser process share the outermost process.
andybons3322f762015-08-24 21:37:09451
Brett Wilson41a7de02023-04-27 18:56:54452The switch `--gtest_break_on_failure` can also be useful to automatically stop
453debugger upon `ASSERT` or `EXPECT` failures.
andybons3322f762015-08-24 21:37:09454
455To debug a renderer process in this case, use the tips above about renderers.
456
Kent Tamura59ffb022018-11-27 05:30:56457### Web tests
andybonsad92aa32015-08-31 02:27:44458
sisidovskif270241c2021-08-04 07:07:44459See [testing/web_tests_linux.md](../testing/web_tests_linux.md) for some tips. In particular,
Kent Tamura59ffb022018-11-27 05:30:56460note that it's possible to debug a web test via `ssh`ing to a Linux box; you
andybonsad92aa32015-08-31 02:27:44461don't need anything on screen if you use `Xvfb`.
andybons3322f762015-08-24 21:37:09462
463### UI tests
andybons3322f762015-08-24 21:37:09464
andybonsad92aa32015-08-31 02:27:44465UI tests are run in forked browsers. Unlike browser tests, you cannot do any
466single process tricks here to debug the browser. See below about
467`BROWSER_WRAPPER`.
468
469To pass flags to the browser, use a command line like
470`--extra-chrome-flags="--foo --bar"`.
andybons3322f762015-08-24 21:37:09471
472### Timeouts
andybonsad92aa32015-08-31 02:27:44473
474UI tests have a confusing array of timeouts in place. (Pawel is working on
475reducing the number of timeouts.) To disable them while you debug, set the
476timeout flags to a large value:
477
478* `--test-timeout=100000000`
479* `--ui-test-action-timeout=100000000`
480* `--ui-test-terminate-timeout=100000000`
andybons3322f762015-08-24 21:37:09481
482### To replicate Window Manager setup on the bots
andybonsad92aa32015-08-31 02:27:44483
484Chromium try bots and main waterfall's bots run tests under Xvfb&openbox
485combination. Xvfb is an X11 server that redirects the graphical output to the
486memory, and openbox is a simple window manager that is running on top of Xvfb.
487The behavior of openbox is markedly different when it comes to focus management
488and other window tasks, so test that runs fine locally may fail or be flaky on
489try bots. To run the tests on a local machine as on a bot, follow these steps:
andybons3322f762015-08-24 21:37:09490
491Make sure you have openbox:
andybonsad92aa32015-08-31 02:27:44492
493 apt-get install openbox
494
andybons3322f762015-08-24 21:37:09495Start Xvfb and openbox on a particular display:
andybonsad92aa32015-08-31 02:27:44496
497 Xvfb :6.0 -screen 0 1280x1024x24 & DISPLAY=:6.0 openbox &
498
andybons3322f762015-08-24 21:37:09499Run your tests with graphics output redirected to that display:
andybonsad92aa32015-08-31 02:27:44500
501 DISPLAY=:6.0 out/Debug/browser_tests --gtest_filter="MyBrowserTest.MyActivateWindowTest"
502
andybons3322f762015-08-24 21:37:09503You can look at a snapshot of the output by:
andybonsad92aa32015-08-31 02:27:44504
505 xwd -display :6.0 -root | xwud
andybons3322f762015-08-24 21:37:09506
507Alternatively, you can use testing/xvfb.py to set up your environment for you:
andybons3322f762015-08-24 21:37:09508
thomasanderson3d074282016-12-06 18:21:12509 testing/xvfb.py out/Debug/browser_tests \
andybonsad92aa32015-08-31 02:27:44510 --gtest_filter="MyBrowserTest.MyActivateWindowTest"
andybons3322f762015-08-24 21:37:09511
nodira6074d4c2015-09-01 04:26:45512### BROWSER_WRAPPER
andybonsad92aa32015-08-31 02:27:44513
514You can also get the browser under a debugger by setting the `BROWSER_WRAPPER`
515environment variable. (You can use this for `browser_tests` too, but see above
516for discussion of a simpler way.)
517
518 BROWSER_WRAPPER='xterm -e gdb --args' out/Debug/browser_tests
andybons3322f762015-08-24 21:37:09519
qyearsleyc0dc6f42016-12-02 22:13:39520### Replicating try bot Slowness
andybons3322f762015-08-24 21:37:09521
qyearsleyc0dc6f42016-12-02 22:13:39522Try bots are pretty stressed, and can sometimes expose timing issues you can't
andybonsad92aa32015-08-31 02:27:44523normally reproduce locally.
andybons3322f762015-08-24 21:37:09524
andybonsad92aa32015-08-31 02:27:44525You can simulate this by shutting down all but one of the CPUs
526(http://www.cyberciti.biz/faq/debian-rhel-centos-redhat-suse-hotplug-cpu/) and
527running a CPU loading tool (e.g., http://www.devin.com/lookbusy/). Now run your
qyearsleyc0dc6f42016-12-02 22:13:39528test. It will run slowly, but any flakiness found by the try bot should replicate
andybonsad92aa32015-08-31 02:27:44529locally now - and often nearly 100% of the time.
andybons3322f762015-08-24 21:37:09530
531## Logging
andybons3322f762015-08-24 21:37:09532
andybonsad92aa32015-08-31 02:27:44533### Seeing all LOG(foo) messages
534
535Default log level hides `LOG(INFO)`. Run with `--log-level=0` and
536`--enable-logging=stderr` flags.
537
qyearsleyc0dc6f42016-12-02 22:13:39538Newer versions of Chromium with VLOG may need --v=1 too. For more VLOG tips, see
xiaoyin.l1003c0b2016-12-06 02:51:17539[the chromium-dev thread](https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/dcd0cd7752b35de6?pli=1).
andybons3322f762015-08-24 21:37:09540
541### Seeing IPC debug messages
andybons3322f762015-08-24 21:37:09542
andybonsad92aa32015-08-31 02:27:44543Run with `CHROME_IPC_LOGGING=1` eg.
544
545 CHROME_IPC_LOGGING=1 out/Debug/chrome
546
547or within gdb:
548
549 set environment CHROME_IPC_LOGGING 1
550
551If some messages show as unknown, check if the list of IPC message headers in
nodira6074d4c2015-09-01 04:26:45552[chrome/common/logging_chrome.cc](/chrome/common/logging_chrome.cc) is
thakis3e861de2016-06-14 14:24:01553up to date. In case this file reference goes out of date, try looking for usage
nodira6074d4c2015-09-01 04:26:45554of macros like `IPC_MESSAGE_LOG_ENABLED` or `IPC_MESSAGE_MACROS_LOG_ENABLED`.
andybons3322f762015-08-24 21:37:09555
andybons3322f762015-08-24 21:37:09556## Profiling
andybonsad92aa32015-08-31 02:27:44557
558See
559https://sites.google.com/a/chromium.org/dev/developers/profiling-chromium-and-webkit
Tom Anderson93e49e492019-12-23 19:55:37560and [Linux Profiling](profiling.md).
andybons3322f762015-08-24 21:37:09561
562## i18n
andybons3322f762015-08-24 21:37:09563
andybonsad92aa32015-08-31 02:27:44564We obey your system locale. Try something like:
andybons3322f762015-08-24 21:37:09565
andybonsad92aa32015-08-31 02:27:44566 LANG=ja_JP.UTF-8 out/Debug/chrome
567
568If this doesn't work, make sure that the `LANGUAGE`, `LC_ALL` and `LC_MESSAGE`
569environment variables aren't set -- they have higher priority than LANG in the
570order listed. Alternatively, just do this:
571
572 LANGUAGE=fr out/Debug/chrome
573
574Note that because we use GTK, some locale data comes from the system -- for
575example, file save boxes and whether the current language is considered RTL.
576Without all the language data available, Chrome will use a mixture of your
577system language and the language you run Chrome in.
andybons3322f762015-08-24 21:37:09578
579Here's how to install the Arabic (ar) and Hebrew (he) language packs:
andybonsad92aa32015-08-31 02:27:44580
581 sudo apt-get install language-pack-ar language-pack-he \
582 language-pack-gnome-ar language-pack-gnome-he
583
andybons3322f762015-08-24 21:37:09584Note that the `--lang` flag does **not** work properly for this.
585
Tom Anderson287339e2018-08-22 21:52:02586On non-Debian systems, you need the `gtk30.mo` files. (Please update these docs
andybonsad92aa32015-08-31 02:27:44587with the appropriate instructions if you know what they are.)
andybons3322f762015-08-24 21:37:09588
589## Breakpad
andybonsad92aa32015-08-31 02:27:44590
Tom Anderson93e49e492019-12-23 19:55:37591See the last section of [Linux Crash Dumping](crash_dumping.md).
andybons3322f762015-08-24 21:37:09592
593## Drag and Drop
andybonsad92aa32015-08-31 02:27:44594
595If you break in a debugger during a drag, Chrome will have grabbed your mouse
596and keyboard so you won't be able to interact with the debugger! To work around
597this, run via `Xephyr`. Instructions for how to use `Xephyr` are on the
sisidovskif270241c2021-08-04 07:07:44598[Running web tests on Linux](../testing/web_tests_linux.md) page.
andybons3322f762015-08-24 21:37:09599
600## Tracking Down Bugs
601
602### Isolating Regressions
andybons3322f762015-08-24 21:37:09603
andybonsad92aa32015-08-31 02:27:44604Old builds are archived here:
xiaoyin.l1003c0b2016-12-06 02:51:17605https://build.chromium.org/buildbot/snapshots/chromium-rel-linux/
nodira6074d4c2015-09-01 04:26:45606(TODO: does not exist).
andybonsad92aa32015-08-31 02:27:44607
608`tools/bisect-builds.py` in the tree automates bisecting through the archived
609builds. Despite a computer science education, I am still amazed how quickly
610binary search will find its target.
andybons3322f762015-08-24 21:37:09611
612### Screen recording for bug reports
andybonsad92aa32015-08-31 02:27:44613
614 sudo apt-get install gtk-recordmydesktop
andybons3322f762015-08-24 21:37:09615
616## Version-specific issues
617
618### Google Chrome
andybonsad92aa32015-08-31 02:27:44619
620Google Chrome binaries don't include symbols. Googlers can read where to get
621symbols from
622[the Google-internal wiki](http://wiki/Main/ChromeOfficialBuildLinux#The_Build_Archive).
andybons3322f762015-08-24 21:37:09623
624### Ubuntu Chromium
andybonsad92aa32015-08-31 02:27:44625
626Since we don't build the Ubuntu packages (Ubuntu does) we can't get useful
627backtraces from them. Direct users to https://wiki.ubuntu.com/Chromium/Debugging
andybons3322f762015-08-24 21:37:09628
629### Fedora's Chromium
andybonsad92aa32015-08-31 02:27:44630
631Like Ubuntu, but direct users to
632https://fedoraproject.org/wiki/TomCallaway/Chromium_Debug
andybons3322f762015-08-24 21:37:09633
634### Xlib
andybonsad92aa32015-08-31 02:27:44635
andybons3322f762015-08-24 21:37:09636If you're trying to track down X errors like:
andybonsad92aa32015-08-31 02:27:44637
andybons3322f762015-08-24 21:37:09638```
639The program 'chrome' received an X Window System error.
640This probably reflects a bug in the program.
641The error was 'BadDrawable (invalid Pixmap or Window parameter)'.
642```
andybonsad92aa32015-08-31 02:27:44643
andybons3322f762015-08-24 21:37:09644Some strategies are:
andybonsad92aa32015-08-31 02:27:44645
646* pass `--sync` on the command line to make all X calls synchronous
647* run chrome via [xtrace](http://xtrace.alioth.debian.org/)
648* turn on IPC debugging (see above section)
andybons3322f762015-08-24 21:37:09649
650### Window Managers
andybons3322f762015-08-24 21:37:09651
andybonsad92aa32015-08-31 02:27:44652To test on various window managers, you can use a nested X server like `Xephyr`.
653Instructions for how to use `Xephyr` are on the
sisidovskif270241c2021-08-04 07:07:44654[Running web tests on Linux](../testing/web_tests_linux.md) page.
andybonsad92aa32015-08-31 02:27:44655
656If you need to test something with hardware accelerated compositing
657(e.g., compiz), you can use `Xgl` (`sudo apt-get install xserver-xgl`). E.g.:
658
659 Xgl :1 -ac -accel glx:pbuffer -accel xv:pbuffer -screen 1024x768
660
andybons3322f762015-08-24 21:37:09661## Mozilla Tips
andybonsad92aa32015-08-31 02:27:44662
663https://developer.mozilla.org/en/Debugging_Mozilla_on_Linux_FAQ
Joshua Pawlickic2464187d2022-02-23 14:27:51664
665## Google Chrome Symbol Files
666
667Symbols for Google Chrome's official builds are available from
668`https://edgedl.me.gvt1.com/chrome/linux/symbols/google-chrome-debug-info-linux64-${VERSION}.zip`
669where ${VERSION} is any version of Google Chrome that has recently been served
Robert Flackcdbf8c4a2022-11-18 18:12:34670to Stable, Beta, or Unstable (Dev) channels on Linux.