blob: a980efc2fe0bea6dedc419cdb905a9cba4c05e3a [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001page.title=Debugging Tasks
2@jd:body
3
4<div id="qv-wrapper">
5<div id="qv">
6 <h2>In this document</h2>
7 <ol>
8 <li><a href="#tools">Tools</a></li>
Scott Main6261d872010-01-15 17:26:29 -08009 <li><a href="#additionaldebugging">Debug with Dev Tools</a></li>
10 <li><a href="#DebuggingWebPages">Debugging Web Pages</a></li>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080011 <li><a href="#toptips">Top Debugging Tips</a></li>
12 <li><a href="#ide-debug-port">Configuring Your IDE to Attach to the Debugging Port</a></li>
13 </ol>
14</div>
15</div>
16
17<p>This document offers some helpful guidance to debugging applications on Android.
18
19
20<h2 id="tools">Tools</h2>
Scott Main6261d872010-01-15 17:26:29 -080021
22<p>The Android SDK includes a set of tools to help you debug and profile
23your applications. Here are some tools that you'll use most often:</p>
24
25<dl>
26 <dt><strong><a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge
27(ADB)</a></strong></dt>
28 <dd>Provides various device management capabilities, including
29 moving and syncing files to the emulator, forwarding ports, and running a UNIX
30 shell on the emulator.</dd>
31 <dt><strong><a href="{@docRoot}guide/developing/tools/ddms.html">Dalvik Debug Monitor Server
32(DDMS)</a></strong></dt>
33 <dd>A graphical program that
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080034 supports port forwarding (so you can set up breakpoints in your code in your
35 IDE), screen captures on the emulator, thread and stack information,
Scott Main6261d872010-01-15 17:26:29 -080036 and many other features. You can also run logcat to retrieve your Log messages.</dd>
37 </dd>
38 <dt><strong><a href="{@docRoot}guide/developing/tools/traceview.html">Traceview</a></strong></dt>
39 <dd>A graphical viewer that displays trace file data for method calls and times saved by
40 your application, which can help you profile the performance of your application.</dd>
41 <dt><strong><a href="{@docRoot}guide/developing/tools/ddms.html#logcat">logcat</a></strong></dt>
42 <dd>Dumps a log of system
43 messages. The messages include a stack trace when the emulator throws an error,
44 as well as {@link android.util.Log} messages you've written from your application. To run
45 logcat, execute <code>adb logcat</code> or, from DDMS, select <strong>Device > Run
46 logcat</strong>.
47 <p>{@link android.util.Log} is a logging
48 class you can use to print out messages to the logcat. You can read messages
49 in real time if you run logcat on DDMS (covered next). Common logging methods include:
50 {@link android.util.Log#v(String,String)} (verbose), {@link
51 android.util.Log#d(String,String)} (debug), {@link android.util.Log#i(String,String)}
52 (information), {@link android.util.Log#w(String,String)} (warning) and {@link
53 android.util.Log#e(String,String)} (error). For example:</p>
54<pre class="no-pretty-print">
55Log.i("MyActivity", "MyClass.getView() &mdash; get item number " + position);
56</pre>
57 <p>The logcat will then output something like:</p>
58<pre class="no-pretty-print">
59I/MyActivity( 1557): MyClass.getView() &mdash; get item number 1
60</pre>
61 <p>Logcat is also the place to look when debugging a web page in the Android browser. All
62browser bugs will be output to logcat with the {@code WebCore} tag.
63</dl>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080064
Scott Main6261d872010-01-15 17:26:29 -080065<p>For more information about all the development tools provided with the Android SDK, see the <a
66href="{@docRoot}guide/developing/tools/index.html">Tools</a> document.</p>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080067
Scott Main6261d872010-01-15 17:26:29 -080068<p>In addition to the above tools, you may also find the following useful for debugging:
69<dl>
70 <dt><a href="{@docRoot}guide/developing/eclipse-adt.html"><strong>Eclipse ADT
71plugin</strong></a></dt>
72 <dd>The ADT Plugin for Eclipse integrates a number of the Android development tools (ADB, DDMS,
73logcat output, and other functionality), so that you won't work with them directly but will utilize
74them through the Eclipse IDE.</dd>
75 <dt><strong>Developer Settings in the Dev Tools app</strong></dt>
76 <dd>The Dev Tools application included in the emulator system image exposes several settings
77 that provide useful information such as CPU usage and frame rate. See <a
78href="#additionaldebugging">Debugging and Testing with Dev Tools</a> below.</dd>
79</dl>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080080
Scott Main6261d872010-01-15 17:26:29 -080081<h2 id="additionaldebugging">Debugging and Testing with Dev Tools</h2>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080082
Scott Main2c9d7fe2010-01-20 14:11:56 -080083<p>With the Dev Tools application, you can enable a number of settings on your device that will
84make it easier to test and debug your applications.</p>
Scott Main6261d872010-01-15 17:26:29 -080085
Scott Main2c9d7fe2010-01-20 14:11:56 -080086<p>The Dev Tools application is installed by default
87on all system images included with the SDK, so you can use it with the Android Emulator. If you'd
88like to install the Dev Tools application on a real development device, you can copy the
89application from your emulator and then install it on your device using ADB. To copy the
90application from a running emulator, execute:
91</p>
92<pre>
93adb -e pull /system/app/Development.apk ./Development.apk
94</pre>
95<p>This copies the .apk file into the current directory. Then install it on your connected device
96with:</p>
97<pre>
98adb -d install Development.apk
99</pre>
100
101<p>To get started, launch the Dev Tools application and
Scott Main6261d872010-01-15 17:26:29 -0800102select Development Settings. This will open the Development Settings page with the
103following options (among others):</p>
104
105<dl>
106 <dt><strong>Debug app</strong></dt>
107 <dd>Lets you select the application to debug. You do not need to set this to attach a debugger,
108 but setting this value has two effects:
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800109 <ul>
Scott Main6261d872010-01-15 17:26:29 -0800110 <li>It will prevent Android from throwing an error if you pause on
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800111 a breakpoint for a long time while debugging.</li>
112 <li>It will enable you to select the <em>Wait for Debugger</em> option
113 to pause application startup until your debugger attaches (described
114 next). </li>
115 </ul>
Scott Main6261d872010-01-15 17:26:29 -0800116 </dd>
117 <dt><strong>Wait for debugger</strong></dt>
118 <dd>Blocks the selected application from loading until a debugger attaches. This
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800119 way you can set a breakpoint in onCreate(), which is important to debug
120 the startup process of an Activity. When you change this option, any
121 currently running instances of the selected application will be killed.
122 In order to check this box, you must have selected a debug application
123 as described in the previous option. You can do the same thing by adding
Scott Main6261d872010-01-15 17:26:29 -0800124 {@link android.os.Debug#waitForDebugger()} to your code.</dd>
125 <dt><strong>Show screen updates</strong></dt>
126 <dd>Flashes a momentary pink rectangle on any screen sections that are being
127 redrawn. This is very useful for discovering unnecessary screen drawing.</dd>
128 <dt><strong>Immediately destroy activities</strong></dt>
129 <dd>Tells the
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800130 system to destroy an activity as soon as it is stopped (as if Android had to
131 reclaim memory).&nbsp; This is very useful for testing the {@link android.app.Activity#onSaveInstanceState}
132 / {@link android.app.Activity#onCreate(android.os.Bundle)} code path, which would
133 otherwise be difficult to force. Choosing this option will probably reveal
Scott Main6261d872010-01-15 17:26:29 -0800134 a number of problems in your application due to not saving state.</dd>
135 <dt><strong>Show CPU usage</strong></dt>
136 <dd>Displays CPU meters at the
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800137 top of the screen, showing how much the CPU is being used. The top red bar
138 shows overall CPU usage, and the green bar underneath it shows the CPU time
139 spent in compositing the screen. <em>Note: You cannot turn this feature off
Scott Main6261d872010-01-15 17:26:29 -0800140 once it is on, without restarting the emulator.</em> </dd>
141 <dt><strong>Show background</strong></dt>
142 <dd>Displays a background pattern
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800143 when no activity screens are visible. This typically does not happen, but
Scott Main6261d872010-01-15 17:26:29 -0800144 can happen during debugging.</dd>
145</dl>
146
Scott Main2c9d7fe2010-01-20 14:11:56 -0800147<p>These settings will be remembered across emulator restarts.</p>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800148
Scott Main6261d872010-01-15 17:26:29 -0800149<h2 id="DebuggingWebPages">Debugging Web Pages</h2>
150
151<p>If you're developing a web application for Android devices, you can debug your JavaScript on
152Android using the Console APIs, which will output messages to logcat. If you're familiar
153debugging web pages with Firefox's FireBug or WebKit's Web Inspector, then you're probably familiar
154with the Console APIs. The Android Browser (and {@link android.webkit.WebChromeClient}) supports
155most of the same APIs.</p>
156
157<p>When you call a function from the Console APIs (in the DOM's {@code window.console} object),
158you will see the output in logcat as a warning. For example, if your web page
159executes the following JavaScript:</p>
160<pre class="no-pretty-print">
161console.log("Hello World");
162</pre>
163<p>Then the logcat output from the Android Browser will look like this:</p>
164<pre class="no-pretty-print">
165W/browser ( 202): Console: Hello World :0
166</pre>
167
168<p class="note"><strong>Note:</strong> All Console messages from the Android
169Browser are tagged with the name "browser" on Android platforms running API Level 7 or higher and
170tagged with the name "WebCore" for platforms running API Level 6 or lower.</p>
171
172<p>Not all of the Console APIs available in Firefox or other WebKit browsers are implemented
173on Android. Mostly, you need to depend on basic text logging provided by
174functions like {@code console.log(String)}, {@code console.info(String)}, {@code
175console.warn(String)}, and {@code console.error(String)}. Although other Console functions may not
176be implemented, they will not raise run-time errors, but will simply not behave as you might
177expect.</p>
178
179<p>If you've implemented a custom {@link android.webkit.WebView} in your application, then in order
180to receive messages that are sent through the Console APIs, you must provide a {@link
181android.webkit.WebChromeClient} that implements the {@link
182android.webkit.WebChromeClient#onConsoleMessage(String,int,String) onConsoleMessage()} callback
183method. For example, assuming that the {@code myWebView} field references the {@link
184android.webkit.WebView} in your application, you can log debug messages like this:</p>
185<pre>
186myWebView.setWebChromeClient(new WebChromeClient() {
187 public void onConsoleMessage(String message, int lineNumber, String sourceID) {
188 Log.d("MyApplication", message);
189 }
190});
191</pre>
192<p>The {@link android.webkit.WebChromeClient#onConsoleMessage(String,int,String)
193onConsoleMessage()} method will be called each time one of the Console methods is called from
194within your {@link android.webkit.WebView}.</p>
195<p>When the "Hello World" log is executed through your {@link android.webkit.WebView}, it will
196now look like this:</p>
197<pre class="no-pretty-print">
198D/MyApplication ( 430): Hello World
199</pre>
200
201<p class="note"><strong>Note:</strong> The {@link
202android.webkit.WebChromeClient#onConsoleMessage(String,int,String) onConsoleMessage()} callback
203method was added with API Level 7. If you are targetting platforms running API Level 6 or lower,
204then your Console messages will automatically be sent to logcat with the "WebCore" logging tag.</p>
205
206
207
208
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800209<h2 id="toptips">Top Debugging Tips</h2>
Scott Main6261d872010-01-15 17:26:29 -0800210
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800211<dl>
Scott Main6261d872010-01-15 17:26:29 -0800212<dt><strong>Dump the stack trace</strong></dt>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800213<dd>To obtain a stack dump from emulator, you can log
214in with <code>adb shell</code>, use &quot;ps&quot; to find the process you
215want, and then &quot;kill -3 &quot;. The stack trace appears in the log file.
216</dd>
217
Scott Main6261d872010-01-15 17:26:29 -0800218<dt><strong>Display useful info on the emulator screen</strong></dt>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800219<dd>The device can display useful information such as CPU usage or highlights
220around redrawn areas. Turn these features on and off in the developer settings
221window as described in <a href="#additionaldebugging">Setting debug and test
222configurations on the emulator</a>.
223</dd>
224
Scott Main6261d872010-01-15 17:26:29 -0800225<dt><strong>Get system state information from the emulator (dumpstate)</strong></dt>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800226<dd>You can access dumpstate information from the Dalvik Debug Monitor Service
227tool. See <a href="{@docRoot}guide/developing/tools/adb.html#dumpsys">dumpsys and
228dumpstate</a> on the adb topic page.</dd>
229
Scott Main6261d872010-01-15 17:26:29 -0800230<dt><strong>Get application state information from the emulator (dumpsys)</strong></dt>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800231<dd>You can access dumpsys information from the Dalvik Debug Monitor Service
232tool. See <a href="{@docRoot}guide/developing/tools/adb.html#dumpsys">dumpsys and
233dumpstate</a> on the adb topic page.</dd>
234
Scott Main6261d872010-01-15 17:26:29 -0800235<dt><strong>Get wireless connectivity information</strong></dt>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800236<dd>You can get information about wireless connectivity using the Dalvik Debug
237Monitor Service tool. From the <strong>Device</strong> menu, select &quot;Dump
238radio state&quot;.</dd>
239
Scott Main6261d872010-01-15 17:26:29 -0800240<dt><strong>Log trace data</strong></dt>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800241<dd>You can log method calls and other tracing data in an activity by calling
Scott Main6261d872010-01-15 17:26:29 -0800242{@link android.os.Debug#startMethodTracing(String) startMethodTracing()}. See <a
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800243href="{@docRoot}guide/developing/tools/traceview.html">Running the Traceview Debugging
244Program</a> for details. </dd>
245
Scott Main6261d872010-01-15 17:26:29 -0800246<dt><strong>Log radio data</strong></dt>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800247<dd>By default, radio information is not logged to the system (it is a lot of
248data). However, you can enable radio logging using the following commands:
249
Scott Main6261d872010-01-15 17:26:29 -0800250<pre class="no-pretty-print">
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800251adb shell
252logcat -b radio
253</pre>
254</dd>
255
Scott Main6261d872010-01-15 17:26:29 -0800256<dt><strong>Capture screenshots</strong></dt>
257<dd>The Dalvik Debug Monitor Server (DDMS) can capture screenshots from the emulator. Select
258<strong>Device > Screen capture</strong>.</dd>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800259
Scott Main6261d872010-01-15 17:26:29 -0800260<dt><strong>Use debugging helper classes</strong></dt>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800261<dd>Android provides debug helper classes such as {@link android.util.Log
262 util.Log} and {@link android.os.Debug} for your convenience. </dd>
263</dl>
264
Scott Main6261d872010-01-15 17:26:29 -0800265<p>Also see the <a href="{@docRoot}resources/faq/troubleshooting.html">Troubleshooting</a> document
266for answers to some common developing and debugging issues.</p>
267
268
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800269<h2 id="ide-debug-port">Configuring Your IDE to Attach to the Debugging Port</h2>
270
271<p>DDMS will assign a specific debugging port to every virtual machine that it
272 finds on the emulator. You must either attach your IDE to that
273 port (listed on the Info tab for that VM), or you can use a default port 8700
274 to connect to whatever application is currently selected on the list of discovered
275 virtual machines.</p>
276<p>Your IDE should attach to your application running on the emulator, showing you
277 its threads and allowing you to suspend them, inspect their state, and set breakpoints.
278 If you selected &quot;Wait for debugger&quot; in the Development settings panel
279 the application will run when Eclipse connects, so you will need to set any breakpoints
280 you want before connecting.</p>
281<p>Changing either the application being debugged or the &quot;Wait for debugger&quot;
282 option causes the system to kill the selected application if it is currently
283 running. You can use this to kill your application if it is in a bad state
284 by simply going to the settings and toggling the checkbox.</p>