242 lines
9.5 KiB
Plaintext
242 lines
9.5 KiB
Plaintext
page.title=ndk-gdb
|
|
@jd:body
|
|
|
|
<div id="qv-wrapper">
|
|
<div id="qv">
|
|
<h2>On this page</h2>
|
|
|
|
<ol>
|
|
<li><a href="#req">Requirements</a></li>
|
|
<li><a href="#use">Usage</a></li>
|
|
<li><a href="#thread">Thread Support</a></li>
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
|
|
<p>The NDK includes a helper shell script named {@code ndk-gdb} to easily launch a native debugging
|
|
session for your NDK-generated machine code.</p>
|
|
|
|
<h2 id="req">Requirements</h2>
|
|
|
|
<p>For native debugging to work, you must follow these requirements:</p>
|
|
|
|
<ul>
|
|
<li>Build your app using the {@code ndk-build} script. The {@code ndk-gdb} script
|
|
does not support using the legacy {@code make APP=<name>} method to build.</p></li>
|
|
<li>Enable app debugging in your {@code AndroidManifest.xml} file by including an
|
|
{@code <application>} element that sets the {@code android:debuggable} attribute to {@code
|
|
true}.</li>
|
|
<li>Build your app to run on Android 2.2 (Android API level 8) or higher.</li>
|
|
<li>Debug on a device or emulator running Android 2.2 or higher. For debugging purposes, the target
|
|
API level that you declare in your {@code AndroidManifest.xml} file does not matter.</li>
|
|
<li>Develop your app in a Unix shell. On Windows, use <a href="https://www.cygwin.com/">Cygwin</a>
|
|
or the experimental {@code ndk-gdb-py} <a href="https://www.python.org/">Python</a>
|
|
implementation.</li>
|
|
<li>Use GNU Make 3.81 or higher.</li>
|
|
<li>If you are building your app from
|
|
<a href="{@docRoot}sdk/installing/installing-adt.html">Eclipse</a>, build it
|
|
using version 0.9.7 or higher of the ADT plug-in.</li>
|
|
|
|
<h2 id="use">Usage</h2>
|
|
To invoke the {@code ndk-gdb} script, change into the application directory or any directory under
|
|
it. For example:</p>
|
|
|
|
<pre class="no-pretty-print">
|
|
cd $PROJECT
|
|
$NDK/ndk-gdb
|
|
</pre>
|
|
|
|
<p>Here, {@code $PROJECT} points to your project's root directory, and {@code $NDK} points to your
|
|
NDK installation path.</p>
|
|
|
|
<p>When you invoke {@code ndk-gdb}, it configures the session to look for your source files
|
|
and symbol/debug versions of your generated native libraries. On successfully attaching to your
|
|
application process, {@code ndk-gdb} outputs a long series of error messages, noting that it cannot
|
|
find various system libraries. This is normal, because your host machine does not contain
|
|
symbol/debug versions of these libraries on your target device. You can safely ignore these
|
|
messages.</p>
|
|
|
|
<p>Next, {@code ndk-gdb} displays a normal GDB prompt.</p>
|
|
|
|
<p>You interact with {@code ndk-gdb} in the same way as you would with GNU GDB. For example, you can
|
|
use {@code b <location>} to set breakpoints, and {@code c} (for "continue") to
|
|
resume execution. For a comprehensive list of commands, see the
|
|
<a href="http://www.gnu.org/software/gdb/">GDB manual.</a></p>
|
|
|
|
<p>Note that when you quit the GDB prompt, the application process that you're debugging stops. This
|
|
behavior is a gdb limitation.</p>
|
|
|
|
<p>{@code ndk-gdb} handles many error conditions, and displays an informative error message if it
|
|
finds a problem. these checks include making sure that the following conditions are satisfied:</p>
|
|
|
|
<ul>
|
|
<li>Checks that ADB is in your path.</li>
|
|
<li>Checks that your application is declared debuggable in its manifest.</li>
|
|
<li>Checks that, on the device, the installed application with the same package name is also
|
|
debuggable.</li>
|
|
</ul>
|
|
|
|
<p>By default, {@code ndk-gdb} searches for an already-running application process, and displays an
|
|
error if it doesn't find one. You can, however, use the {@code --start} or
|
|
{@code --launch=<name>} option to automatically start your activity before the debugging
|
|
session. For more information, see <a href="#opt">Options</a>.</p>
|
|
|
|
|
|
<h3 id="opt">Options</h3>
|
|
<p>To see a complete list of options, type {@code ndk-gdb --help} on the command line. Table 1
|
|
shows a number of the more commonly used ones, along with brief descriptions.</p>
|
|
|
|
<p class="table-caption" id="table1">
|
|
<strong>Table 1.</strong> Common ndk-gdb options and their descriptions.</p>
|
|
|
|
<table>
|
|
<tr>
|
|
<th>Option</th>
|
|
<th>Description></th>
|
|
<tr>
|
|
|
|
<tr>
|
|
<td>{@code --verbose}</td>
|
|
<td><p>This option tells the build system to print verbose information about the native-debugging
|
|
session setup. It is necessary only for debugging problems when the debugger can't connect to the
|
|
app, and the error messages that {@code ndk-gdb} displays are not enough.</p></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>{@code --force}</td>
|
|
<td>By default, {@code ndk-gdb} aborts if it finds that another native debugging session is already
|
|
running on the same device. This option kills the other session, and replaces it with a new one.
|
|
Note that this option does not kill the actual app being debugged, which you must kill
|
|
separately.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>{@code --start}</td>
|
|
<td><p>When you start {@code ndk-gdb}, it tries by default to attach to an existing running instance of
|
|
your app on the target device. You can override this default behavior by using {@code --start} to
|
|
explicitly launch the application on the target device before the debugging session.</p></td>
|
|
|
|
<p>Starting {@code ndk-gdb} with this option specified launches the first launchable activity listed
|
|
in your application manifest. Use {@code --launch=<name>} to start the next launchable
|
|
activity. To dump the list of launchable activities, run {@code --launch-list} from the command
|
|
line.</p>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>{@code --launch=<name>}</td>
|
|
<td><p>This option is similar to {@code --start}, except that it allows you to start a specific
|
|
activity from your application. This feature is only useful if your manifest defines multiple
|
|
launchable activities.</p></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>{@code --launch-list}</td>
|
|
<td><p>This convenience option prints the list of all launchable activity names found in your
|
|
app manifest. {@code --start} uses the first activity name.</p></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>{@code --project=<path>}</td>
|
|
<td>This option specifies the app project directory. It is useful if you want to launch the
|
|
script without first having to change to the project directory.</p></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>{@code --port=<port>}</td>
|
|
<td> <p>By default, {@code ndk-gdb} uses local TCP port 5039 to communicate with the app it
|
|
is debugging on the target device. Using a different port allows you to natively debug programs
|
|
running on different devices or emulators connected to the same host machine.</p></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>{@code --adb=<file>}</td>
|
|
<td><p>This option specifies the <a href="{@docRoot}tools/help/adb.html">adb</a>
|
|
tool executable. It is only necessary if you have not set your path to include that executable.</p>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<li>{@code -d}</li>
|
|
<li>{@code -e}</li>
|
|
<li>{@code -s <serial>}</li></td>
|
|
<td><p>These flags are similar to the adb commands with the same names. Set these flags if you have
|
|
several devices or emulators connected to your host machine. Their meanings are as follows:</p>
|
|
<dl>
|
|
<dt>{@code -d}</dt>
|
|
<dd>Connect to a single physical device.</dd>
|
|
<dt>{@code -e}</dt>
|
|
<dd>Connect to a single emulator device.</dd>
|
|
<dt>{@code -s <serial>}</dt>
|
|
<dd>Connect to a specific device or emulator. Here, {@code <serial>} is the device's name
|
|
as listed by the {@code adb devices} command.</dd>
|
|
</dl>
|
|
|
|
<p>Alternatively, you can define the {@code ADB_SERIAL} environment variable to list a specific
|
|
device, without the need for a specific option.</p></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<li>{@code --exec=<file>}</li>
|
|
<li>{@code -x <file>}</li>
|
|
</td>
|
|
<td><p>This option tells {@code ndk-gdb} to run the GDB initialization commands found in
|
|
{@code <file>} after connecting to the process it is debugging. This is a useful feature if
|
|
you want to do something repeatedly, such as setting up a list of breakpoints, and then resuming
|
|
execution automatically.</p></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>{@code --nowait}</td>
|
|
<td><p>Disable pausing the Java code until GDB connects. Passing this option may cause the debugger
|
|
to miss early breakpoints.</p>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>{@code --tui}
|
|
{@code -t}</td>
|
|
<td><p>Enable Text User Interface if it is available.</p></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>{@code --gnumake-flag=<flag>}</td>
|
|
<td><p>This option is an extra flag (or flags) to pass to the
|
|
{@code ndk-build} system when
|
|
querying it for project information. You can use multiple instances of this option in the
|
|
same command.</p></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>{@code --stdcxx-py-pr={auto|none|gnustdcxx[-GCCVER]|stlport}}</td>
|
|
<td><p>Use specified Python pretty-printers for displaying types in the Standard C++ Library.
|
|
{@code auto} mode works by looking at the {@code .so} files for a {@code libstdc++} library,
|
|
and as such only works for a shared library. When linking statically to a {@code libstdc++} library,
|
|
you must specify the required printers. The default is {@code none}.</p></td>
|
|
</tr>
|
|
</table>
|
|
|
|
<p class="note"><strong>Note: </strong>The final three options in this table are only for the
|
|
Python version of {@code ndk-gdb}.</p></td>
|
|
|
|
<h2 id="thread">Thread Support</h2>
|
|
<p>If your app runs on a platform older than Android 2.3 (API level 9), {@code ndk-gdb}
|
|
cannot debug native threads properly. The debugger can only debug the main thread, abd completely
|
|
ignores the execution of other threads.</p>
|
|
|
|
<p>Using a version of Android prior to 2.3 causes {@code ndk-gdb} to display the following message
|
|
prior to showing the GDB prompt:</p>
|
|
|
|
<pre class="no-pretty-print">
|
|
Thread debugging is unsupported on this Android platform!
|
|
</pre>
|
|
|
|
|
|
<p>If you place a breakpoint on a function executed on a non-main thread, the program exits, and
|
|
GDB displays the following message:</p>
|
|
|
|
<pre class="no-pretty-print">
|
|
Program terminated with signal SIGTRAP, Trace/breakpoint trap.
|
|
The program no longer exists.
|
|
</pre>
|