Linux下嵌入式程序仿真调试(GDB)(一)

2019-07-12 14:30发布

目录

前言

项目遇到一个问题,就是程序在Ubuntu下运行的时候是正常的,至少大部分时候运行是正常的,但是移到开发板上,就会出现段错误。这时候突然想到了GDB,从来都没有接触过调试工具,以前的调试都是使用printf直接打印的方式!!!效率极低!准备鸟枪换炮!!!

GDB

调试工具介绍

linux下的程序调试方法汇总,这篇文章中介绍了linux下调试的常用方法。

GDB调试教程

GDB是一个由GNU开源组织发布的、UNIX/Linux操作系统下的、基于命令行的、功能强大的程序调试工具。这篇文章GDB十分钟教程,介绍了GDB调试程序的大体流程。
程序的调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量。

gcc调试相关编译选项

  • -g
    gdb主要调试的是C/C++程序。要调试C/C++程序,首先在编译时,必须要把调试信息加到可执行文件中,使用编译器(cc/gcc/g++)的-g参数即可。

GDB交叉调试环境搭建

嵌入式Linux的GDB调试环境由Host端(PC机)和Target端(ARM)两部分组成,Host端使用arm-linux-gdb调试工具,而Target端需要运行gdbserver,两者之间可通过串口或者网口连接,把ARM应用程序在Target端的执行情况返回Host。调试跟踪命令从Host端的arm-linux-gdb中发出。搭建交叉调试环境 arm-linux-gdb配合gdbserver

下载地址

GDB下载地址

编译过程

  • gdb的编译过程
// 创建gdb放置的目录 mkdir arm-gdb // 解压 tar -xvf gdb-8.1.tar.gz // 配置 ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- --prefix=/xxx/arm-gdb CC=arm-linux-gnueabihf-gcc // 编译、安装 make -j4 make install
  • gdbserver编译过程
cd /xxx/gdb-8.1/gdb/gdbserver // 配置 ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc // 编译 make // 注意:不需要make install // 去除符号信息 arm-linux-gnueabihf-strip gdbserver -o gdbserver

使用方法

  • 第一步:nfs方式实现PC和开发板之间的互通
    nfs挂载命令示例:
mount -t nfs 192.168.1.95:/nfs /opt -o nolock
  • 第二步:Ubuntu下交叉编译测试程序
arm-linux-gnueabihf-g++ -g helloWorld.cpp -o helloWorld // 注意:要加-g参数才能进行调试
  • 第三步:拷贝gdbserver到/opt目录下(此处是博主的nfs挂载目录)
  • 第四步:拷贝测试程序/opt目录下
    可以现在开发板上执行这个程序,看是否可以执行成功。交叉编译命令示例:
arm-linux-gnueabihf-g++ -g helloWorld.cpp -o helloWorld
  • 第五步:gdbserver使用方法
    格式:gdbserver 开发板ip地址:通信端口(自己设定) 测试程序 【命令行参数】
    举例如下:
gdbserver 192.168.1.90:20 helloWorld // 192.168.1.90是开发板地址 // 20是端口号 // helloWorld是测试程序 打印信息如下: Process helloWorld created; pid = 1999 Listening on port 20
  • 第六步:Ubuntu下启动arm-linux-gnueabihf-gdb
arm-linux-gnueabihf-gdb helloWorld 注意:如果要直接这样使用arm-linux-gnueabihf-gdb,需要设置环境变量,示例如下: export PATH=$PATH:/xxx/arm-gdb/bin 打印信息如下: Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=i686-build_pc-linux-gnu --target=arm-linux-gnueabihf". For bug reporting instructions, please see: <https://bugs.launchpad.net/gcc-linaro>... Reading symbols from /nfs/helloWorld...done. (gdb) 注意:打印最后进入了gdb的调试环境:(gdb)
- 第七步:远程连接开发板端口
(gdb)target remote 192.168.1.90:20
Ubuntu打印信息如下: Remote debugging using 192.168.1.90:20 Reading symbols from /opt/arm-4.9-toolchains/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3...done. Loaded symbols for /opt/arm-4.9-toolchains/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3 0xb6fd7a40 in _start () from /opt/arm-4.9-toolchains/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3 开发板打印信息如下: Remote debugging from host 192.168.1.95
完成上面的7步之后,就可以使用GDB对开发板程序进行调试了。

总结

虽然交叉编译GDB的库的过程很顺利,但是中途发现大部分博客的参数都是-host=arm-linux,没有经过思考就胡乱编译,后来才改对。应该来说,gdb可以算是交叉编译工具链的一个工具,只是在交叉编译工具链中可能不包含这一部分,所以需要交叉编译gdb的库,最终得到arm-linux-gnueabihf-gdb这要的调试工具。

链接地址

linux下的程序调试方法汇总
GDB十分钟教程
linux使用gdb调试程序完全教程
搭建交叉调试环境 arm-linux-gdb配合gdbserver