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