1、交叉编译gdb
1.1下载源码
Gdb源码:wget https://ftp.gnu.org/gnu/gdb/gdb-15.2.tar.xz
Gdb依赖的源码:GMP、MPFR、ncurses(图形库)
GMP源码:wget https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz
MPFR源码:wget https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.1.tar.xz
ncurses源码:wget https://ftp.gnu.org/gnu/ncurses/ncurses-6.4.tar.gz
1.2 交叉编译GMP
解压命令
tar xvf gmp-6.3.0.tar.xz
创建脚本,然后执行如图1的脚本
#! /bin/bash
CROSS_COMPILE=“交叉编译工具目录”
SYSROOT="交叉编译头文件和库的目录"
HOST=“目标平台”
PREFIX="安装路径"
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export CFLAGS="--sysroot=${SYSROOT}"
export LDFLAGS="--sysroot=${SYSROOT}"
./configure --host=$HOST --prefix=$PREFIX --disable-shared --enable-static
1.3 交叉编译MPFR
解压命令
tar xvf mpfr-4.2.1.tar.xz
创建脚本,然后执行如图2脚本
#! /bin/bash
CROSS_COMPILE=“交叉编译工具目录”
SYSROOT="交叉编译头文件和库的目录"
HOST=“目标平台”
PREFIX="安装路径"
GMP_PATH=“gmp安装的路径”
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export CFLAGS="--sysroot=${SYSROOT}"
export LDFLAGS="--sysroot=${SYSROOT}"./configure --host=$HOST --prefix=$PREFIX --with-gmp=$GMP_PATH --disable-shared --enable-static
1.4 交叉编译ncurses
解压命令
tar xvf ncurses-6.4.tar.gz
创建脚本,然后执行如图3脚本
#!/bin/bash
CROSS_COMPILE=“交叉编译工具目录”
SYSROOT="交叉编译头文件和库的目录"
HOST=“目标平台”
PREFIX="安装路径"
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export RANLIB=${CROSS_COMPILE}ranlib
export LD=${CROSS_COMPILE}ld
export STRIP=${CROSS_COMPILE}strip
export NM=${CROSS_COMPILE}nm
export OBJCOPY=${CROSS_COMPILE}objcopy
export OBJDUMP=${CROSS_COMPILE}objdump
export AS=${CROSS_COMPILE}as
GMP_PATH=“gmp安装路径”
MPFR_PATH=“mpfr安装路径”
./configure \--host=$HOST \--prefix=$INSTALL_PATH \--enable-static \--disable-shared \--without-ada \--without-cxx-binding \--without-tests \--without-progs \--enable-pc-files \--without-debug \--without-develop \--enable-widec \--disable-rpath
1.5 交叉编译gdb
解压命令
tar xvf ncurses-6.4.tar.gz
创建脚本,然后执行如图4脚本
#!/bin/bash
CROSS_COMPILE=“交叉编译工具目录”
SYSROOT="交叉编译头文件和库的目录"
HOST=“目标平台”
PREFIX="安装路径"
# 工具链设置
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export RANLIB=${CROSS_COMPILE}ranlib
export LD=${CROSS_COMPILE}ld
export STRIP=${CROSS_COMPILE}strip
export NM=${CROSS_COMPILE}nm
export OBJCOPY=${CROSS_COMPILE}objcopy
export OBJDUMP=${CROSS_COMPILE}objdump
export AS=${CROSS_COMPILE}as
GMP_PATH=gmp安装路径
MPFR_PATH=mpfr安装路径
NCURSE_PATH=ncurses路径
export CPPFLAGS="-I${NCURSE_PATH}/include -I${NCURSE_PATH}/include/ncursesw -I${GMP_PATH}/include -I${MPFR_PATH}/include"
export LDFLAGS="-L${NCURSE_PATH}/lib -L${GMP_PATH}/lib -L${MPFR_PATH}/lib --sysroot=${SYSROOT}"
export CFLAGS="-fPIC -g -O2 -I${NCURSE_PATH}/include -I${NCURSE_PATH}/include/ncurses"
export CXXFLAGS="-fPIC -g -O2 -I${NCURSE_PATH}/include -I${NCURSE_PATH}/include/ncurses"./configure \
--host=$HOST \
--prefix=$INSTALL_PATH \
--with-sysroot=$SYSROOT \
--enable-tui \
--with-curses \
--with-gmp=$GMP_PATH \
--with-mpfr=$MPFR_PATH
2 使用步骤
2.1 移植到开发板上
将gdb下的安装目录打包,然后把它移植到开发板上,然后配置环境变量PATH,
export PATH=$PATH:”你的gdb可执行文件路径”。
2.2 gdb远程连接
在板子上启动gdbserver:
命令:gdbserver :端口 可执行程序
① 在上位机上远程连接:
adb forward tcp:端号口tcp:端口号 (如果是adb连接需要转发如果是远程登录不用执行这一步)
② 执行程序
arm-openwrt-linux-gnueabi-gdb ./plt_if_test
其中arm-openwrt-linux-gnueabi-gdb是交叉编译工具链,plt_if_test是可执行文件,进入界面过后执行远程连接target remote localhost:10000,就可以连接到开发板上了。需要图形界面使用gdb命令ref就可以出现。当连接上gdbserver以后就可以像在本地调试一样使用gdb.
2.3 gdb远程调试
十分推荐远程调试,因为上位机上面有源码可以进行源码级调试,但是在板子上还需要把源码移植到板子上才能进行源码级调试。如果没有源码你会看到下面这种情况,只会显示哪个文件的行号。
在远程调试之前,需要在编译源码的时候加上标志-g,这样才能在编译好的可执行文件里面有符号表,才能显示出源码。
如下图所示远程调试步骤,首先打断点到main函数。
4.4.2 gdbserver调试段错误
可以看到当发生段错误的时候,在上位机这里面出现了接收到了板子上出现段错误,这时可以看到上面可视化窗口就有段错误出现的地方,也可以用bt full查看调用栈。