Hi35xx NVR GDB调试
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
./configure --target=arm-hisiv400-linux
--host=arm-hisiv400-linux
--target=arm-hisiv400-linux表示目标平台,
--host 表示主机端运行的是arm-hisiv400-linux-gdb
make
生成gdbserver
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
(命令格式
#. /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
(命令格式
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
为挂载目录