Hi35xx NVR GDB调试

Deadly 提交于 2020-03-09 07:30:00

Hi35xx NVR GDB调试

 

1. 下载gdb源代码

嵌入式Linux GDB 调试环境由Host Target 两部分组成,Host 端使用armlinuxgdbTarget 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.2023128 能够上去的,全部的版本号都有啊
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) 配置编译环境。交叉编译工具链为海思交叉工具编译链,我配置的交叉编译器为v400arm-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-gdbsource  ./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_code\his3520d_v2-8-0-8_3536\Build进入到Build文件夹下。打开Rules.mak文件进行改动。

 

定义debug = 1  编译代码,注意可运行文件生成路径。Debug版本号编译生成的可运行文件和release版本号生成的可运行文件路径不同。

out目录以下比如Hi3536: (\Out\Hi3536\app)目录下会生成一个debug的目录,debug版本号生成的可运行程序存放在此目录以下。

 

4.gdb源代码编译好的可运行程序gdb gdbserver复制到挂载路径下。

板端执行命令:

#./gdbserver 192.168.1.141:2345 vfware  

(命令格式 #. /gdbs er v er  主机I P: port号 程序)

出现提示:

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

gdbtarget remote 192.168.1.143:2345

(命令格式target remote 开发板I P:port号 (和板子上执行gdbserver 的port号要同样))

具体调试步骤请看上面文档(gdb+gdbserver 方式进行ARM 板上程序调试.pdf

#gdbC  运行程序

当代码出现段错误,输入bt 来查看堆栈信息跟踪问题出现错误所在位置。

 

 

 

5. Core文件调试方法

编译上面的gdbgdbserver后,相同拷贝gdbgdbserver到挂载文件夹。

执行命令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 为挂载文件夹

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!