Android AOSP gdb stl 支持
默认情况下不支持stl 输出, 需要gdb支持python脚本, 一般需要自己编译.
下载编译python3.x 源码:
1
2
3
4
5
6
7curl -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下载编译gdb源码:
https://ftp.gnu.org/gnu/gdb/gdb-9.2.tar.xz
这个链接有点慢, 可以直接下附件中的
1
2
3
4
5
6
7
8
9tar 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切换本地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.定制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
7python
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)
endandroid编译module修改, Android.bp修改
1
2
3
4
5
6# 添加stl支持
cflags: [
"-O0",
],
stl: "c++_static", 或
stl: "c++_shared"vscode 中使用gdb
vscode的launch.json也要配置打开 pretty-printers, 对于remote调试感兴趣的可以看另一篇文档中的介绍
1 | { |