blob: 9430ed56011f63851a6f3ddb1e0c3ad3ffb91188 [file] [log] [blame] [view]
nyquistc75738d2016-09-13 19:25:011# Android Debugging Instructions
nyquistc75738d2016-09-13 19:25:012Chrome on Android has java and c/c++ code. Each "side" have its own set of tools
3for debugging. Here's some tips.
4
5[TOC]
6
Victor Hugo Vianna Silva12ddacb2020-09-18 01:29:257## Instructions for Google Employees
8
9See also
10[go/clankium/06-debugging-clank](https://goto.google.com/clankium/06-debugging-clank).
11
agrievee453b98f2018-10-22 14:17:1712## Launching
13You can run the app by using one of the wrappers.
nyquistc75738d2016-09-13 19:25:0114
15```shell
agrievee453b98f2018-10-22 14:17:1716# Installs, launches, and enters logcat.
17out/Default/bin/content_shell_apk run --args='--disable-fre' 'data:text/html;utf-8,<html>Hello World!</html>'
18# Launches without first installing. Does not show logcat.
19out/Default/bin/chrome_public_apk launch --args='--disable-fre' 'data:text/html;utf-8,<html>Hello World!</html>'
nyquistc75738d2016-09-13 19:25:0120```
21
agrievee453b98f2018-10-22 14:17:1722## Logging
nyquistc75738d2016-09-13 19:25:0123[Chromium logging from LOG(INFO)](https://chromium.googlesource.com/chromium/src/+/master/docs/android_logging.md)
24etc., is directed to the Android logcat logging facility. You can filter the
25messages, e.g. view chromium verbose logging, everything else at warning level
26with:
27
28```shell
agrievee453b98f2018-10-22 14:17:1729# Shows a coloured & filtered logcat.
30out/Default/bin/chrome_public_apk logcat [-v] # Use -v to show logs for other processes
nyquistc75738d2016-09-13 19:25:0131```
32
David Van Clevee0021d32020-01-29 16:02:5833If this doesn't display the logs you're looking for, try `adb logcat` with your system `adb`
34or the one in `//third_party/android_sdk/`.
35
nyquistc75738d2016-09-13 19:25:0136### Warnings for Blink developers
nyquistc75738d2016-09-13 19:25:0137* **Do not use fprintf or printf debugging!** This does not
38 redirect to logcat.
39
40* Redirecting stdio to logcat, as documented
41 [here](https://developer.android.com/studio/command-line/logcat.html#viewingStd),
42 has a bad side-effect that it breaks `adb_install.py`. See
43 [here for details](http://stackoverflow.com/questions/28539676/android-adb-fails-to-install-apk-to-nexus-5-on-windows-8-1).
44
agrievee453b98f2018-10-22 14:17:1745## Take a Screenshot
nyquistc75738d2016-09-13 19:25:0146```shell
47build/android/screenshot.py /tmp/screenshot.png
48```
49
agrievee453b98f2018-10-22 14:17:1750## Inspecting the View Hierarchy
51Generate an [Android Studio](android_studio.md) project, and then use
52[Layout Inspector](https://developer.android.com/studio/debug/layout-inspector).
nyquistc75738d2016-09-13 19:25:0153
54## Debugging Java
Andrew Grieve4fe99742017-11-23 19:43:1655For both apk and test targets, pass `--wait-for-java-debugger` to the wrapper
56scripts.
57
58Examples:
59
60```shell
61# Install, launch, and wait:
62out/Default/bin/chrome_public_apk run --wait-for-java-debugger
63
64# Launch, and have GPU process wait rather than Browser process:
65out/Default/bin/chrome_public_apk launch --wait-for-java-debugger --debug-process-name privileged_process0
66
67# Have Renderers wait:
68out/Default/bin/chrome_public_apk launch --args="--renderer-wait-for-java-debugger"
69
70# Have tests wait:
71out/Default/bin/run_chrome_public_test_apk --wait-for-java-debugger
72out/Default/bin/run_chrome_junit_tests --wait-for-java-debugger # Specify custom port via --debug-socket=9999
73```
74
75### Android Studio
76* Open Android Studio ([instructions](android_studio.md))
77* Click "Run"->"Attach debugger to Android process" (see
Wei-Yin Chen (陳威尹)0f8750b32017-12-08 21:42:1578[here](https://developer.android.com/studio/debug/index.html) for more).
agrievee453b98f2018-10-22 14:17:1779* Click "Run"->"Attach to Local Process..." for Robolectric junit tests.
Andrew Grieve4fe99742017-11-23 19:43:1680
estevenson8c9318ff2017-03-10 22:16:3581### Eclipse
nyquistc75738d2016-09-13 19:25:0182* In Eclipse, make a debug configuration of type "Remote Java Application".
83 Choose a "Name" and set "Port" to `8700`.
84
85* Make sure Eclipse Preferences > Run/Debug > Launching > "Build (if required)
86 before launching" is unchecked.
87
88* Run Android Device Monitor:
89
90 ```shell
Yun Liuf57cceaf2019-03-18 21:31:2391 third_party/android_sdk/public/tools/monitor
nyquistc75738d2016-09-13 19:25:0192 ```
93
94* Now select the process you want to debug in Device Monitor (the port column
95 should now mention 8700 or xxxx/8700).
96
97* Run your debug configuration, and switch to the Debug perspective.
98
nyquistc75738d2016-09-13 19:25:0199## Debugging C/C++
agrievee453b98f2018-10-22 14:17:17100While the app is running, use the wrapper script's `gdb` command to enter into a
101gdb shell.
nyquistc75738d2016-09-13 19:25:01102
agrievee453b98f2018-10-22 14:17:17103When running with gdb attached, the app runs **extremely slowly**.
nyquistc75738d2016-09-13 19:25:01104
105```shell
Andrew Grieve4fe99742017-11-23 19:43:16106# Attaches to browser process.
Andrew Grievec81af4a2017-07-26 18:02:13107out/Default/bin/content_shell_apk gdb
108out/Default/bin/chrome_public_apk gdb
Andrew Grieve4fe99742017-11-23 19:43:16109
110# Attaches to gpu process.
111out/Default/bin/chrome_public_apk gdb --debug-process-name privileged_process0
112
113# Attach to other processes ("chrome_public_apk ps" to show pids).
114out/Default/bin/chrome_public_apk gdb --pid $PID
nyquistc75738d2016-09-13 19:25:01115```
116
agrievee453b98f2018-10-22 14:17:17117When connecting, gdb will complain of not being able to load a lot of libraries.
118This happens because of java code. The following messages are all expected:
119```
120Connecting to :5039...
121warning: Could not load shared library symbols for 211 libraries, e.g. /system/framework/arm/boot.oat.
122Use the "info sharedlibrary" command to see the complete listing.
123Do you need "set solib-search-path" or "set sysroot"?
124Failed to read a valid object file image from memory.
125```
126
Stefan Zagere2b55cc2019-10-04 19:57:54127If you have ever run an ASAN build of chromium on the device, you may get
128an error like the following when you start up gdb:
129```
130/tmp/<username>-adb-gdb-tmp-<pid>/gdb.init:11: Error in sourced command file:
131"/tmp/<username>-adb-gdb-tmp-<pid>/app_process32": not in executable format: file format not recognized
132```
133If this happens, run the following command and try again:
134```shell
135$ src/android/asan/third_party/asan_device_setup.sh --revert
136```
137
agrievee453b98f2018-10-22 14:17:17138### Using Visual Studio Code
139While the app is running, run the `gdb` command with `--ide`:
140
141```shell
142out/Default/bin/content_shell_apk gdb --ide
143```
144
145Once the script has done its thing (generally ~1 second after the initial
146time its used), open [vscode.md](vscode.md) and ensure you have the
147[Android launch entry](vscode.md#Launch-Commands).
148
149Connect via the IDE's launch entry. Connecting takes 30-40 seconds.
150
151When troubleshooting, it's helpful to enable
152[engine logging](https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md#enginelogging).
153
154Known Issues:
155 * Pretty printers are not working properly.
156
Andrew Grieve4fe99742017-11-23 19:43:16157### Waiting for Debugger on Early Startup
agrievee453b98f2018-10-22 14:17:17158```shell
159# Install, launch, and wait:
160out/Default/bin/chrome_public_apk run --args="--wait-for-debugger"
161# Launch, and have GPU process wait rather than Browser process:
162out/Default/bin/chrome_public_apk launch --args="--wait-for-debugger-children=gpu-process"
163# Or for renderers:
164out/Default/bin/chrome_public_apk launch --args="--wait-for-debugger-children=renderer"
nyquistc75738d2016-09-13 19:25:01165```
166
agrievee453b98f2018-10-22 14:17:17167#### With an IDE
168Once `gdb` attaches, the app will resume execution, so you must set your
169breakpoint before attaching.
nyquistc75738d2016-09-13 19:25:01170
agrievee453b98f2018-10-22 14:17:17171#### With Command-line GDB
172Once attached, gdb will drop into a prompt. Set your breakpoints and run "c" to
173continue.
nyquistc75738d2016-09-13 19:25:01174
175## Symbolizing Crash Stacks and Tombstones (C++)
176
177If a crash has generated a tombstone in your device, use:
178
179```shell
180build/android/tombstones.py --output-directory out/Default
181```
182
183If you have a stack trace (from `adb logcat`) that needs to be symbolized, copy
184it into a text file and symbolize with the following command (run from
185`${CHROME_SRC}`):
186
187```shell
188third_party/android_platform/development/scripts/stack --output-directory out/Default [tombstone file | dump file]
189```
190
191`stack` can also take its input from `stdin`:
192
193```shell
194adb logcat -d | third_party/android_platform/development/scripts/stack --output-directory out/Default
195```
196
197Example:
198
199```shell
200third_party/android_platform/development/scripts/stack --output-directory out/Default ~/crashlogs/tombstone_07-build231.txt
201```
202
203## Deobfuscating Stack Traces (Java)
204
205You will need the ProGuard mapping file that was generated when the application
206that crashed was built. When building locally, these are found in:
207
208```shell
209out/Default/apks/ChromePublic.apk.mapping
agrievea350dbdb2017-07-05 15:27:17210etc.
nyquistc75738d2016-09-13 19:25:01211```
212
Sami Kyostila3269af12019-07-02 19:02:45213When debugging a failing test on the build waterfall, you can find the mapping
214file as follows:
215
2161. Open buildbot page for the failing build (e.g.,
217 https://ci.chromium.org/p/chrome/builders/ci/android-go-perf/1234).
2182. Open the swarming page for the failing shard (e.g., shard #3).
2193. Click on "Isolated Inputs" to locate the files the shard used to run the
220 test.
2214. Download the `.mapping` file for the APK used by the test (e.g.,
222 `ChromePublic.apk.mapping`). Note that you may need to use the
Takuto Ikuta93b8eb802020-01-30 12:11:28223 `tools/luci-go/isolated` to download the mapping file if it's too big. The
224 viewer will provide instructions for this.
Sami Kyostila3269af12019-07-02 19:02:45225
Andrew Grieveabcac41a2019-08-14 17:16:18226**Googlers Only**: For official build mapping files, see
227[go/chromejavadeobfuscation](https://goto.google.com/chromejavadeobfuscation).
228
Andrew Grieve17a59652020-03-19 18:14:53229Once you have a .mapping file:
nyquistc75738d2016-09-13 19:25:01230
231```shell
agrievea350dbdb2017-07-05 15:27:17232# For a file:
Andrew Grieve17a59652020-03-19 18:14:53233build/android/stacktrace/java_deobfuscate.py PROGUARD_MAPPING_FILE.mapping < FILE
agrievea350dbdb2017-07-05 15:27:17234# For logcat:
Andrew Grieve17a59652020-03-19 18:14:53235adb logcat | build/android/stacktrace/java_deobfuscate.py PROGUARD_MAPPING_FILE.mapping
nyquistc75738d2016-09-13 19:25:01236```
237
238## Get WebKit code to output to the adb log
239
240In your build environment:
241
242```shell
243adb root
244adb shell stop
245adb shell setprop log.redirect-stdio true
246adb shell start
247```
248
249In the source itself, use `fprintf(stderr, "message");` whenever you need to
250output a message.
251
252## Debug unit tests with GDB
253
254To run unit tests use the following command:
255
256```shell
jbudorick6a94be32017-05-11 22:38:43257out/Debug/bin/run_test_name -f <test_filter_if_any> --wait-for-debugger -t 6000
nyquistc75738d2016-09-13 19:25:01258```
259
260That command will cause the test process to wait until a debugger is attached.
261
262To attach a debugger:
263
264```shell
265build/android/adb_gdb --output-directory=out/Default --package-name=org.chromium.native_test
266```
267
268After attaching gdb to the process you can use it normally. For example:
269
270```
271(gdb) break main
272Breakpoint 1 at 0x9750793c: main. (2 locations)
273(gdb) continue
274```