概要
前回作成したAndroid向けテスト実行ファイルを、LLDBでデバッグする方法をまとめました。
LLDBを使ったデバッグ方法
lldb-serverを端末にコピー
lldb-serverを実行する端末にコピーします。
lldb-serverはndkディレクトリ内にあります。aarch64は端末のアーキテクチャにより適宜変更します。
$ cd ~/Library/Android/sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/12.0.8/lib/linux
$ adb push aarch64/lldb-server /data/local/tmp
$ adb shell chmod a+x /data/local/tmp/lldb-server
lldb-serverを実行
実行する端末でlldb-serverを起動します。
$ adb shell
emulator_arm64:/ $ cd /data/local/tmp/
emulator_arm64:/ $ ./lldb-server platform --listen *:1234
lldbで接続する
PCでlldbを起動し、lldb-serverを起動した端末に接続します。
接続先は適宜変えます。以下はローカルで起動しているエミュレータに接続しています。
$ lldb
(lldb) platform select remote-android
Platform: remote-android
Connected: no
(lldb) platform connect connect://localhost:1234
Platform: remote-android
Triple: aarch64-unknown-linux-android
OS Version: 30 (5.4.86-android11-2-00040-g29b2beadc627-ab7157994)
Hostname: localhost
Connected: yes
WorkingDir: /
Kernel: #1 SMP PREEMPT Fri Feb 19 11:59:46 UTC 2021
デバッグ付き起動
端末と繋がったので、後は通常通りlldbを使ってデバッグします。
fileコマンドで実行ファイルを指定して、ブレークポイントを設定して起動してみました。
(lldb) file native-lib-tests
(lldb) br set --file ndk_library.cpp --line 5
(lldb) r
[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from ExampleTest
[ RUN ] ExampleTest.BasicAssertion
[ OK ] ExampleTest.BasicAssertion (0 ms)
[ RUN ] ExampleTest.NDKLibTest
Process 9372 stopped
* thread #1, name = 'native-lib-test', stop reason = breakpoint 1.1
frame #0: 0x00000055555e67a4 native-lib-tests`ndk_lib_add(a=2, b=2) at ndk_library.cpp:5:12
2
3 int ndk_lib_add(int a, int b)
4 {
-> 5 return a + b;
6 }
Target 0: (native-lib-tests) stopped.
(lldb) c
Process 9372 resuming
[ OK ] ExampleTest.NDKLibTest (408592 ms)
[----------] 2 tests from ExampleTest (408593 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (408593 ms total)
[ PASSED ] 2 tests.
Process 9372 exited with status = 0 (0x00000000)
まとめ
これでデバッグしながらテストを書けるようになったと思います。
実はfileロード時にwarningが出ていて、これは後で調べることにします。。
(lldb) file native-lib-tests
warning: (aarch64) /Users/user-name/.lldb/module_cache/remote-android/.cache/E35B2B34-1204-B8F8-73FF-A936612E05F6/libm.so No LZMA support found for reading .gnu_debugdata section
warning: (aarch64) /Users/user-name/.lldb/module_cache/remote-android/.cache/0EF8B9FD-3BA8-4892-8093-21B735317A50/libdl.so No LZMA support found for reading .gnu_debugdata section
warning: (aarch64) /Users/user-nam,e/.lldb/module_cache/remote-android/.cache/859DF8A8-F625-B037-0BF4-6C208FBA5842/ld-android.so No LZMA support found for reading .gnu_debugdata section
Current executable set to '/Users/user-name/git-projects/ndk_lib_test/ndk_lib_test_app/app/.cxx/Debug/output/native-lib-tests' (aarch64).
参考元