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

目录目录前言GDB调试工具介绍GDB调试教程gcc调试相关编译选项GDB交叉调试环境搭建下载地址编译过程总结链接地址前言项目遇到一个问题,就是程序在Ubuntu下运行的时候是正常的,至少大部分时候运行是正常的,但是移到开发板上,就会出现段错误。这时候突然想到了GDB,从来都没有接触过调试工具,以前的调试都是使用printf直接打印的方式!!!

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

目录

前言

项目遇到一个问题,就是程序在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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL timestampdiff()函数返回两个时间之间的差值「建议收藏」

    MySQL timestampdiff()函数返回两个时间之间的差值「建议收藏」TIMESTAMPDIFF(unit,begin,end);TIMESTAMPDIFF函数返回begin-end的结果,其中begin和end是DATE或DATETIME表达式。TIMESTAMPDIFF函数允许其参数具有混合类型,例如,begin是DATE值,end可以是DATETIME值。如果使用DATE值,则TIMESTAMPDIFF函数将其视为时间部分为“00:00:00”的DATETIME值。unit参数是确定(end-begin)的结果的单位,表示为整数。以下是有效单位:MI

    2022年5月6日
    219
  • Pycharm 2021年激活码【注册码】

    Pycharm 2021年激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    75
  • python时间序列分析代码_时间序列分析VAR实验报告

    python时间序列分析代码_时间序列分析VAR实验报告题记:毕业一年多天天coding,好久没写paper了。在这动荡的日子里,也希望写点东西让自己静一静。恰好前段时间用python做了一点时间序列方面的东西,有一丁点心得体会想和大家分享下。在此也要特别

    2022年8月1日
    5
  • 狂神说java系列笔记下载(跟狂神相似的小说)

    狂神说Vue笔记​ 想要成为真正的“互联网Java全栈工程师”还有很长的一段路要走,其中前端是绕不开的一门必修课。本阶段课程的主要目的就是带领Java后台程序员认识前端、了解前端、掌握前端,为实现成为“互联网Java全栈工程师”再向前迈进一步。一、前端核心分析1.1、概述Soc原则:关注点分离原则Vue的核心库只关注视图层,方便与第三方库或既有项目整合。HTML+CSS+JS:视图:给用户看,刷新后台给的数据网络通信:axios页面跳转:vue-router状态管

    2022年4月18日
    42
  • c++怎么把小写字母变成大写字母_int能直接转化为char类型吗

    c++怎么把小写字母变成大写字母_int能直接转化为char类型吗1、输出uint32_tuint32_ta=888;printf(“ais%ld”,a);2、输出uint64_tuint64_tb=888;printf(“bis%lu”,b);printf(“bis%lld”,b);3、输出16进制intc=16;printf(“cis0x%08x”,c)

    2025年9月29日
    4
  • 如何利用js生成二维码_前端生成二维码

    如何利用js生成二维码_前端生成二维码问题来源最近在做一个项目,有这么个需求,通过生成二维码来实现网页的分享。问题分析脑海的第一反应,当然是用js来实现,自己手写?当然不是。解决方案使用QRCode.js。QRCode.js是一个用于生成二维码的JavaScript库。主要是通过获取DOM的标签,再通过HTML5Canvas绘制而成,不依赖任何库。QRCode.js:使用JavaScript生成二维码代码编写<!DOCTYPEhtml><htmllang=”en.

    2022年10月18日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号