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查看調用棧。