| <html><body><pre>'ndk-gdb' Overview |
| |
| IMPORTANT: IF YOU ARE DEBUGGING THREADED PROGRAMS, PLEASE READ THE |
| SECTION BELOW TITLED 'Thread Support'. |
| |
| I. Usage: |
| --------- |
| |
| The Android NDK r4 introduced a helper shell script named 'ndk-gdb' to |
| easily launch a native debugging session for your NDK-generated machine code. |
| |
| The script is located at the top-level directory of the NDK, and shall |
| be invoked from the command-line when in your application project |
| directory, or any of its sub-directories. For example: |
| |
| cd $PROJECT |
| $NDK/ndk-gdb |
| |
| Where $NDK points to your NDK installation path. You can also create an |
| alias or add $NDK to your PATH to avoid typing it every time. |
| |
| IMPORTANT: Native debugging can only work if *all* these conditions are met: |
| |
| 1. Your application is built with the 'ndk-build' script: |
| |
| Building with the legacy "make APP=<name>" method is not |
| supported by ndk-gdb. |
| |
| 2. Your application is debuggable: |
| |
| In other words, your AndroidManifest.xml has an <application> |
| element that sets the android:debuggable attribute to "true" |
| |
| 3. You are running your application on Android 2.2 (or higher): |
| |
| ndk-gdb will not work if you try to run your application on |
| previous versions of the system. That does not mean that your |
| application should target the Android 2.2. API level, just |
| that the debugging session should happen on a 2.2+ device or |
| emulator system image. |
| |
| IMPORTANT IMPORTANT IMPORTANT !! |
| |
| If you are using the ADT Eclipse plug-in to build your |
| application, make sure you're using version 0.9.7 or |
| later. |
| |
| If you are using the 'ant' build tool, make sure that you |
| have the latest revision of the SDK Platform components. |
| The following minimal revisions are required: |
| |
| Android 1.5 r4 |
| Android 1.6 r3 |
| Android 2.1 r2 |
| Android 2.2 r1 |
| |
| These should be available through the SDK updater. |
| |
| If these conditions are not met, the generated .apk will |
| not contain required support files and native debugging |
| will not be possible. |
| |
| 'ndk-gdb' handles many error conditions and will dump an informative error |
| message if it finds a problem. For example, it: |
| |
| - checks that adb is in your path. |
| |
| - checks that your application is declared debuggable in its manifest. |
| |
| - checks that, on the device, the installed application with the same |
| package name is also debuggable. |
| |
| |
| By default, ndk-gdb will search for an already-running application process, |
| and will dump an error if it doesn't find one. You can however use the --start |
| or --launch=<name> option to automatically start your activity before the |
| debugging session. |
| |
| When it successfully attaches to your application process, ndk-gdb will give |
| you a normal GDB prompt, after setting up the session to properly look for |
| your source files and symbol/debug versions of your generated native |
| libraries. |
| |
| You can set breakpoints with 'b <location>' and resume execution with 'c' |
| (for 'continue'). See the GDB manual for a list of commands. |
| |
| IMPORTANT: When quitting the GDB prompt, your debugged application process |
| will be stopped! This is a gdb limitation. |
| |
| IMPORTANT: The GDB prompt will be preceded by a long list of error messages, |
| where gdb complains that it cannot find various system libraries |
| (e.g. libc.so, libstdc++.so, liblog.so, libcutils.so, etc...) |
| |
| This is normal, because there are no symbol/debug versions of |
| these libraries corresponding to your target device on your |
| development machine. You can safely ignore these messages. |
| |
| II. Options: |
| ------------ |
| |
| To see a list of options, type 'ndk-gdb --help'. Notable ones are: |
| |
| --verbose: |
| Print verbose information about the native debugging session setup. |
| Only needed to debug problems when you can't connect and that the |
| error messages printed by ndk-gdb are not enough. |
| |
| --force: |
| By default, ndk-gdb aborts if it finds that another native debugging |
| session is running on the same device. Using --force will kill the |
| session, and replace it with a new one. Note that the debugged program |
| is *not* killed and will be stopped again. |
| |
| --start: |
| By default, ndk-gdb will try to attach to an existing running instance |
| of your application on the target device. You can use --start to |
| explicitly launch your application before the debugging session. |
| |
| NOTE: This launches the first launchable activity listed from your |
| application manifest. Use --launch=<name> to start another one. |
| See --launch-list to dump the list of such activities. |
| |
| --launch=<name>: |
| This is similar to --start, except that it allows you to start a specific |
| activity from your application. This is only useful if your manifest |
| defines several launchable activities. |
| |
| --launch-list: |
| Convenience option that prints the list of all launchable activity names |
| found in your application manifest. The first one will be used by --start |
| |
| --project=<path>: |
| Specify application project directory. Useful if you want to launch |
| the script without cd-ing to the directory before that. |
| |
| --port=<port>: |
| By default, ndk-gdb will use local TCP port 5039 to communicate with |
| the debugged application. By using a different port, it is possible |
| to natively debug programs running on different devices/emulators |
| connected to the same development machine. |
| |
| --adb=<file>: |
| Specify the adb tool executable, in case it is not in your path. |
| |
| -d, -e, -s <serial>: |
| These flags are similar to the ADB ones and allow you to handle the |
| case where you have several devices/emulators connected to your |
| development machine. |
| |
| -d: Connect to a single physical device |
| -e: Connect to a single emulator device |
| -s <serial>: Connect to a specific device or emulator |
| where <serial> is the device's name as listed |
| by the "adb devices" command. |
| |
| Alternatively, you can define the ADB_SERIAL environment variable |
| to list a specific device, without the need for a specific option. |
| |
| --exec=<file>: |
| -x <file>: |
| After connecting to the debugged process, run the GDB initialization |
| commands found in <file>. This is useful if you want to do something |
| repeatedly, e.g. setting up a list of breakpoints then resuming |
| execution automatically. |
| |
| |
| III. Requirements: |
| ------------------ |
| |
| At the moment 'ndk-gdb' requires a Unix shell to run. This means that |
| Cygwin is required to run it on Windows. We hope to get rid of this |
| limitation in a future NDK release. |
| |
| The other NDK requirements apply: e.g. GNU Make 3.81 or higher. |
| |
| |
| IV. Thread Support: |
| ------------------- |
| |
| If your application runs on a platform older than Android 2.3, ndk-gdb will |
| not be able to debug native threads properly. Instead, the debugger will only |
| be able to put breakpoints on the main thread, completely ignoring the |
| execution of other ones. |
| |
| The root of the problem is complex, but is essentially due to a very unfortunate |
| bug in the platform, which was only discovered lately. |
| |
| The gdbserver binary that comes with this NDK has special code to detect this |
| condition at runtime and adapt its behaviour automatically (in other words, |
| you don't have anything special to do when building your code). |
| |
| What this means in practical terms are: |
| |
| - If you are on Android 2.3, or a prior platform release which has had the |
| platform bug-fix back-ported to it, you will be able to debug native |
| threads automatically. |
| |
| - If you are not, you will only be able to debug the main thread |
| (as in previous NDK releases). You will also see the following message |
| when launching ndk-gdb (just before the gdb prompt): |
| |
| Thread debugging is unsupported on this Android platform! |
| |
| If you place a breakpoint on a function executed on a non-main thread, the |
| program will exit with the following message in GDB: |
| |
| Program terminated with signal SIGTRAP, Trace/breakpoint trap. |
| The program no longer exists. |
| |
| </pre></body></html> |