1 page.title=Debugging Native Code 2 pdk.version=1.0 3 doc.type=porting 4 @jd:body 5 6 7 <div id="qv-wrapper"> 8 <div id="qv"> 9 <h2>In this document</h2> 10 <a name="toc"/> 11 <ul> 12 <li><a href="#Capturing_logs">Capturing logs</a></li> 13 <li><a href="#Debug_Scenarios">Debug Scenarios</a></li> 14 </ul> 15 </div> 16 </div> 17 18 <a name="Capturing_logs"></a><h3>Capturing logs</h3> 19 20 <p>To capture log output:</p> 21 <ol> 22 <li> Produce a process list with <code>ps</code> (<code>ps -t</code> if you want verbose thread feedback).</li> 23 <li> Dump kernel messages with <code>dmesg</code>.</li> 24 <li> Get verbose log messages with <code>logcat '*:v' &</code> (running in bg with & is important).</li> 25 26 </ol> 27 28 <a name="Debug_Scenarios"></a><h3>Debug Scenarios</h3> 29 <pre class="prettify"> 30 # command to device shell (via adb) 31 % command to host pc shell 32 </pre> 33 <p> 34 </p> 35 36 <a name="Crash_but_no_exit_stuck"></a><h4>Crash but no exit...stuck</h4> 37 38 <p>In this scenario, the GTalk app crashed but did not actually exit or seems stuck. Check the debug logs to see if there is anything unusual: </p> 39 40 <pre class="prettify"> 41 # logcat & 42 43 ... 44 E/WindowManager( 182): Window client android.util.BinderProxy@4089f948 has died!! Removing window. 45 W/WindowManager( 182): **** WINDOW CLIENT android.view.WindowProxy@40882248 DIED! 46 W/ActivityManager( 182): **** APPLICATION com.google.android.gtalk DIED! 47 I/ServiceManager( 257): Executing: /android/bin/app_process (link=/tmp/android-servicemanager/com.google.android.gtalk, wrapper=/tmp/android-servi 48 cemanager/com.google.android.gtalk) 49 I/appproc ( 257): App process is starting with pid=257, class=android/activity/ActivityThread. 50 I/ ( 257): java.io.FileDescriptor: class initialization 51 I/SurfaceFlinger.HW( 182): About to give-up screen 52 I/SurfaceFlinger.HW( 182): screen given-up 53 I/SurfaceFlinger.HW( 182): Screen about to return 54 I/SurfaceFlinger.HW( 182): screen returned 55 I/SurfaceFlinger.HW( 182): About to give-up screen 56 I/SurfaceFlinger.HW( 182): screen given-up 57 I/SurfaceFlinger.HW( 182): Screen about to return 58 ... 59 </pre> 60 61 <p> 62 The logs indicate that the system launched a replacement GTalk process but that it got stuck somehow: 63 </p> 64 65 <pre class="prettify"> 66 # ps 67 PID PPID VSIZE RSS WCHAN PC NAME 68 257 181 45780 5292 ffffffff 53030cb4 S com.google.andr 69 </pre> 70 71 <p> 72 GTalk's PC is at 53030cb4. Look at the memory map to find out what lib is 0x53...... 73 </p> 74 75 <pre class="prettify"> 76 # cat /proc/257/maps 77 ... 78 51000000-5107c000 rwxp 00000000 1f:03 619 /android/lib/libutils.so 79 52000000-52013000 rwxp 00000000 1f:03 639 /android/lib/libz.so 80 53000000-53039000 rwxp 00000000 1f:03 668 /android/lib/libc.so 81 53039000-53042000 rw-p 53039000 00:00 0 82 54000000-54002000 rwxp 00000000 1f:03 658 /android/lib/libstdc++.so 83 ... 84 </pre> 85 86 <p> 87 Disassemble <code>libc</code> to figure out what is going on: 88 </p> 89 90 <pre class="prettify"> 91 % prebuilt/Linux/toolchain-eabi-4.2.1/bin/arm-elf-objdump -d out/target/product/sooner/symbols/android/lib/libc.so 92 93 00030ca4 <__futex_wait>: 94 30ca4: e1a03002 mov r3, r2 95 30ca8: e1a02001 mov r2, r1 96 30cac: e3a01000 mov r1, #0 ; 0x0 97 30cb0: ef9000f0 swi 0x009000f0 98 30cb4: e12fff1e bx lr 99 </pre> 100 101 <a name="Blocked_in_a_syscall"></a><h4>Blocked in a syscall</h4> 102 103 <p> 104 In this scenario, the system is blocked in a syscall. To debug using <code>gdb</code>, first tell <code>adb</code> to forward the <code>gdb</code> port: 105 </p> 106 107 <pre class="prettify"> 108 109 % adb forward tcp:5039 tcp:5039 110 </pre> 111 112 <p> 113 Start the <code>gdb</code> server and attach to process 257 (as demonstrated in the previous example): 114 </p> 115 116 <pre class="prettify"> 117 # gdbserver :5039 --attach 257 & 118 Attached; pid = 257 119 Listening on port 5039 120 121 % prebuilt/Linux/toolchain-eabi-4.2.1/bin/arm-elf-gdb out/target/product/sooner/system/bin/app_process 122 (gdb) set solib-absolute-prefix /work/android/device/out/target/product/sooner/symbols 123 (gdb) set solib-search-path /work/android/device/out/target/product/sooner/symbols/android/lib 124 (gdb) target remote :5039 125 Remote debugging using :5039 126 0x53030cb4 in ?? () 127 Current language: auto; currently asm 128 </pre> 129 130 <p> 131 Don't let other threads get scheduled while we're debugging. 132 You should "set scheduler-locking off" before issuing a "continue", or else your thread may get stuck on a futex or other 133 spinlock because no other thread can release it. 134 </p> 135 136 <pre class="prettify"> 137 (gdb) set scheduler-locking on 138 </pre> 139 140 <pre class="prettify"> 141 (gdb) where 142 #0 __futex_wait () at system/klibc/android/atomics_arm.S:88 143 #1 0x53010eb8 in pthread_cond_timedwait (cond=0x12081c, mutex=0x120818, abstime=0xffffffff) 144 at system/klibc/android/pthread.c:490 145 #2 0x6b01c848 in monitorWait (mon=0x120818, self=0x6b039ba4, ms=0, ns=0) at extlibs/jamvm-1.4.1/src/lock.c:194 146 #3 0x6b01d1d8 in objectWait (obj=0x408091c0, ms=0, ns=0) at extlibs/jamvm-1.4.1/src/lock.c:420 147 #4 0x6b01d4c8 in jamWait (clazz=0xfffffffc, mb=0x0, ostack=0x2e188) at extlibs/jamvm-1.4.1/src/natives.c:91 148 #5 0x6b013b2c in resolveNativeWrapper (clazz=0x408001d0, mb=0x41798, ostack=0x2e188) at extlibs/jamvm-1.4.1/src/dll.c:236 149 #6 0x6b015c04 in executeJava () at extlibs/jamvm-1.4.1/src/interp.c:2614 150 #7 0x6b01471c in executeMethodVaList (ob=0x0, clazz=0x40808f20, mb=0x12563c, jargs=0xbe9229f4) 151 at extlibs/jamvm-1.4.1/src/execute.c:91 152 #8 0x6b01bcd0 in Jam_CallStaticVoidMethod (env=0xfffffffc, klass=0x0, methodID=0x12563c) 153 at extlibs/jamvm-1.4.1/src/jni.c:1063 154 #9 0x58025b2c in android::AndroidRuntime::callStatic (this=0xfffffffc, 155 className=0xbe922f0a "android/activity/ActivityThread", methodName=0x57000b7c "main") 156 at libs/android_runtime/AndroidRuntime.cpp:215 157 #10 0x57000504 in android::app_init (className=0xbe922f0a "android/activity/ActivityThread") 158 at servers/app/library/app_init.cpp:20 159 #11 0x000089b0 in android::sp<android::ProcessState>::~sp () 160 #12 0x000089b0 in android::sp<android::ProcessState>::~sp () 161 Previous frame identical to this frame (corrupt stack?) 162 163 (gdb) info threads 164 7 thread 263 __ioctl () at system/klibc/syscalls/__ioctl.S:12 165 6 thread 262 accept () at system/klibc/syscalls/accept.S:12 166 5 thread 261 __futex_wait () at system/klibc/android/atomics_arm.S:88 167 4 thread 260 __futex_wait () at system/klibc/android/atomics_arm.S:88 168 3 thread 259 __futex_wait () at system/klibc/android/atomics_arm.S:88 169 2 thread 258 __sigsuspend () at system/klibc/syscalls/__sigsuspend.S:12 170 1 thread 257 __futex_wait () at system/klibc/android/atomics_arm.S:88 171 172 173 (gdb) thread 7 174 [Switching to thread 7 (thread 263)]#0 __ioctl () at system/klibc/syscalls/__ioctl.S:12 175 12 movs r0, r0 176 (gdb) bt 177 #0 __ioctl () at system/klibc/syscalls/__ioctl.S:12 178 #1 0x53010704 in ioctl (fd=-512, request=-1072143871) at system/klibc/android/ioctl.c:22 179 #2 0x51040ac0 in android::IPCThreadState::talkWithDriver (this=0x1207b8, doReceive=true) at RefBase.h:83 180 #3 0x510418a0 in android::IPCThreadState::joinThreadPool (this=0x1207b8, isMain=false) 181 at libs/utils/IPCThreadState.cpp:343 182 #4 0x51046004 in android::PoolThread::threadLoop (this=0xfffffe00) at libs/utils/ProcessState.cpp:52 183 #5 0x51036428 in android::Thread::_threadLoop (user=0xfffffe00) at libs/utils/Threads.cpp:1100 184 #6 0x58025c68 in android::AndroidRuntime::javaThreadShell (args=0x105ffe28) at libs/android_runtime/AndroidRuntime.cpp:540 185 186 (gdb) thread 6 187 [Switching to thread 6 (thread 262)]#0 accept () at system/klibc/syscalls/accept.S:12 188 12 movs r0, r0 189 (gdb) bt 190 #0 accept () at system/klibc/syscalls/accept.S:12 191 #1 0x6b0334e4 in jdwpAcceptConnection (state=0xfffffe00) at extlibs/jamvm-1.4.1/jdwp/JdwpNet.c:213 192 #2 0x6b032660 in jdwpThreadEntry (self=0x4d020) at extlibs/jamvm-1.4.1/jdwp/JdwpMain.c:37 193 #3 0x6b022c2c in shell (args=0x4d960) at extlibs/jamvm-1.4.1/src/thread.c:629 194 195 (gdb) thread 5 196 [Switching to thread 5 (thread 261)]#0 __futex_wait () at system/klibc/android/atomics_arm.S:88 197 88 bx lr 198 (gdb) bt 199 #0 __futex_wait () at system/klibc/android/atomics_arm.S:88 200 #1 0x53010f48 in pthread_cond_timeout (cond=0x6b039b64, mutex=0x6b039b60, msecs=0) at system/klibc/android/pthread.c:513 201 #2 0x6b01c8d0 in monitorWait (mon=0x6b039b60, self=0x4d400, ms=1000, ns=272629312) at extlibs/jamvm-1.4.1/src/lock.c:183 202 #3 0x6b022084 in threadSleep (thread=0x4d400, ms=1000, ns=272629312) at extlibs/jamvm-1.4.1/src/thread.c:215 203 #4 0x6b00d4fc in asyncGCThreadLoop (self=0x4d400) at extlibs/jamvm-1.4.1/src/alloc.c:1179 204 #5 0x6b022c2c in shell (args=0x4d480) at extlibs/jamvm-1.4.1/src/thread.c:629 205 206 (gdb) thread 4 207 [Switching to thread 4 (thread 260)]#0 __futex_wait () at system/klibc/android/atomics_arm.S:88 208 88 bx lr 209 (gdb) bt 210 #0 __futex_wait () at system/klibc/android/atomics_arm.S:88 211 #1 0x53010eb8 in pthread_cond_timedwait (cond=0x6b039934, mutex=0x6b039930, abstime=0x0) 212 at system/klibc/android/pthread.c:490 213 #2 0x6b00b3ec in referenceHandlerThreadLoop (self=0x4d360) at extlibs/jamvm-1.4.1/src/alloc.c:1247 214 #3 0x6b022c2c in shell (args=0x4d960) at extlibs/jamvm-1.4.1/src/thread.c:629 215 216 (gdb) thread 3 217 [Switching to thread 3 (thread 259)]#0 __futex_wait () at system/klibc/android/atomics_arm.S:88 218 88 bx lr 219 (gdb) bt 220 #0 __futex_wait () at system/klibc/android/atomics_arm.S:88 221 #1 0x53010eb8 in pthread_cond_timedwait (cond=0x6b03992c, mutex=0x6b039928, abstime=0x0) 222 at system/klibc/android/pthread.c:490 223 #2 0x6b00b1dc in finalizerThreadLoop (self=0x4d8e0) at extlibs/jamvm-1.4.1/src/alloc.c:1238 224 #3 0x6b022c2c in shell (args=0x4d960) at extlibs/jamvm-1.4.1/src/thread.c:629 225 226 (gdb) thread 2 227 [Switching to thread 2 (thread 258)]#0 __sigsuspend () at system/klibc/syscalls/__sigsuspend.S:12 228 12 movs r0, r0 229 (gdb) bt 230 #0 __sigsuspend () at system/klibc/syscalls/__sigsuspend.S:12 231 #1 0x6b023814 in dumpThreadsLoop (self=0x51b98) at extlibs/jamvm-1.4.1/src/thread.c:1107 232 #2 0x6b022c2c in shell (args=0x51b58) at extlibs/jamvm-1.4.1/src/thread.c:629 233 </pre> 234 235 <a name="Crash_in_C_C_code"></a><h4>Crash in C / C++ code</h4> 236 <p>If it crashes, connect with <code>adb</code> and run <code>logcat</code> on the device. You should see output like this:</p> 237 238 <pre class="prettify"> 239 I/ActivityManager( 188): Starting activity: Intent { component=com.android.calendar.MonthScreen } 240 I/ActivityManager( 188): Starting application com.android.calendar to host activity com.android.calendar.MonthScree 241 n 242 I/ServiceManager( 417): Executing: /android/bin/app_process (link=/android/bin/app_process, wrapper=/android/bin/app_process) 243 I/DEBUG: -- observer of pid 417 starting -- 244 I/appproc ( 417): App process is starting with pid=417, class=android/activity/ActivityThread. 245 I/DEBUG: -- observer of pid 417 exiting -- 246 I/DEBUG: -- observer of pid 420 starting -- 247 I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 248 I/DEBUG: pid: 373, tid: 401 >>> android.content.providers.pim <<< 249 I/DEBUG: signal 11 (SIGSEGV), fault addr 00000000 250 I/DEBUG: r0 ffffffff r1 00000000 r2 00000454 r3 002136d4 251 I/DEBUG: r4 002136c0 r5 40804810 r6 0022dc70 r7 00000010 252 I/DEBUG: r8 0020a258 r9 00000014 10 6b039074 fp 109ffcf8 253 I/DEBUG: ip 6b039e90 sp 109ffc0c lr 580239f0 pc 6b0156a0 254 I/DEBUG: #01 pc 6b0156a0 /android/lib/libjamvm.so 255 I/DEBUG: #01 lr 580239f0 /android/lib/libandroid_runtime.so 256 I/DEBUG: #02 pc 6b01481c /android/lib/libjamvm.so 257 I/DEBUG: #03 pc 6b0148a4 /android/lib/libjamvm.so 258 I/DEBUG: #04 pc 6b00ebc0 /android/lib/libjamvm.so 259 I/DEBUG: #05 pc 6b02166c /android/lib/libjamvm.so 260 I/DEBUG: #06 pc 6b01657c /android/lib/libjamvm.so 261 I/DEBUG: #07 pc 6b01481c /android/lib/libjamvm.so 262 I/DEBUG: #08 pc 6b0148a4 /android/lib/libjamvm.so 263 I/DEBUG: #09 pc 6b0235c0 /android/lib/libjamvm.so 264 I/DEBUG: #10 pc 5300fac4 /android/lib/libc.so 265 I/DEBUG: #11 pc 5300fc5c /android/lib/libc.so 266 I/DEBUG: -- observer of pid 373 exiting -- 267 I/DEBUG: -- observer of pid 423 starting -- 268 </pre> 269 270 <p>If debugging output indicates an error in C or C++ code, the addresses aren't particularly useful, but the debugging symbols aren't present on the device. Use the "stack" tool to convert these addresses to files and line numbers, for example:</p> 271 272 <pre class="prettify"> 273 pid: 373, tid: 401 >>> android.content.providers.pim <<< 274 275 signal 11 (SIGSEGV), fault addr 00000000 276 r0 ffffffff r1 00000000 r2 00000454 r3 002136d4 277 r4 002136c0 r5 40804810 r6 0022dc70 r7 00000010 278 r8 0020a258 r9 00000014 10 6b039074 fp 109ffcf8 279 r8 0020a258 r9 00000014 10 6b039074 fp 109ffcf8 280 281 ADDR FUNCTION FILE:LINE 282 6b0156a0 executeJava extlibs/jamvm-1.4.1/src/interp.c:2674 283 580239f0 android_util_Parcel_freeBuffer libs/android_runtime/android_util_Binder.cpp:765 284 6b01481c executeMethodVaList extlibs/jamvm- 1.4.1/src/execute.c:91 285 6b0148a4 executeMethodArgs extlibs/jamvm-1.4.1/src/execute.c:67 286 6b00ebc0 initClass extlibs/jamvm-1.4.1/src/class.c:1124 287 6b02166c resolveMethod extlibs/jamvm- 1.4.1/src/resolve.c:197 288 6b01657c executeJava extlibs/jamvm-1.4.1/src/interp.c:2237 289 6b01481c executeMethodVaList extlibs/jamvm-1.4.1/src/execute.c:91 290 6b0148a4 executeMethodArgs extlibs/jamvm- 1.4.1/src/execute.c:67 291 6b0235c0 threadStart extlibs/jamvm-1.4.1/src/thread.c:355 292 5300fac4 __thread_entry system/klibc/android/pthread.c:59 293 5300fc5c pthread_create system/klibc/android/pthread.c:182 294 </pre> 295 296 <p>Or you can run <code>logcat</code> without any parameters and it will read from <code>stdin</code>. You can then paste output into the terminal or pipe it. Run <code>logcat</code> from the top of the tree in the environment in which you do builds so that the application can determine relative paths to the toolchain to use to decode the object files. 297 </p> 298 </body> 299 </html> 300