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