# [AIdrifter CS 浮生筆錄](https://hackmd.io/bKL1LVo8RaCKn02uHJW2BA) : GDB on Android ### Android O - trace your execute process directly ```shell source build/envsetup.sh lunch denali-userdebug # select processes you wanted ./development/scripts/gdbclient.py -r /Customer/nfs/playreadymediadrmplugintest ``` - trace your running process(need symbol supported) ```shell # client denali:/ # ps -A | grep drm media 2262 1 120020 3380 binder_thread_read 0 S android.hardware.drm@1.0-service.widevine drm 2366 1 119440 1908 binder_thread_read 0 S drmserver media 5703 1 116976 2996 binder_thread_read 0 S mediadrmserver media 5718 1 152500 5416 binder_thread_read 0 S android.hardware.drm@1.0-service # Take mediadrmserver as an example, PID=5703. # script execute on build server. aidrifter.chang@hcswd021805$ development/scripts/gdbclient.py -p 5703 ```` - check your linking libraries before executing - ==ldd== or ==ld.bfd(Android Tool Chain)== ```shell aidrifter@aidrifter-VM$ ldd a.out linux-vdso.so.1 => (0x00007ffc84ee5000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faaec1fc000) /lib64/ld-linux-x86-64.so.2 (0x000055c8c7179000) ```` - Android lld ```shell aidrifter@server$ /home/aidrifter/Android/AN8/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-ld.bfd /home/aidrifter/playreadymediadrmplugintest /home/aidrifter/Android/AN8/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-ld.bfd: warning: libdl.so, needed by /home/aidrifter/playreadymediadrmplugintest, not found (try using -rpath or -rpath-link) /home/aidrifter/Android/AN8/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-ld.bfd: warning: liblog.so, needed by /home/aidrifter/playreadymediadrmplugintest, not found (try using -rpat h or -rpath-link) /home/aidrifter/Android/AN8/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-ld.bfd: warning: libssl.so, needed by /home/aidrifter/playreadymediadrmplugintest, not found (try using -rpat h or -rpath-link) /home/aidrifter/Android/AN8/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-ld.bfd: warning: libstagefright_foundation.so, needed by /home/aidrifter/playreadymediadrmplugintest, not fou nd (try using -rpath or -rpath-link) /home/aidrifter/Android/AN8/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-ld.bfd: warning: libutils.so, needed by /home/aidrifter/playreadymediadrmplugintest, not found (try using -rp ath or -rpath-link) /home/aidrifter/Android/AN8/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-ld.bfd: warning: libc++.so, needed by /home/aidrifter/playreadymediadrmplugintest, not found (try using -rpat h or -rpath-link) /home/aidrifter/Android/AN8/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-ld.bfd: warning: libc.so, needed by /home/aidrifter/playreadymediadrmplugintest, not found (try using -rpath or -rpath-link) /home/aidrifter/Android/AN8/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-ld.bfd: warning: libm.so, needed by /home/aidrifter/playreadymediadrmplugintest, not found (try using -rpath or -rpath-link) /home/aidrifter/Android/AN8/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-ld.bfd: warning: cannot find entry symbol _start; defaulting to 0000000000010190 ```` - 記得補上你缺的so喔 0.0 我都是直接從板子上面copy ```shell warning: .dynamic section for "/home/aidrifter/Android/AN8/out/target/product/denali/symbols/system/lib/libstagefright_foundation.so" is not at the expected address (wrong library or version mismatch?) ```` - show gdb sharedlibrary command ```shell <gdb> info sharedlibrary # we look for libplayreadydrmplugin.so and libplayready3.x.so From To Syms Read Shared Object Library 0xf69eded0 0xf69f00a8 Yes (*) /home/aidrifter/Android/AN8/out/target/product/denali/symbols/system/lib/libnetd_client.so 0xf68e8ff4 0xf68f1d9c Yes /home/aidrifter/Android/AN8/out/target/product/denali/symbols/vendor/lib/mediadrm/libplayreadydrmplugin.so 0xf691cd34 0xf6925000 Yes (*) /home/aidrifter/Android/AN8/out/target/product/denali/symbols/system/lib/libdrmframework.so 0xf5682488 0xf5727c5c Yes /home/aidrifter/Android/AN8/out/target/product/denali/symbols/vendor/lib/libplayready3.x.so 0xf5605ab4 0xf5607cc0 Yes /home/aidrifter/Android/AN8/out/target/product/denali/symbols/vendor/lib/libsharemem.so 0xf6955d70 0xf69581d4 Yes (*) /home/aidrifter/Android/AN8/out/target/product/denali/symbols/vendor/lib/libteec.so 0xf5863680 0xf5c42718 Yes (*) /home/aidrifter/Android/AN8/out/target/product/denali/symbols/vendor/lib/libutopia.so 0xf55c1af0 0xf55c601c Yes /home/aidrifter/Android/AN8/out/target/product/denali/symbols/vendor/lib/libmutils.so 0xf69a0f30 0xf69a35a4 Yes /home/aidrifter/Android/AN8/out/target/product/denali/symbols/vendor/lib/libiniparser.so ``` - common gdb command ```shell <gdb> lay src <gdb> frame # #0 testing::InitGoogleTest (argc=0xfffefa30, argv=0xfffefa74) at external/googletest/googletest/src/gtest.cc:5372 <gdb> b main # Breakpoint 1, main (argc=1, argv=0xfffefa74) at external/googletest/googletest/src/gtest_main.cc:34 <gdb> c ``` - `b` : set break point at PluginTest.cpp - break 可帶如下參數: - linenum 本地行號,即list命令可見的行號 - filename:linenum 制定個文件的行號 - function 函數,可以是自定義函數也可是庫函數,如open - filename:function 制定文件中的函數 - condtion 條件 ```shell <gdb> b PluginTest.cpp:111 <gdb> b PluginTest.cpp:252 ``` - `info break` : show all break point information ```shell gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0xaaab9968 in main(int, char**) at external/googletest/googletest/src/gtest_main.cc:34 breakpoint already hit 1 time 2 breakpoint keep y <MULTIPLE> 2.1 y 0xaaab05cc vendor/playready/mediadrm/tests/PluginTest.cpp:267 2.2 y 0xaaab4048 in android::PluginTest_OpenSession_Test::TestBody() at vendor/playready/mediadrm/tests/PluginTest.cpp:267 2.3 y 0xaaab7a18 in android::PluginTest_CreateDrmPlugin_Test::~PluginTest_CreateDrmPlugin_Test() at vendor/playready/mediadrm/tests/PluginTest.cpp:267 2.4 y 0xaaab7d04 in testing::internal::TestFactoryImpl<android::PluginTest_OpenSession_Test>::CreateTest() at vendor/playready/mediadrm/tests/PluginTest.cpp:267 3 breakpoint keep y <MULTIPLE> breakpoint already hit 2 times 3.1 y 0xaaab052e vendor/playready/mediadrm/tests/PluginTest.cpp:252 3.2 y 0xaaab3ae4 in android::PluginTest_CreateDrmPlugin_Test::TestBody() at vendor/playready/mediadrm/tests/PluginTest.cpp:252 3.3 y 0xaaab7a18 in android::PluginTest_CreateDrmPlugin_Test::~PluginTest_CreateDrmPlugin_Test() at vendor/playready/mediadrm/tests/PluginTest.cpp:252 3.4 y 0xaaab7b24 in testing::internal::TestFactoryImpl<android::PluginTest_CreateDrmPlugin_Test>::CreateTest() at vendor/playready/mediadrm/tests/PluginTest.cpp:252 ``` - `whatis` varname : 顯示變數型別。 - `ptype` varname : 顯示 class, struct 的定義內容。 ```shell # ptype (gdb) ptype drmFactory type = class UniquePtr<android::DrmFactory, DefaultDelete<android::DrmFactory> > [with T = android::DrmFactory, D = DefaultDelete<android::DrmFactory>] { private: T *mPtr; public: UniquePtr(T *); private: UniquePtr(const UniquePtr<T, D> &); public: ~UniquePtr(void); T & operator*(void) const; T * operator->(void) const; T * get(void) const; T * release(void); void reset(T *); private: void operator=(const UniquePtr<T, D> &); } # whatis (gdb) whatis drmFactory type = UniquePtr<android::DrmFactory, DefaultDelete<android::DrmFactory> > ``` - How to break ==C++ function== at right place ? ```shell (gdb) b android::PlayReadyDrmFactory::isCryptoScgemeSupported ``` - Be careful `name space`