海思GDB调试

2019-07-13 03:52发布

1. 下载gdb源码 嵌入式Linux 的GDB 调试环境由Host 和Target 两部分组成,Host 端使用arm-linuxgdb,Target Board 端使用gdbserver。这样,应用程序在嵌入式目标系统上运行,而gdb 调试在Host 端,所以要采用远程调试(remote)的方法。进行GDB 调试,目标系统必须包括gdbserver 程序(在主机上正对硬件平台编译成功后下载到目标机上),宿主机也必须安装GDB 程序。一般Linux 发行版中都有一个可以运行的GDB,但开发人员不能直接使用该发行版中的GDB 来做远程调试,而要获取GDB 的源代码包,针对arm 平台作一个简单配置,重新编译得到相应GDB。GDB 的源代码包可以从
http://www.gnu.org/software/gdb/download/
http://ftp.gnu.org/gnu/gdb/ 211.95.105.202:3128 可以上去的,所有的版本都有啊
http: //ftp.cs.pu.edu.tw/linux/sourceware/gdb/releases/下载
ftp://ftp.gnu.org/gnu/gdb
外网的ftp 我经常上不去,国内常见的开源社区的下载频道通常都有下载的
http://download.chinaunix.net/download/0004000/3482.shtml, 我下载的版本gdb-7.10.tar.gz。下载到某个目录,如/opt。   参考资料:gdb+gdbserver 方式进行ARM 板上程序调试 http://blog.csdn.net/hejianhua/article/details/7312979 XML: http://blog.csdn.net/yangzhongxuan/article/details/13002789   2.配置编译环境 1) 解压gdb源码tar zxvf gdb-7.10.tar.gz -C /opt/ 2) 进入到gdb源码目录,cd /opt/gdb-7.10 3) 配置编译环境,交叉编译工具链为海思交叉工具编译链,我配置的交叉编译器为v400的arm-hisiv400nptl-linux 4)详细编译步骤 1、./configure --target=arm-hisiv400nptl-linux --prefix=/opt/hisi-gdb/ -v (--target 配置gdb 的目标平台, --prefix 配置安装路径, 当然其他路径也可以, .跟下面配置一致即可,须在环境变量中声明, 启动arm-hisiv400nptl-linux-gdb 需要, 打开 vi  /etc/profile , 添加export PATH=$PATH:/opt/hisi-gdb, source  ./etc/profile使配置生效) 配置完成后生成makefile   2、make
  make install
    生成arm-hisiv400nptl-linux-gdb,并存入/opt/hisv-gdb  /bin 3、安装完成后进入cd  /opt/gdb-7.10/gdb/gdbserver
在编译安装GDB后,进入到目录gdbserver下,我的目录为/home/arm/gdb/gdb-7.2/gdb/gdbserver,在该目录下进行配置。在命令行里输入:./configure –target=arm-linux –host=arm-linux。接着,配置所采用的交叉编译器。我用的是Hi3520D,所用的交叉编译器为arm-hisiv400-linux-gcc,因此我在命令行里输入 : 
make  CC=/opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-gcc 
注意,一定要写交叉编译器的绝对路径!在make的过程中可能会出错,提示: 
“linux-x86-low.c error: sys/reg.h: No such file or directory”。 
这时候,在#ifdef HAVE_SYS_REG_H这句前面加上一句: 
#undef HAVE_SYS_REG_H 
然后重新编译即可。编译完成后,在gdbserver目录下就会生成gdbserver和gdbreplay。,这两个文件就可以放在目标板上和开发编译的程序一起进行调试 file  gdbserver  显示arm  版本的程序   3.代码加-g编译。 在代码路径下E:my_codehis3520d_v2-8-0-8_3536Build进入到Build目录下,打开Rules.mak文件进行修改。   定义debug = 1  编译代码,注意可执行文件生成路径。Debug版本编译生成的可执行文件和release版本生成的可执行文件路径不同。在out文件夹下面例如Hi3536: (OutHi3536app)目录下会生成一个debug的文件夹,debug版本生成的可执行程序存放在此文件夹下面。   4.将gdb源码编译好的可执行程序gdb ,gdbserver拷贝到挂载路径下。 板端运行命令: #./gdbserver 192.168.1.141:2345 vfware  (gdbserver  客户端IP:端口  程序) (命令格式 #. /gdbs er v er  主机I P: 端口号 程序) 出现提示: Process  borad  created; pid = 776 Listening on port 2345 Remote debugging from host 192.168.1.141   在ubuntu下运行命令: 在主机上运行arm-hisiv400-linuxnptl-gdb,注意这个gdb是用源码编译出来的,在安装路径/opt/hisiv-gdb/bin路径下。   在主机端运行gdb #. /gdb (gdb)target remote 192.168.1.143:2345(   开发板IP:端口  ) (命令格式target remote 开发板I P:端口号 (和板子上运行gdbserver 的端口号要相同)) 详细调试步骤请看上面文档(gdb+gdbserver 方式进行ARM 板上程序调试.pdf) #(gdb)C  执行程序 当代码出现段错误,输入bt 来查看堆栈信息跟踪问题出现错误所在位置。       5. Core文件调试方法 编译上面的gdb和gdbserver后,同样拷贝gdb和gdbserver到挂载目录, 执行命令ulimit -c  10000000000  设置临时core文件的大小为无穷大,注意每次重新运行程序都要设置 然后执行./gdb  vfware  core    (vfware 为调试程序,也是加-g 编译出来的程序,注意libuv库中有用到clock_gettime()、clock_getres()函数,加-g编译时会报未定义错误,所以编译时还要加 -lrt, 才能成功编译debug版本) 程序如果产生段错误Segmentation fault. 会在当前挂载路径下产生一个core文件。 执行完./gdb  vfware  core后出现如下信息     使用命令bt查看当前堆栈的信息,既出现错误的地方     注意:      可能会出现下面这种情况 #0 0x7bf99014 in ?? () #1 0x7bf020f8 in ?? ()   看不到堆栈的信息,只有地址和问号。我们可以看到上面的提示信息   意思是有5个共享库的函数找不到,我们把板子上的库拷贝到挂载目录即可 cp /lib/ /mnt/nfs  -rf     /lib为目标板上的库文件夹   /mnt/nfs 为挂载目录