Home | History | Annotate | Download | only in debug
      1 page.title=Debugging Native Android Platform Code
      2 @jd:body
      3 
      4 <!--
      5     Copyright 2015 The Android Open Source Project
      6 
      7     Licensed under the Apache License, Version 2.0 (the "License");
      8     you may not use this file except in compliance with the License.
      9     You may obtain a copy of the License at
     10 
     11         http://www.apache.org/licenses/LICENSE-2.0
     12 
     13     Unless required by applicable law or agreed to in writing, software
     14     distributed under the License is distributed on an "AS IS" BASIS,
     15     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16     See the License for the specific language governing permissions and
     17     limitations under the License.
     18 -->
     19 <div id="qv-wrapper">
     20   <div id="qv">
     21     <h2>In this document</h2>
     22     <ol id="auto-toc"></ol>
     23   </div>
     24 </div>
     25 
     26 <p>This page contains a summary of useful tools and related commands for
     27 debugging, tracing, and profiling native Android platform code. The pages
     28 within this section contain detailed information on other debugging tools for
     29 use during development of platform-level features.</p>
     30 
     31 <p>For example, you may learn how to explore system services with <a
     32 href="dumpsys.html">Dumpsys</a> and evaluate <a
     33 href="netstats.html">network</a> and <a href="procstats.html">RAM</a> use. See
     34 the subpages for tools and methods not described below.</p>
     35 
     36 <h2 id=debuggerd>debuggerd</h2>
     37 
     38 <p>When a dynamically-linked executable starts, several signal handlers are
     39 registered that connect to <code>debuggerd</code> (or <code>debuggerd64)</code> in the event that signal
     40 is sent to the process. The <code>debuggerd</code> process dumps registers and unwinds the
     41 stack. Here is example output (with timestamps and extraneous information removed): </p>
     42 
     43 <pre>
     44 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
     45 Build fingerprint: 'Android/aosp_flounder/flounder:5.1.51/AOSP/enh08201009:eng/test-keys'
     46 Revision: '0'
     47 ABI: 'arm'
     48 pid: 1656, tid: 1656, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
     49 signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
     50 Abort message: 'some_file.c:123: some_function: assertion "false" failed'
     51     r0 00000000  r1 00000678  r2 00000006  r3 f70b6dc8
     52     r4 f70b6dd0  r5 f70b6d80  r6 00000002  r7 0000010c
     53     r8 ffffffed  r9 00000000  sl 00000000  fp ff96ae1c
     54     ip 00000006  sp ff96ad18  lr f700ced5  pc f700dc98  cpsr 400b0010
     55 backtrace:
     56     #00 pc 00042c98  /system/lib/libc.so (tgkill+12)
     57     #01 pc 00041ed1  /system/lib/libc.so (pthread_kill+32)
     58     #02 pc 0001bb87  /system/lib/libc.so (raise+10)
     59     #03 pc 00018cad  /system/lib/libc.so (__libc_android_abort+34)
     60     #04 pc 000168e8  /system/lib/libc.so (abort+4)
     61     #05 pc 0001a78f  /system/lib/libc.so (__libc_fatal+16)
     62     #06 pc 00018d35  /system/lib/libc.so (__assert2+20)
     63     #07 pc 00000f21  /system/xbin/crasher
     64     #08 pc 00016795  /system/lib/libc.so (__libc_init+44)
     65     #09 pc 00000abc  /system/xbin/crasher
     66 Tombstone written to: /data/tombstones/tombstone_06
     67 </pre>
     68 
     69 <p>This can be pasted into <code>development/scripts/stack</code> to get a more detailed unwind
     70 with line number information (assuming the unstripped binaries can be found).</p>
     71 
     72 <p>Some libraries on the system are built with <code>LOCAL_STRIP_MODULE :=
     73 keep_symbols</code> to provide usable backtraces directly from debuggerd. This makes
     74 your library or executable slightly larger, but not nearly as large as an
     75 unstripped version.</p>
     76 
     77 <p>Note also the last line of <code>debuggerd</code> output --- in addition to dumping a
     78 summary to the log, <code>debuggerd</code> writes a full tombstone to disk. This contains
     79 a lot of extra information that can be helpful in debugging a crash, in
     80 particular the stack traces for all the threads in the crashing process (not
     81 just the thread that caught the signal) and a full memory map.</p>
     82 
     83 <h2 id=native>Native Debugging with GDB</h2>
     84 
     85 <h3 id=running>Debugging a running app</h3>
     86 
     87 <p>To connect to an already-running app or native daemon, use <code>gdbclient</code>.</p>
     88 
     89 <p>Current versions of gdbclient just require the process ID (PID). So to debug a process with
     90 PID 1234, simply run:</p>
     91 <pre>
     92 $ gdbclient 1234
     93 </pre>
     94 <p>The script will set up port forwarding, start the appropriate
     95 <code>gdbserver</code> on the device, start the appropriate <code>gdb</code> on
     96 the host, configure <code>gdb</code> to find symbols, and connect
     97 <code>gdb</code> to the remote <code>gdbserver</code>.</p>
     98 
     99 <h3 id=starts>Debugging a native process as it starts</h3>
    100 
    101 <p>If you want to debug a process as it starts, youll need to use <code>gdbserver</code>
    102 manually, but thats easy too:</p>
    103 
    104 <pre>
    105 $ adb shell gdbserver :5039 /system/bin/<em>my_test_app</em>
    106 Process my_test_app created; pid = 3460
    107 Listening on port 5039
    108 </pre>
    109 
    110 <p>Identify the apps PID from the <code>gdbserver</code> output, and then in
    111 another window:</p>
    112 
    113 <pre>
    114 $ gdbclient <em>&lt;app pid&gt;</em>
    115 </pre>
    116 
    117 <p>Then enter <strong>continue</strong> at the <code>gdb</code> prompt.</p>
    118 
    119 <h3 id=crash>Debugging processes that crash</h3>
    120 
    121 <p>If you want <code>debuggerd</code> to suspend crashed processes so you can
    122 attach <code>gdb</code>, set the appropriate property:</p>
    123 
    124 <pre>
    125 $ adb shell setprop debug.db.uid 999999                 # &lt;= M
    126 $ adb shell setprop debug.debuggerd.wait_for_gdb true   # &gt; M
    127 </pre>
    128 
    129 <p>At the end of the usual crash output, <code>debuggerd</code> will give you
    130 instructions on how to connect <code>gdb</code> using the typical command:
    131 <pre>
    132 $ gdbclient &lt;pid&gt;
    133 </pre>
    134 
    135 <h3 id=symbols>Debugging without symbols</h3>
    136 
    137 <p>If you dont have symbols, sometimes <code>gdb</code> will get confused about the
    138 instruction set it is disassembling (ARM or Thumb). The instruction set that is
    139 chosen as the default when symbol information is missing can be switched
    140 between ARM or Thumb like so:</p>
    141 
    142 <pre>
    143 $ set arm fallback-mode arm   # or 'thumb'
    144 </pre>
    145 
    146 <h2 id=symbols>Other tools</h2>
    147 
    148 <h3 id=valgrind>Valgrind</h3>
    149 
    150 <p>The following steps show you how to use <a
    151 href="http://valgrind.org/">Valgrind</a> on Android. This tool suite contains a
    152 number of tools including Memcheck for detecting memory-related errors in C and
    153 C++.</p>
    154 
    155 <ol>
    156   <li>To install Valgrind, run:
    157 <pre>
    158 $ mmm -j6 external/valgrind
    159 </pre>
    160   <li>Push Valgrind to the device:
    161     <br>
    162 <pre>
    163 $ adb remount
    164 $ adb sync
    165 </pre>
    166   <li>Set up the temporary directory:
    167 <pre>
    168 $ adb shell mkdir /data/local/tmp
    169 $ adb shell chmod 777 /data/local/tmp
    170 </pre>
    171   <li>Run the system server with Valgrind:
    172 <pre>
    173 $ adb root
    174 $ adb shell setprop wrap.system_server "logwrapper valgrind"
    175 $ adb shell stop && adb shell start
    176 </pre>
    177   <li>For debug symbols, push unstripped libraries to <code>/data/local/symbols</code>:
    178 <pre>
    179 $ adb shell mkdir /data/local/symbols
    180 $ adb push $OUT/symbols /data/local/symbols
    181 </pre>
    182   <li>To use Valgrind during boot up, edit <code>out/target/product/XXXX/root/init.rc</code> and
    183 change:<br>
    184 <code>service example /system/bin/foo --arg1 --arg2</code><br>
    185 to:<br>
    186 <code>service example /system/bin/logwrapper /system/bin/valgrind /system/bin/foo --arg1 --arg2</code><br>
    187 To see the effects, you need to create a <code>boot.img</code> and reflash the device.
    188 </ol>
    189 
    190 <h3 id=systrace>Systrace</h3>
    191 
    192 <p>See <a
    193 href="https://developer.android.com/tools/help/systrace.html">Systrace on
    194 developer.android.com</a> for deriving execution times of applications and
    195 other Android system processes.</p>
    196