交叉编译arm gdb
By unanao <jianjiaosun@gmail.com>
arm-linux的gdb移植分为两种情况.
-
交叉调试版。
这种模式是需要编译一个arm-linux版本gdbserver (GDB的stub模块).然后再编译一个X86版本交叉调试的gdb。为了与桌面版本身的gdb 区别开来,一般改名为 arm-linux-gdb。两者通过串口或者网络进行互联。
这是比较正统的方法。它gdbserver可以通过arm-linux-gdb直接在host上单步调试target的应用程序。.并且可以与图形界面调试器配合进行图形界面调试。缺点就是target资源较少。因此单步调试的速度并不是太快。因此实用性不算太强。
-
整个gdb移植成一个ARM的本地版
在开发板上直接用gdb来调试。 arm-linux的本地版一般只能做字符界面的。界面没有支持GUI的交叉调试版友好。而且单步调试速度也不算快。但是有几大大优点:
1) 定位程序退出所在函数.
2) 判断程序退出的原因
3) 通过条件断点分析异常情况时运行环境.
用本地版gdb运行程序时,当程序因段错误或其它原因退出程序时。可以通过gdb bt(即 backtrace)来查看最后运行的堆栈。来判断出错时是在哪一个函数里退出。这样会大大加快定位 错误的速度,这样有时需要几天的定位的错误,可能只需要几分钟即可定位,这在嵌入式开发里 有很强实际效用。
这里我们只介绍一下本地gdb的移植。
1下载最新的ncurse和gdb。
-
ncurse: http://www.gnu.org/software/ncurses/
-
gdb: http://www.gnu.org/software/gdb/download/
为了清晰建立目录如下:ncurse放入libs目录,gdb 解压在项目目录下:
gdb (项目目录)
| --output
| |_arm-linux
|-- gdb-x.y
|
|--libs
|-- ncurse-x.y
x.y是版本号
1.1ncurse库的移植
解压 tar xvzf ncurses-x.y.tar.gz
cd ncurses-x.y
生成makefile
./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux --without-ada --enable-termcap --with-shared
其中--enable-termcap比较关键gdb需要这个库
--host=arm-linux 根据交叉编译工具连的名字而定, 如果交叉编译器的名字叫arm-neon-linux-gnueabi-gcc, 那么就是--host= arm-neon-linux-gnueabi
编译 make
安装 make install
libncurses.so 库应该在output/arm-linux/lib
1.2gdb本身的移植。
解压 tar xvjf gdb-x.y.tar.bz2
cd gdb-x.y
生成Makefile
./configure --host=arm-linux --enable-shared --prefix=$PWD/output/arm --without-x --disable-gdbtk --disable-tui --without-included-regex --without-included-gettext LDFLAGS="-L$PWD/../output/arm-linux/lib" CPPFLAGS="-I$PWD/../output/arm-linux/include"
脚本含义下:
-
--enable-shared 动态编译
-
--host=arm-linux 用arm-linux-gcc编译(根据自己的编译器修改,去掉-gcc)
-
--prefix="$PWD/../output/arm-linux" 安装目录
-
--without-x 取消x windows 支持
-
--disable-gdbtk 取消gdbtk,应该也是图形界面相关的
-
--disable-tui 取消tui 界面
-
--without-included-regex 关闭正则表达式库
-
--without-included-gettext 去掉用于多语言处理的 gettext库
正则表达式/gettext,暂时不需要,先去掉
CPPFLAGS/LDFLAGS是确保能找到ARM版的ncurses库
编译 make
安装 make install
最终的arm的程序gdb应该在output/arm-linux/bin下面,将其和libncurses.so拷贝到开发板上即可运行,象x86的GDB一样运行即可
注意这个样编译能同时把ARM版gdbserver 也同时编译出来并在安装目录看到.而且一般eabi的gcc编译器都自带了arm-linux-gdb.所以交叉版本的gdb移植很多时候可以省略.
刚刚编译出来的gdb尺寸相当大,10M多,因此必须要用arm-linux-strip gdb 来把尺寸减少.strip后大约2M多.