前  言

关于GDB工具

GDB工具是GNU项目调试器,基于命令行使用。和其他的调试器一样,可使用GDB工具单步运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等,它是UNIX/LINUX操作系统下强大的程序调试工具。GDB支持多种语言,包括Ada、汇编、C/C++、D、Fortran、GO、Objective-C、OpenCL、Modula-2、Pascal和Rust。

GDB具有一种“远程”模式,此种模式多半是在为嵌入式系统进行调试时使用,远程操作指的是:GDB在一部机器内运行,而要进行调试的程序是在另一部机器上运行,支持TCP/IP协议传输的各种网络,在TCP/IP网络及协议上再加搭传输GDB专有的调试操作通信协议,如此便能进行远程调试。

创龙科技已基于IMX8、ZYNQ、AM5728、AM5708、AM437x、AM335x、T3/A40i等平台提供了GDB程序调试方法说明。本文档主要演示基于TLIMX8-EVM评估板的GDB程序调试方法说明。如需其他平台相关资料,请与我们联系。

开发环境

Windows开发环境:Windows 7 64bit、Windows 10 64bit

虚拟机:VMware15.1.0

Linux开发环境:Ubuntu18.04.4 64bit

U-Boot:U-Boot-2020.04

Kernel:Linux-5.4.70

Linux SDK:5.4.70_2.3.0

硬件平台

TLIMX8-EVM评估板(NXP i.MX 8M Mini)

图 2 TLIMX8-EVM评估板

1 调试环境搭建

确保已搭建好NXP i.MX 8M Mini SDK开发环境。若未完成搭建,请先参照产品资料用户手册目录下的Linux开发环境搭建手册,完成SDK开发包的安装和配置。

然后进入SDK安装目录,并执行如下命令加载SDK环境变量。

Host# cd /home/tronlong/SDK/

Host# source /home/tronlong/SDK/environment-setup-aarch64-poky-linux

图 1

如环境搭建正常,执行如下命令可查看交叉编译工具版本。

Host# aarch64-poky-linux-gcc -v

图 2

2 演示程序创建与编译

执行如下命令,新建一个GDB调试演示程序。

Host# mkdir test

Host# cd test/

Host# gedit test.c

图 3

在tese.c文件中输入如下代码。

#include <stdio.h>

void show() {

printf("show\n");

}

int main(int argc, char *argv[])

{

int arr[4] = {1, 2, 3, 4};

int i = 0;

for (i = 0; i < 4; i++) {

printf("arr[%d]: %d\n", i, arr[i]);

}

}

点击Save,保存退出。

图 4

执行如下命令,修改test文件夹的权限。

Host# cd ..

Host# sudo chmod -R 777 test/

图 5

执行如下命令加载SDK环境变量,并进行程序编译。

备注:编译时需添加-g参数,编译过程中的警告可忽略。

编译完成后,将在test文件夹目录下生成可执行文件test。

Host# cd test/

Host# source /home/tronlong/SDK/environment-setup-aarch64-poky-linux

Host# $CC -O0 -g test.c -o test

图 6

评估板与PC机连接至同一个路由器后进行上电,执行如下命令通过网络传输的形式,将编译后的可执行文件test拷贝至评估板。

Target# ifconfig //查看评估板的IP地址

图 7

Host# scp test root@192.168.0.17:/home/root //将可执行文件拷贝至评估板“/home/root/”目录下,密码为空即可

图 8

Target# ls -l //查看评估板接收的可执行文件

图 9

3 调试程序运行

执行如下命令,确认虚拟机的IP地址。

Host# ifconfig

图 10

在评估板文件系统test文件所在路径下,执行如下命令运行gdbserver程序,开启监听。

备注:192.168.0.83为虚拟机的IP地址;1234为连接的端口号(自行设置);test为将要进行调试的程序。如为Qt界面程序,则需在后面增加-qws参数。

Target# gdbserver 192.168.0.83:1234 test

图 11

在PC机test文件所在路径下,执行如下命令加载SDK环境变量,并运行GDB调试程序。

Host# source /home/tronlong/SDK/environment-setup-aarch64-poky-linux

Host# aarch64-poky-linux-gdb test //aarch64-poky-linux-gdb为SDK交叉编译环境下的GDB交叉编译工具链,test为将要进行调试的程序

图 12

执行如下命令,连接评估板。192.168.0.17为评估板的IP地址,请以实际情况为准。

(gdb) target remote 192.168.0.17:1234

图 13

同时,串口调试终端显示连接成功的相关信息。

图 14

4 程序调试

本章节主要演示GDB调试的几个常用命令的使用方法。

4.1 list命令

用于列出源码,简写:l。

图 15

4.2 break命令

用于设置断点,简写:b。

图 16

4.3 info breakpoints命令

用于显示断点的状态,简写:info b。

图 17

4.4 continue命令

用于恢复程序执行,简写:c。此命令使GDB恢复程序的执行,直至断点触发或程序结束。

图 18

以上调试过程在第二个断点中,每输入一次c命令,将会依次打印arr数组的元素值,然后程序执行结束。同时,串口调试终端打印相关信息。

图 19

4.5 print命令

用于打印变量或者变量地址,简写:p。

图 20

以上调试过程在每处断点中,使用print命令打印变量i的值。同时,串口调试终端打印相关信息。

图 21

4.6 quit命令

退出GDB模式,简写:q。当程序调试完成后,使用quit命令退出GDB调试。

图 22

同时,串口调试终端打印相关信息。

图 23

ARM平台如何玩转GDB远程调试?的更多相关文章

  1. gdb 远程调试android进程 -转

    什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停 ...

  2. gdb 远程调试android进程

    原文:http://blog.csdn.net/xinfuqizao/article/details/7955346?utm_source=tuicool 什么是gdb 它是gnu组织开发的一个强大的 ...

  3. Gdb远程调试Linux内核遇到的Bug

    知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/gdb-bug 本博客同步在http://www.cn ...

  4. DM368 arm板GDB远程调试

    参考: http://www.erchashu.com/wiki/eclipse-cdt-gdb-arm-app-cross-debug 远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通 ...

  5. 在海思芯片上使用GDB远程调试

    1 前言 使用海思平台上(编译工具链:arm-himix200-linux)交叉编译 GDB 工具(使用版本8.2,之前用过10.2的版本,在编译 gdbserver 遇到编译出错的问题,因为关联了其 ...

  6. gdb 远程调试 android native 程序

    ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 先看一张原理图: 我是 Linux 和 Android 双料 0 基础,目前对 gdb 了解的很浅显.(注意 ...

  7. ida GDB 远程调试

    在看雪上回答的问题,有人问在WinDbg下断KiDebugRoutine或者KdEnterDebugger函数会引发蓝屏!因为是在调试Windows的内核调试引擎,我给出的解决办法是用不依赖Windo ...

  8. 用GDB远程调试android native程序

    上次写了几个native程序,想着如何调试,经过一阵子搜索和测试,终于完成了.有几个关键点: 1 gdb和gdbserver 因为这两个需要配套,建议使用同一个ndk下面的gdb和gdbserver ...

  9. 源码级别gdb远程调试(实现OS简单内核)

    最近在学着编写一个操作系统的简单内核,需要debug工具,我们这里使用gdb来进行调试,由于虚拟机运行和本机是两个部分,所以使用 gdb 的远程调试技术,这里对 gdb 常见调试以及远程调试方式做一个 ...

随机推荐

  1. Git在IDEA中的日常使用

    1.Git介绍Git对于做开发的小伙伴并不陌生,Git是现在比较流行的版本控制工具.Git的仓库分为本地仓库和远程仓库,当代码开发完成后,先提交(commit)到本地仓库,再推送(push)到远程仓库 ...

  2. 分布式文件系统FastDFS搭建实操

    转载---------佳先森--- 一.什么是文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节 ...

  3. 【spring】spring 核心注解

    注解具体分类如下: 1.模式注解 @Repository             数据仓储模式注解 @Component            通用组件模式注解 @Service            ...

  4. 集合的打印、列表List、迭代器Iterators

    集合的打印 必须使用 Arrays.toString() 来生成数组的可打印形式. 但是打印集合无需任何帮助. /** * 集合的打印 * @author myf */ public class Pr ...

  5. 我对数据库关系代数中减法sql实现的思考:mysql脚本

    一.创建数据库,创建表结构 CREATE DATABASE Test_sub DEFAULT CHARACTER SET utf8; USE Test_sub; CREATE TABLE studen ...

  6. Struts2之国际化

    时间:2017-1-11 11:12 --国际化Struts2已经对国际化进行了封装,我们只需要根据其提供的API进行访问即可.要使用国际化的Action必须继承ActionSupport.1.什么是 ...

  7. Java 中 常用API概述之 Math, Object, String,StringBuffer类,Arrays,Integer类

    Math Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数. 与StrictMath类的一些数字方法不同,Math类的StrictMath所有Math都没有定义为返回比特位相同 ...

  8. 温故知新:老铁,WeakReference了解一下?

    本文供稿--大师兄 弱引用是个什么鬼?大白话说就是不那么强的引用(哈哈,纯属玩笑,实际可不是这样滴),那强引用又是个什么鬼?他们有什么用处?问题有点迷,君阅完这篇文章后或许你心中就有答案了-- 什么是 ...

  9. Error establishing a database connection!

    后来发现在 wp-config.php 有个 debug 的参数,打开这个参数,修改为: define('WP_DEBUG','true'); 修改这个后,非常不错,报了很多错,一堆....   使用 ...

  10. 记录Mac下使用Charles抓包

    抓包 简述 在网络应用如后端系统,app,小程序等的开发过程中,免不了接口可能会报错,但是一般在app中或者小程序中没有便捷的console控制台,而且线上环境也不会开启调试模式,所以想看一下接口的响 ...