GDB调试ARM程序

来源:互联网 发布:js判断map是否包含key 编辑:程序博客网 时间:2024/06/09 13:46
调试分为两种:
A.在ARM上用gdb调试程序
B.在PC上远程调试ARM板上的程序
=========================================


A.
=====
综述: 移植gdb到ARM板上,然后在ARM上运行gdb,本地调试程序
----------------------------------------------------
step1:移植ncurse 5.6
tar xvzf ncurses-5.6.tar.gz
cd ncurses-5.6
生成makefile:
./configure --host=arm-linux  --prefix=$PWD/output/arm  --without-ada --enable-termcap --with-shared


NOTE : --enable-termcap 很关键,GDB需要termcap


编译 make
安装 make install
libncurses.so 库应该在./ncurses-5.6/output/arm/lib
----------------------------------------------------
step2:移植gdb-6.8
tar xvjf gdb-6.8.tar.bz2
cd gdb-6.8
生成Makefile:
./configure --host=arm-linux --enable-shared --prefix=/home/clannad/company/gdb-6.8/output/arm --without-x --disable-gdbtk --disable-tui --without-included-regex --without-included-gettext LDFLAGS="-L$PWD/../output/arm/lib" CPPFLAGS="-I$PWD/../output/arm/include"


脚本含义下:
--enable-shared    动态编译
--host=arm-linux  用arm-linux-gcc编译,在arm开发板上运行
--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
NOTE :在arm-linux-gcc 4.4.1 (s3c6410)下有如下编译错误: 
eval.c: In function 'evaluate_subexp_standard':
eval.c:1705: error: 'subscript_array' may be used uninitialized in this function
分析源码发现,是编译器认为这个数组定义后未初始化造成的(可能是bug).因此在在eval.c::1647 行加入进入初始操作.如此编译通过
            memset(subscript_array,0,sizeof(int)*MAX_FORTRAN_DIMS);


安装 make install
最终的arm的程序gdb应该在home/hxy/gdb/output/arm-linux/bin下面,将gdb(ARM版)和libncurses.so(ARM版)和它的链接 拷贝到开发板上即可运行,象x86的GDB一样运行即可


注意这个样编译能同时把ARM版gdbserver 也同时编译出来并在安装目录看到.而且一般eabi的gcc编译器都自带了arm-linux-gdb.所以交叉版本的gdb移植很多时候可以省略.
刚刚编译出来的gdb尺寸相当大,10M多,因此必须要用arm-linux-strip gdb 来把尺寸减少.strip后大约2M多.
====================================================================================================


B.
=======
综述: 移植gdserver到ARM板上,然后在PC上运行arm-linux-gdb,远程调试程序
NOTE : 交叉版本中,arm-linux-gcc 3.3.2 只能成功编译gdb 5.2.1.gdb 6.x 需要更gcc 3.4.4以上版本。
eabi arm-linux-gcc 4.3.3 编译可以成功编译gdb 6.8.
------------------------------------------------------
因为交叉版等于要移植两个平台程序.(x86的arm-linux-gdb和arm 版的gdb server)
这里目录结构调整如下


/home/hxy/gdb
|
+--output
|      |_arm-linux
|      |_x86-linux
|-- gdb 6.8
|   |-- cross-gdb #保存x86 gdb
|    |- -gdb/gdbserver #原有目录,在此编译arm gdbserver,
|
|--libs
   |-- ncurse


因其中cross-gdb是手工创建为了存放x86的目标代码
------------------------------------------------------
step1: 编译 cross 调试的gdb 6.8 
在/home/hxy/gdb/gdb-6.8 清除上一次结果 make distclean
创建/home/hxy/gdb/gdb-6.8/cross-gdb
在上述目录生成Makefile
../configure --target=arm-linux --enable-shared --prefix=$PWD/../../output/x86-linux --without-x --disable-gdbtk --without-included-regex --without-include-gettext
其中大部分参数跟本地版gdb含意类似。但是--target=arm-linux 表示target是arm-linux版的。而且是安装在X86-linux下


编译 make
安装 make install
 应该是安装在/home/hxy/gdb/output/x86-linux/bin/,名字是arm-linux-gdb
----------------------------------------------------
step2:生成arm版gdbserver(上文的ARM本地版GDB移植时,就已经把gdbserver编译出来了)
生成Makefile 在/home/hxy/gdb/gdb-6.8/gdb/gdbserver执行如下脚本 
./configure --host=arm-linux --prefix=$PWD/../../../output/arm-linux --without-include-regex --without-included-gettext
编译make 
安装 make install
这里应该在/home/hxy/gdb/output/arm-linux/bin有gdbserver


至于如何使用交叉调试参见相关博文,附件是已经编译好直接在eabi库环境下使用的版本 文件:arm-gdb-6.x.zip




====================================================================================================
两种调试方式的对比:
ARM本地调试: 适合直接程序.然后用core+gdb配合调试;不适合单步调试,存在某些问题,如:调试多线程程序时可能会因为libpthread.so匹配问题导致无法调试;
远程调试: 适合设置断点+单步调试+查看stack.


====================================================================================================
远程调试使用笔记:
ARM板上执行   gdbserver 192.168.1.64:1234(BroadIP:Port) /HuaZhi-IOT-A8/Gateway
PC上执行      arm-linux-gdb ./Gateway(此处的Gateway是在PC上的文件,内容和ARM上执行Gateway相同)
gdb下执行target remote 192.168.1.64:1234
运行程序:c (交叉调试不能用run命令来执行,因为remote后,程序就开始了,只要设置断点,然后c命令就会跑到断点处。)
断点命令:
break main
break ../Gateway/module/topology/topowidget.cpp:302 (根据目录而定)
 
NOTE : 
多线程程序远程调试,结果在gdb里面一运行就出如下的错误:
       Program received signal SIG32, Real-time event 32.
       0x400ed53c in sigsuspend () from /lib/libc.so.0

在gdb下,run之前输入: handle SIG32 nostop


谢谢前辈文章,附上链接:

http://blog.chinaunix.net/uid-122754-id-2952376.html

http://blog.csdn.net/embeddedman/article/details/7535872

http://blog.chinaunix.net/uid-23381466-id-309369.html

http://blog.csdn.net/woszsj/article/details/7710598

0 0
原创粉丝点击