summaryrefslogtreecommitdiffstats
path: root/docs/html/guide/developing/debug-tasks.jd
blob: 975f6998a75f0f77ff589d1ce59aaa84c83be39f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
page.title=Debugging Tasks
@jd:body

<div id="qv-wrapper">
<div id="qv">
  <h2>In this document</h2>
  <ol>
    <li><a href="#tools">Tools</a></li>
    <li><a href="#additionaldebugging">Debug with Dev Tools</a></li>
    <li><a href="#DebuggingWebPages">Debugging Web Pages</a></li>
    <li><a href="#toptips">Top Debugging Tips</a></li>
    <li><a href="#ide-debug-port">Configuring Your IDE to Attach to the Debugging Port</a></li>
  </ol>
</div>
</div>

<p>This document offers some helpful guidance to debugging applications on Android.


<h2 id="tools">Tools</h2>

<p>The Android SDK includes a set of tools to help you debug and profile
your applications. Here are some tools that you'll use most often:</p>

<dl>
  <dt><strong><a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge
(ADB)</a></strong></dt>
  <dd>Provides various device management capabilities, including
    moving and syncing files to the emulator, forwarding ports, and running a UNIX
    shell on the emulator.</dd>
  <dt><strong><a href="{@docRoot}guide/developing/tools/ddms.html">Dalvik Debug Monitor Server
(DDMS)</a></strong></dt>
  <dd>A graphical program that
        supports port forwarding (so you can set up breakpoints in your code in your
        IDE), screen captures on the emulator, thread and stack information,
        and many other features. You can also run logcat to retrieve your Log messages.</dd>
  </dd>
  <dt><strong><a href="{@docRoot}guide/developing/tools/traceview.html">Traceview</a></strong></dt>
  <dd>A graphical viewer that displays trace file data for method calls and times saved by
  your application, which can help you profile the performance of your application.</dd>
  <dt><strong><a href="{@docRoot}guide/developing/tools/ddms.html#logcat">logcat</a></strong></dt>
  <dd>Dumps a log of system
      messages. The messages include a stack trace when the emulator throws an error,
      as well as {@link android.util.Log} messages you've written from your application. To run
      logcat, execute <code>adb logcat</code> or, from DDMS, select <strong>Device > Run
      logcat</strong>.
      <p>{@link android.util.Log} is a logging
      class you can use to print out messages to the logcat. You can read messages
      in real time if you run logcat on DDMS (covered next). Common logging methods include:
      {@link android.util.Log#v(String,String)} (verbose), {@link
      android.util.Log#d(String,String)} (debug), {@link android.util.Log#i(String,String)}
      (information), {@link android.util.Log#w(String,String)} (warning) and {@link
      android.util.Log#e(String,String)} (error). For example:</p>
<pre class="no-pretty-print">
Log.i("MyActivity", "MyClass.getView() &mdash; get item number " + position);
</pre>
      <p>The logcat will then output something like:</p>
<pre class="no-pretty-print">
I/MyActivity( 1557): MyClass.getView() &mdash; get item number 1
</pre>
      <p>Logcat is also the place to look when debugging a web page in the Android browser. All
browser bugs will be output to logcat with the {@code WebCore} tag.
</dl>

<p>For more information about all the development tools provided with the Android SDK, see the <a
href="{@docRoot}guide/developing/tools/index.html">Tools</a> document.</p>

<p>In addition to the above tools, you may also find the following useful for debugging:
<dl>
  <dt><a href="{@docRoot}guide/developing/eclipse-adt.html"><strong>Eclipse ADT
plugin</strong></a></dt>
  <dd>The ADT Plugin for Eclipse integrates a number of the Android development tools (ADB, DDMS,
logcat output, and other functionality), so that you won't work with them directly but will utilize
them through the Eclipse IDE.</dd>
  <dt><strong>Developer Settings in the Dev Tools app</strong></dt>
  <dd>The Dev Tools application included in the emulator system image exposes several settings
        that provide useful information such as CPU usage and frame rate. See <a
href="#additionaldebugging">Debugging and Testing with Dev Tools</a> below.</dd>
</dl>

<h2 id="additionaldebugging">Debugging and Testing with Dev Tools</h2>

<p>With the Dev Tools application, you can turn on a number of settings that will
make it easier to test and debug your applications. The Dev Tools application is automatically
installed on all system images included with the SDK. The source code for the Dev Tools application
is also provided in the SDK samples so that you may build it and then install the application on any
development device.</p>

<p>To get to the development settings page on the emulator, launch the Dev Tools application and
select Development Settings. This will open the Development Settings page with the
following options (among others):</p>

<dl>
    <dt><strong>Debug app</strong></dt>
    <dd>Lets you select the application to debug. You do not need to set this to attach a debugger,
    but setting this value has two effects:
        <ul>
            <li>It will prevent Android from throwing an error if you pause on
                    a breakpoint for a long time while debugging.</li>
            <li>It will enable you to select the <em>Wait for Debugger</em> option
                to pause application startup until your debugger attaches (described
                next). </li>
        </ul>
    </dd>
    <dt><strong>Wait for debugger</strong></dt>
    <dd>Blocks the selected application from loading until a debugger attaches. This
            way you can set a breakpoint in onCreate(), which is important to debug
            the startup process of an Activity. When you change this option, any
            currently running instances of the selected application will be killed.
            In order to check this box, you must have selected a debug application
            as described in the previous option. You can do the same thing by adding
            {@link android.os.Debug#waitForDebugger()} to your code.</dd>
    <dt><strong>Show screen updates</strong></dt>
    <dd>Flashes a momentary pink rectangle on any screen sections that are being
            redrawn. This is very useful for discovering unnecessary screen drawing.</dd>
    <dt><strong>Immediately destroy activities</strong></dt>
    <dd>Tells the
        system to destroy an activity as soon as it is stopped (as if Android had to
        reclaim memory).&nbsp; This is very useful for testing the {@link android.app.Activity#onSaveInstanceState}
        / {@link android.app.Activity#onCreate(android.os.Bundle)} code path, which would
        otherwise be difficult to force. Choosing this option will probably reveal
        a number of problems in your application due to not saving state.</dd>
    <dt><strong>Show CPU usage</strong></dt>
    <dd>Displays CPU meters at the
        top of the screen, showing how much the CPU is being used. The top red bar
        shows overall CPU usage, and the green bar underneath it shows the CPU time
        spent in compositing the screen. <em>Note: You cannot turn this feature off
        once it is on, without restarting the emulator.</em> </dd>
    <dt><strong>Show background</strong></dt>
    <dd>Displays a background pattern
        when no activity screens are visible. This typically does not happen, but
        can happen during debugging.</dd>
</dl>

<p>These settings will be remembered across emulator restarts. </p>

<h2 id="DebuggingWebPages">Debugging Web Pages</h2>

<p>If you're developing a web application for Android devices, you can debug your JavaScript on
Android using the Console APIs, which will output messages to logcat. If you're familiar
debugging web pages with Firefox's FireBug or WebKit's Web Inspector, then you're probably familiar
with the Console APIs. The Android Browser (and {@link android.webkit.WebChromeClient}) supports
most of the same APIs.</p>

<p>When you call a function from the Console APIs (in the DOM's {@code window.console} object),
you will see the output in logcat as a warning. For example, if your web page
executes the following JavaScript:</p>
<pre class="no-pretty-print">
console.log("Hello World");
</pre>
<p>Then the logcat output from the Android Browser will look like this:</p>
<pre class="no-pretty-print">
W/browser ( 202): Console: Hello World :0
</pre>

<p class="note"><strong>Note:</strong> All Console messages from the Android
Browser are tagged with the name "browser" on Android platforms running API Level 7 or higher and
tagged with the name "WebCore" for platforms running API Level 6 or lower.</p>

<p>Not all of the Console APIs available in Firefox or other WebKit browsers are implemented
on Android. Mostly, you need to depend on basic text logging provided by
functions like {@code console.log(String)}, {@code console.info(String)}, {@code
console.warn(String)}, and {@code console.error(String)}. Although other Console functions may not
be implemented, they will not raise run-time errors, but will simply not behave as you might
expect.</p>

<p>If you've implemented a custom {@link android.webkit.WebView} in your application, then in order
to receive messages that are sent through the Console APIs, you must provide a {@link
android.webkit.WebChromeClient} that implements the {@link
android.webkit.WebChromeClient#onConsoleMessage(String,int,String) onConsoleMessage()} callback
method. For example, assuming that the {@code myWebView} field references the {@link
android.webkit.WebView} in your application, you can log debug messages like this:</p>
<pre>
myWebView.setWebChromeClient(new WebChromeClient() {
  public void onConsoleMessage(String message, int lineNumber, String sourceID) {
    Log.d("MyApplication", message);
  }
});
</pre>
<p>The {@link android.webkit.WebChromeClient#onConsoleMessage(String,int,String)
onConsoleMessage()} method will be called each time one of the Console methods is called from
within your {@link android.webkit.WebView}.</p>
<p>When the "Hello World" log is executed through your {@link android.webkit.WebView}, it will
now look like this:</p>
<pre class="no-pretty-print">
D/MyApplication ( 430): Hello World
</pre>

<p class="note"><strong>Note:</strong> The {@link
android.webkit.WebChromeClient#onConsoleMessage(String,int,String) onConsoleMessage()} callback
method was added with API Level 7. If you are targetting platforms running API Level 6 or lower,
then your Console messages will automatically be sent to logcat with the "WebCore" logging tag.</p>




<h2 id="toptips">Top Debugging Tips</h2>

<dl>
<dt><strong>Dump the stack trace</strong></dt>
<dd>To obtain a stack dump from emulator, you can log
in with <code>adb shell</code>, use &quot;ps&quot; to find the process you
want, and then &quot;kill -3 &quot;. The stack trace appears in the log file.
</dd>

<dt><strong>Display useful info on the emulator screen</strong></dt>
<dd>The device can display useful information such as CPU usage or highlights
around redrawn areas. Turn these features on and off in the developer settings
window as described in <a href="#additionaldebugging">Setting debug and test
configurations on the emulator</a>.
</dd>

<dt><strong>Get system state information from the emulator (dumpstate)</strong></dt>
<dd>You can access dumpstate information from the Dalvik Debug Monitor Service
tool. See <a href="{@docRoot}guide/developing/tools/adb.html#dumpsys">dumpsys and
dumpstate</a> on the adb topic page.</dd>

<dt><strong>Get application state information from the emulator (dumpsys)</strong></dt>
<dd>You can access dumpsys information from the Dalvik Debug Monitor Service
tool. See <a href="{@docRoot}guide/developing/tools/adb.html#dumpsys">dumpsys and
dumpstate</a> on the adb topic page.</dd>

<dt><strong>Get wireless connectivity information</strong></dt>
<dd>You can get information about wireless connectivity using the Dalvik Debug
Monitor Service tool. From the <strong>Device</strong> menu, select &quot;Dump
radio state&quot;.</dd>

<dt><strong>Log trace data</strong></dt>
<dd>You can log method calls and other tracing data in an activity by calling
{@link android.os.Debug#startMethodTracing(String) startMethodTracing()}. See <a
href="{@docRoot}guide/developing/tools/traceview.html">Running the Traceview Debugging
Program</a> for details. </dd>

<dt><strong>Log radio data</strong></dt>
<dd>By default, radio information is not logged to the system (it is a lot of
data). However, you can enable radio logging using the following commands:

<pre class="no-pretty-print">
adb shell
logcat -b radio
</pre>
</dd>

<dt><strong>Capture screenshots</strong></dt>
<dd>The Dalvik Debug Monitor Server (DDMS) can capture screenshots from the emulator. Select
<strong>Device > Screen capture</strong>.</dd>

<dt><strong>Use debugging helper classes</strong></dt>
<dd>Android provides debug helper classes such as {@link android.util.Log
    util.Log} and {@link android.os.Debug} for your convenience. </dd>
</dl>

<p>Also see the <a href="{@docRoot}resources/faq/troubleshooting.html">Troubleshooting</a> document
for answers to some common developing and debugging issues.</p>


<h2 id="ide-debug-port">Configuring Your IDE to Attach to the Debugging Port</h2>

<p>DDMS will assign a specific debugging port to every virtual machine that it
    finds on the emulator. You must either attach your IDE to that
    port (listed on the Info tab for that VM), or you can use a default port 8700
    to connect to whatever application is currently selected on the list of discovered
    virtual machines.</p>
<p>Your IDE should attach to your application running on the emulator, showing you
    its threads and allowing you to suspend them, inspect their state, and set breakpoints.
    If you selected &quot;Wait for debugger&quot; in the Development settings panel
    the application will run when Eclipse connects, so you will need to set any breakpoints
    you want before connecting.</p>
<p>Changing either the application being debugged or the &quot;Wait for debugger&quot;
    option causes the system to kill the selected application if it is currently
        running. You can use this to kill your application if it is in a bad state
        by simply going to the settings and toggling the checkbox.</p>