# [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`