Hi35xx NVR GDB调试

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_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:
端口号 程序)

出现提示:

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
为挂载目录

时间: 2024-10-27 09:45:17

Hi35xx NVR GDB调试的相关文章

gdb调试

[前言]使用gdb调试前,在编译程序时,要加 -g 选项,否则你将看不见程序的函数名.变量名,所代替的全是运行时的内存地址. 1.开始调试 a.  gdb <program> program也就是你的执行文件,一般在当前目录下. b. gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件. 2.[列出源码],从第n行开始(编译时要加 -g 选项) l n 3.[设置断点]在第N行加断点 break

gdb调试命令

本篇摘自互联网,纯属自己学习笔记,然分享给看到我的博客的人们. 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,

Go语言gdb调试踩坑

整个是一个docker环境 docker版本: 1.12.1,镜像是我自己做的基于ubuntu:14.04.05. 容器操作系统版本: Ubuntu 14.04.5 LTS go版本: 1.6.3 在gdb中执行run命令出错! 错误输出: warning:Error disabling address space randomization: Operation not permitted 环境:docker 解决办法: warning:Error disabling address spac

GDB调试汇编堆栈

GDB调试汇编堆栈 准备工作 终端编译工具: 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386 测试代码: test.c 分析过程 1.生成汇编代码:gcc -g gdbtest.c -o gdbtest -m32 2.调试:gdb test 3.设置断点,因为目的是分析而不是调试bug,所以我们将断点设置在main函数 4.开始gdb调试:r(un),如若想获取此时的汇编代码,可用指令:disassemb

GDB调试汇编分析

GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdbtest -m32命令在64位的机器上产生32位汇编代码 在使用gdb进行调试运行时,有cgdb和gdb两种工具,我建议大家使用张梓靖同学使用的cgdb工具,因为使用时可以随时看到自己的源代码,看到我们的断点在哪里,每一步返回值到了哪行,更加直观. 分析过程 使用b main指令在main函数处设置

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析(1)

堆栈跟踪 首先编辑一个程序 用gcc编译,再使用gdb调试,发现gdb尚未下载 下载后重新运行gdb 设置断点:b+行号或者"main" 运行:r frame:打印出的信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句. info frame:打印出的信息:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的.函数参数地址及值.局部变量的地址等等. 输入命令disassemble:显示出该代码(main())的汇编形式 info

[转]GDB调试基础

一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或i) locals 查看当前栈帧局部变量的值 list(或l) 列出源代码,接着上次的位置往下列,每次列10行 list 行号 列出从第几行开始的源代码 list 函数名 列出某个函数的源代码 next(或n) 执行下一行语句 print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函

GO的GDB调试

GoLang语言,学了很久,一直觉得它单步调试有较多问题,最近才知道自已对它了解得太少了.原来GO语言对GDB的版本是至少为gdb7以上,才能比较好的打印任意变量,如果低于这个版本,则才会出一些问题.网上说GDB版本为7.1,本人使用GDB7.8版本测试,确实很不错.以下是记录单步调试使用的几个打印变量.info frame,打印当前栈参数.info locals打印局部变量info args打印参数.bt显示当前堆栈x/3xw &r查看内存 删除调试符号:go build -ldflags “

Linux知识(5)----LINUX下GDB调试

参考资料: 1.LINUX下GDB调试