0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GDB串行协议概述 GDB Server的作用

嵌入式小作坊 来源:51cto博客 作者:赵梦茹2012 2021-08-10 10:10 次阅读

1.概述做嵌入式开发时,很多时候都会使用到GDB,从底层去理解GDB的调试过程,将更加容易的理解调试的过程。

在做嵌入式开发调试时,可理解为两个部分

嵌入式系统平台,启动一个debug stub

宿主机,启动gdb

两个平台之间通过串行数据总线连接起来。

2.GDB Server的作用当PC机启动GDB时,需要和GDB Server建立一定的通信连接,由GDB Server解析具体的逻辑并执行。

所以GDB Server可以是一个openocd,或者JTAG等等实际的外设模块,和目标板子进行连接后,可以调试芯片。它本质上是一个解析GDB协议的模块,或者是一段后台的程序。

相应GDB的请求

当gdb和嵌入式平台进行通信的时候,会发一系列的请求,例如:

读写内存

读写寄存器

设置或者清除断点

提供调试Trap

GDB断点的Trap

无效指令的Trap

系统错误的Trap

同步传输CPU的状态和到远程的GDB中。

3.一个标准的gdb的调试过程一般的正常使用编译工具链中都会有gdb的工具,就拿riscv的来说,用riscv-nuclei-elf-gdb.exe去连接qemu上的gdb stub时,采用的是tcp协议。

当qemu去启动gdb server的时候。

qemu-system-riscv32.exe -M gd32vf103v_rvstar -cpu -nographic -s -S

后面的-s表示启动gdb server。而-S则表示绑定在TCP端口的1234端口号上。

995199c4-f86c-11eb-9bcf-12bb97331649.png

从操作上是这个流程,那么底层的数据传送又是怎样的流程呢?

4.GDB 远程串行协议解析一个标准的GDB串行协议的格式如下

$packet-data#checksum

其中的消息是通过ASCII码进行传输,以$开始,以#结束。最后的checksum是命令的校验和。

上面就是通过Wireshark监听到的协议数据。

GDB与GDB server进行通信的时候,采用收发形式进行,必然会有下面的通信过程

发送:

$packet-data#checksum

回复

+

每次都需要回复一个+,表示收到数据。

当没有接受到数据,或者超时时,需要进行重传操作。

下面就是一个实际的通信过程。

9a068f0a-f86c-11eb-9bcf-12bb97331649.png

gdb 和 target之间的通信一直会采用收发对称的数据格式

比如写内存

gdb会调用set 0x4015cc = 0xc320。

那么gdb底层的通信是

$M4015CC,2:C320#6d

目标机收到数据后,会首先返回

+

接着返回状态

$OK#9a

这样,一个通过gdb操作内存的中的数据的通信协议就完成了。

由于GDB的指令非常多,这里就不列举了,但是基本的原理和格式都差别不大。

比如单步调试的指令

step:

[gdb] $s#73

向下执行的指令

Continue

[gdb] $c#63

控制台输出

Console Output

[target] $o48656c6c6f2c20776f726c64210a#55

这样可以在gdb控制台上输出hello,world!的命令。

关于命令的格式可以查看官方文档

https://sourceware.org/gdb/onlinedocs/gdb/Stop-Reply-Packets.html

但是举出一些基本的规律

5.小结用采用GDB进行调试的过程,底层的传输原理,采用的是非常简单的字符串的格式,这GDB将这些命令发给硬件调试器或者板子,通过将这些命令解析后,执行具体的逻辑,就可以正常的控制芯片中程序的行为了。这就是GDB的串行协议原理。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18281

    浏览量

    288387
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117715
  • gdb
    gdb
    +关注

    关注

    0

    文章

    60

    浏览量

    13160
  • DEBUG
    +关注

    关注

    3

    文章

    83

    浏览量

    19444

原文标题:GDB串行协议概述

文章出处:【微信号:gh_390c588e521e,微信公众号:嵌入式小作坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    stlink gdb server遇到bkpt断点时,无法跳过怎么处理?

    stlink gdb server 遇到 bkpt 断点时,无法跳过
    发表于 03-26 06:43

    EZ USB Suite支持的Jlink GDB Server版本有没有要求?

    我想问一下,这个EZ USB Suite支持的Jlink GDB Server的版本有没有要求? 我在segger官方找的jlink版本暂时只要V644a和V644b 这个问题该如何解决?
    发表于 02-29 07:44

    arm三个寄存器在gdb调试时的作用

    arm三个寄存器在gdb调试时作用  ARM是一种广泛使用的微处理器架构,它广泛应用于移动设备、嵌入式系统和其他高性能计算设备。当我们在使用gdb(GNU调试器)调试ARM程序时,了解和理解三个重要
    的头像 发表于 01-31 10:44 208次阅读

    如何使用linux下gdb来调试python程序

    如何使用linux下gdb来调试python程序  在Linux下,可以使用GDB(GNU调试器)来调试Python程序。GDB是一个强大的调试工具,可以帮助开发者诊断和修复程序中的错误。在本文
    的头像 发表于 01-31 10:41 451次阅读

    如何使用GDB调试工具

    在对应程序目录中使用下面的命令 gdb test 2、调试已经开始运行的程序进程 调试已经开始运行的程序进程,首先先用top命令查看运行的程序进程的pid如下: 比如我要加载的程序
    的头像 发表于 11-09 17:17 332次阅读
    如何使用<b class='flag-5'>GDB</b>调试工具

    GDB调试工具的原理

    一、GDB调试工具的原理 1.1 未执行进程调试 启用gdb调试运行gdb ./test的时候,在操作系统里发生了很多复杂的事情,系统首先会启动gdb进程,这个进程会调用系统函数for
    的头像 发表于 11-09 17:04 318次阅读
    <b class='flag-5'>GDB</b>调试工具的原理

    什么是GDBGDB的基本功能和命令总结

    GDB是嵌入式软件工程师调试用的比较多的一种工具,今天就来简单分享一下GDB相关命令。
    的头像 发表于 11-07 09:15 1633次阅读

    GDB调试里怎么设置断点

    本篇讲解使用GDB调试Linux应用程序,以下以 hellowld.c 为例介绍 GDB 的调试入门: 设置断点   disable                 # 禁用所有断点
    的头像 发表于 10-04 16:10 564次阅读

    Linux系统中如何进行GDB调试

    -g 启动调试 $ gdb helloWorldGNU gdb (GDB) Red Hat Enterprise Linux 8.2-12.el8 Copyright (C) 2018 Free
    的头像 发表于 10-04 15:52 214次阅读

    Linux系统GDB单步调试

    单步调试    gdb helloworld                         (gdb) break helloworld.c:18            (gdb) run
    的头像 发表于 09-26 16:22 313次阅读

    GDB调试如何进行变量查看

    变量查看 变量查看: 最常见的使用便是使用print(可简写为p)打印变量内容。 以上述程序为例: gdb helloworld break helloworld.c:17
    的头像 发表于 09-26 16:17 838次阅读

    在板子中调试GDB的方法

    系统,比如 ubuntu、centos 等,我们可以直接运行 gdb 来调试程序。但是嵌入式中芯片性能一般比较弱,所以直接在嵌入式系统中运行 gdb 不太现实(性能强大的嵌入式芯片可以这么做)。嵌入式系统中一般在 PC 端运行 gdb
    的头像 发表于 07-27 16:37 756次阅读
    在板子中调试<b class='flag-5'>GDB</b>的方法

    在ubuntu中调试GDB

    的 gcc 编译器即可,注意需要加 -g 选项,才能使用 gdb 调试 arm-linux-gnueabihf-gcc gdbtest .c -o gdbtest -g //编译测试程序,注意-g 选项
    的头像 发表于 07-27 16:31 640次阅读
    在ubuntu中调试<b class='flag-5'>GDB</b>

    嵌入式Linux GDB是什么

    GDB 调试工具,通过 GDB 来调试嵌入式 C 程序。 GDB 简介 gdb 工具是 GNU 项目调试器,基于命令行。和其他的调试器一样,我们可以使用
    的头像 发表于 07-27 16:29 452次阅读
    嵌入式Linux <b class='flag-5'>GDB</b>是什么

    使用GDB调试Linux应用程序

    本篇讲解使用GDB调试Linux应用程序,以下以 `hellowld.c` 为例介绍 GDB 的调试入门。
    发表于 06-27 15:48 337次阅读