gdb交叉调试类似于网络浏览器,本地PC为客户端,arm开发板为服务器端,双方都要统一编译工具链,版本最好保持一致。
(百度百科)一般来说,GDB主要帮助你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
一、下载源码
http://ftp.gnu.org/gnu/gdb/
新的版本对环境的要求要高点,如果出错了可以尝试更换旧点的版本,我使用的版本是 gdb-7.8.1.tar.gz。
二、获取arm-linux-gdb(pc)
arm-linux-gdb属于调试程序,主机可以通过执行该程序打开arm可执行文件。一开始照着网上的教程来操作,理想情况.configure、make、make install三步到位,实际情况是参数换了好几组,make始终会报error。他们的思路是通过gdb源码配置->编译->生成arm-linux-gdb
,我失败的原因可能是交叉编译工具链不适合此操作,当我查看工具链的时候,发现工具链本身自带一个arm-linux-gdb
程序!那我就没必要再去自己编译生成一个了。如果工具链没有这个程序再去考虑编译安装,可以参考这篇文章。
三、获取gdbserver(arm)
gdbserver运行在arm开发板中,生成步骤:
cd gdb-7.8.1/gdb/gdbserver/
./configure --target=arm-linux --host=arm-linux
make CC=arm-linux-gcc
参数含义:
--target 指定了目标机交叉编译器前缀
--host 指定了编译后的程序需要在哪里运行
CC=arm-linux-gcc 用来指定交叉编译工具为arm-linux-gcc,需要根据你自己的来指定。
这个过程一般不会出错,执行完命令后会在该目录下生成一个gdbserver
可执行文件,将该文件拷贝到开发板的/usr/bin
目录下,方便调用。这里需要注意的是运行gdbserver还需要libthread_db库,若你自己做的文件系统内没有这个库的话需要将本地交叉编译工具中的libthread_db*拷贝到开发板的/usr/lib
中去。
四、使用方法
4.1 编译程序
hello.c
#include <stdio.h>
int main()
{
int i = 1;
while (i++)
{
printf("num is : %d \n", i);
}
return 0;
}
Makefile
all:
arm-linux-gcc -g hello.c -o hello
clean:
rm hello
arm-linux-gcc -g用于编译出含有gdb调试信息的可执行文件。
4.2 ARM端打开gdbserver
ARM端执行如下内容,gdbserver 本地IP+端口号+可执行文件
gdbserver 192.168.40.178:1111 hello
![](https://img-blog.csdnimg.cn/20181122093936626.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01ldGVvcl9z,size_16,color_FFFFFF,t_70)
4.3 PC端连接gdbserver
PC端执行:
arm-linux-gdb ./hello
target remote 192.168.40.178:1111
![](https://img-blog.csdnimg.cn/20181122102747255.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01ldGVvcl9z,size_16,color_FFFFFF,t_70)
pc端连接之后,在arm板子这边可以看到远程连接信息。
4.4 gdb调试
通过简单的设置断点、运行来观察信息,可以看到已经能够gdb调试了。
参考文章: