0%

Android AOSP gdb stl 支持

Android AOSP gdb stl 支持

默认情况下不支持stl 输出, 需要gdb支持python脚本, 一般需要自己编译.

  1. 下载编译python3.x 源码:

    1
    2
    3
    4
    5
    6
    7
    curl -O https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tar.xz
    cd Python-3.8.1
    mkdir build
    #prefix 是指定安装目录, 也可指到任一目录, 因为这里只用到编译python时生成的临时文件
    ../configure --prefix=~/Programs/python3 --enable-optimizations --enable-shared
    make
    make install
  2. 下载编译gdb源码:

    https://ftp.gnu.org/gnu/gdb/gdb-9.2.tar.xz

    这个链接有点慢, 可以直接下附件中的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    tar gdb-9.2.tar.xz
    mkdir build
    #prefix 是安装目录, with-python选项的路径填上一步编译python的build路径
    # arm64
    ../configure --target=aarch64-linux-android --prefix=/home/mi/Programs/gdb --enable-unicode=ucs4 --with-python=/home/mi/Programs/Python-3.8.1/build
    # mips
    ../configure --target=mips-mti-elf --prefix=/home/mi/program/mips-gdb --enable-unicode=ucs4 --with-python=/usr --with-auto-load-dir=$debugdir:$datadir/auto-load --with-auto-load-safe-path=$debugdir:$datadir/auto-load --with-expat --without-libunwind-ia64 --without-lzma --without-babeltrace --without-intel-pt --disable-libmcheck --without-mpfr --without-guile
    make
    make install
  3. 切换本地python版本为python3

    1
    sudo rm /usr/bin/python; sudo ln -s /usr/bin/python3 /usr/bin/python;

    这里注意的点是xiaomi的code环境是依赖python2的, repo可以切到python2上, 将repo的第一行改成#!/usr/bin/env python2 即可, 但代码编译时, 有些模块在python3下会报错, 目前发现的有依赖kernel 模块的, 使用ninja都会报错. 所以最好在编译时将python版本切换到python2.

  4. 定制gdbinit

    android上废弃了stlport和gnustl的支持, 只支持libc++的方式集成stl.

    所以python解析脚本是基于libc++开发的, 这里提供一下github上的一个脚本

    https://github.com/koutheir/libcxx-pretty-printers

    1
    git clone https://github.com/koutheir/libcxx-pretty-printers
    1
    2
    3
    4
    5
    6
    7
    python
    import sys
    #路径填刚才clone到本地的, 指定到第一级src目录
    sys.path.insert(0, '/home/mi/program/libcxx-pretty-printers/src')
    from libcxx.v1.printers import register_libcxx_printers
    register_libcxx_printers (None)
    end
  5. android编译module修改, Android.bp修改

    1
    2
    3
    4
    5
    6
    # 添加stl支持
    cflags: [
    "-O0",
    ],
    stl: "c++_static",
    stl: "c++_shared"
  6. vscode 中使用gdb

    vscode的launch.json也要配置打开 pretty-printers, 对于remote调试感兴趣的可以看另一篇文档中的介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Remote Launch",
"type": "cppdbg",
"request": "launch",
"miDebuggerServerAddress": "127.0.0.1:8888",
"program": "/home/mi/work_space/miui-r-umi-dev/out/target/product/cmi/symbols/system/bin/test_code_aaaaaaa",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"sourceFileMap": {
"system/core/crypto_test": "/home/mi/work_space/miui-r-umi-dev/system/core/test_code"
},
"logging": {
"trace": true,
"traceResponse": true,
"engineLogging": true,
},
"MIMode": "gdb",
"miDebuggerPath": "/home/mi/Programs/gdb/bin/aarch64-linux-android-gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
],
}
]
}