blob: 1fb6e7d8ef741586bc962a431383480880c26272 [file] [log] [blame] [view]
This doc shows how to use LLDB to debug native binaries on Android. For a more
complete explanation, see the
[official LLDB documentation on remote debugging](https://lldb.llvm.org/use/remote.html).
# Debugging with LLDB on Android
## Prerequisites
We assume the following setup:
1. [Android NDK is installed](https://developer.android.com/ndk/downloads) and
the `ANDROID_NDK` environment variable is set to the installation path.
1. Your Android device connected and configured for
[`adb`](https://developer.android.com/studio/command-line/adb).
1. The Android binary of interest is already compiled and the command to run it
(in `adb shell`) is `<your-binary> [program args...]`. This does *not* have
to be a proper Android app with a manifest, etc.
## Running Manually
1. Push the toolchain files, including `lldb-server`, to your device:
```shell
adb shell "mkdir -p /data/local/tmp/tools"
adb push "$ANDROID_NDK"/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/14.0.6/lib/linux/aarch64/* /data/local/tmp/tools
```
You may need to adjust the clang toolchain version to match the one in your
NDK. You can find it with
`find "$ANDROID_NDK/toolchains/llvm/prebuilt" -name lldb-server`.
1. Set up port forwarding. We are going to use port 5039 but you are free to
pick a different one:
```shell
adb forward tcp:5039 tcp:5039
```
1. Start an `lldb-server` in a new interactive adb shell:
```shell
adb shell
/data/local/tmp/tools/lldb-server platform --listen '*:5039' --server
```
1. Launch `lldb`, connect to the server and run the binary:
```shell
lldb -o 'platform select remote-android' \
-o 'platform connect connect://:5039' \
-o 'platform shell cd /data/local/tmp'
target create <your-binary>
run [program args...]
```
You can either use the system `lldb` or a prebuilt under `"$ANDROID_NDK"/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/14.0.6/lib/linux/<your-host-arch>`.
Explanation: each `-o` (short for `--one-shot`) tells lldb to execute a
command on startup. You can run those manually in the lldb shell, if you
prefer. Then, we tell lldb which working directory to use, where to find the
executable, and what command line arguments to use.