首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >嵌入式linux实时操作系统及应用编程pdf(嵌入式linux都有哪些调试信息)

嵌入式linux实时操作系统及应用编程pdf(嵌入式linux都有哪些调试信息)

作者头像
全栈程序员站长
发布2022-07-30 10:18:54
发布2022-07-30 10:18:54
3.1K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

目录

  • 目录
  • 前言
  • GDB
    • 调试工具介绍
    • GDB调试教程
      • gcc调试相关编译选项
    • GDB交叉调试环境搭建
      • 下载地址
      • 编译过程
      • 使用方法
  • 总结
  • 链接地址

前言

项目遇到一个问题,就是程序在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的编译过程
代码语言:javascript
代码运行次数:0
运行
复制
// 创建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编译过程
代码语言:javascript
代码运行次数:0
运行
复制
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挂载命令示例:
代码语言:javascript
代码运行次数:0
运行
复制
mount -t nfs 192.168.1.95:/nfs /opt -o nolock
  • 第二步:Ubuntu下交叉编译测试程序
代码语言:javascript
代码运行次数:0
运行
复制
arm-linux-gnueabihf-g++ -g helloWorld.cpp -o helloWorld
// 注意:要加-g参数才能进行调试
  • 第三步:拷贝gdbserver到/opt目录下(此处是博主的nfs挂载目录)
  • 第四步:拷贝测试程序/opt目录下 可以现在开发板上执行这个程序,看是否可以执行成功。交叉编译命令示例:
代码语言:javascript
代码运行次数:0
运行
复制
arm-linux-gnueabihf-g++ -g helloWorld.cpp -o helloWorld
  • 第五步:gdbserver使用方法 格式:gdbserver 开发板ip地址:通信端口(自己设定) 测试程序 【命令行参数】 举例如下:
代码语言:javascript
代码运行次数:0
运行
复制
gdbserver 192.168.1.90:20 helloWorld
// 192.168.1.90是开发板地址
// 20是端口号
// helloWorld是测试程序

打印信息如下:

代码语言:javascript
代码运行次数:0
运行
复制
Process helloWorld created; pid = 1999
Listening on port 20
  • 第六步:Ubuntu下启动arm-linux-gnueabihf-gdb
代码语言:javascript
代码运行次数:0
运行
复制
arm-linux-gnueabihf-gdb helloWorld

注意:如果要直接这样使用arm-linux-gnueabihf-gdb,需要设置环境变量,示例如下:

代码语言:javascript
代码运行次数:0
运行
复制
export PATH=$PATH:/xxx/arm-gdb/bin

打印信息如下:

代码语言:javascript
代码运行次数:0
运行
复制
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打印信息如下:

代码语言:javascript
代码运行次数:0
运行
复制
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

开发板打印信息如下:

代码语言:javascript
代码运行次数:0
运行
复制
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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/129230.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 前言
  • GDB
    • 调试工具介绍
    • GDB调试教程
      • gcc调试相关编译选项
    • GDB交叉调试环境搭建
      • 下载地址
      • 编译过程
      • 使用方法
  • 总结
  • 链接地址
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档