gdb是Linux环境下的代码调试工具,其安装步骤如下:安装step1:首先检查系统中有没有安装过,有的话用一下命令卸载gdb旧版本step2:在网址:http://ftp.gnu.org/gnu/gdb下载gdb源码包(这里楼主选的是8.0.1版本);或者直接在linux系统中用wget命令下载:wget http://ftp.gnu.org/gnu/gdb/gdb-8.0.1.tar.gz
嵌入式Linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target Board端使用gdbserver。调试时,应用程序在嵌入式目标系统上运行,而gdb调试在Host端。gdb调试的时候,pc机上的gdb向开发板上的gdbserver发出命令,而开发板上的gdbserver就会向应用程序发出信号,使应用程序停下来或者完成其他一些工作!一般Linux发行版中都有一个可以运行的GDB,但开发人员不能直接使用该发行版中的GDB来做远程调试,而要获取GDB的源代码包,针对arm
平台作一个简单配置,重新编译得到相应GDB。
1 、编译安装gdb:首先下载gdb源码,我下载的是gdb-6.6.tar.gz
#tar xvzf gdb-6.6.tar.gz
#cd gdb-6.6
#./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v (注意此时是root登陆,因为安装目录在/usr/local)
(--target配置gdb的目标平台,--prefix配置安装路径,当然其他路径也可以,跟下面配置一致即可,须在环境变量中声明,启动arm-linux-gdb需要,可更改/etc/profile或~/.bash_profile或~/.bashrc,添加:
export PATH=$PATH:/usr/local/arm-gdb/bin,这样可以找到路径)
#make
#make install(生成arm-linux-gdb,并存入/usr/local/arm-gdb/bin/,查询确认下;或者也可以启动arm-linux-gdb,若成功,则证明安装无误)
2,编译gdbserver
首先要进入gdb-6.6/gdb/gdbserver这个目录
#./configure --target=arm-linux --host=arm-linux
(--target=arm-linux表示目标平台,--host表示主机端运行的是arm-linux-gdb,不需要配置--prefix,因为gdbserver不在主机端安装运行)
#make CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc ;这一步是指定arm-linux-gcc的绝对路径,注意,是绝对路径。如果没有错误的话就会在gdbserver的目录下生成gdbserver的可执行文件,注意此时要更改其属性,否则可能会出现无法访问的情况,
#chmod 777 gdbserver将其更改为任何人都可以读写执行;
#arm-linux-strip gdbserver;使用此命令处理一下gdbserver,将多余的符号信息删除,可让elf文件更精简,通常在应用程序的最后发布时使用;然后把它烧写到flash的根文件系统分区的/usr/bin(在此目录下,系统可以自动找到应用程序,否则必须到gdbserver所在目录下运行之),或通过nfs mount的方式都可以。只要保证gdbserver能在开发板上运行就行。
3. gdb+gdbserver 调试流程
交叉编译,带参数-gstabs或-g加入调试信息。加入要调试的程序是helloworld:
$arm -linux-gcc -g helloworld.c -o helloworld
然后将生成的可执行文件拷到开发板;
在目标板上:helloworld是欲调试程序,它和gdbserver在同一个目录下,192.168.177.71是宿主机的IP
此时gdbserver开始监听2345端口;这个端口号应该是用来和宿主机进行通讯;
在宿主机上,#export PATH=$PATH:/usr/local/arm-gdb/bin #arm-linux-gdb helloworld ;图中192.168.177.102为目标板的IP
gdbserver中run命令不能用,可以使用continue, break, print, next, step, list, 等
注:几个常用的调试命令
(1)l:列出所有源代码
(2)break main:在main处打断点break test_debug.c:11:在test_debug.c的11行打断点
(3)c:运行到断点处
(4)step:单步执行
(5)next:单步执行,但是step会进入函数里面,但是next不会
(6)print a:打印a这个变量的值
(6)quit:退出,输入此命令则开发板上的gdbserver也退出
---------------------
作者:十一月zz
来源:CSDN
原文:https://blog.csdn.net/baidu_35679960/article/details/60140962
版权声明:本文为博主原创文章,转载请附上博文链接!