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

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

    关注

    5186

    文章

    20159

    浏览量

    328985
  • 寄存器
    +关注

    关注

    31

    文章

    5590

    浏览量

    129092
  • gdb
    gdb
    +关注

    关注

    0

    文章

    61

    浏览量

    13816
  • DEBUG
    +关注

    关注

    3

    文章

    95

    浏览量

    21259

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    进迭时空 debug upstream | 取之于开源,贡献于开源

    。Debug相关软件项目概览RISC-V调试所涉及的核心开源软件主要包括GDB和OpenOCD。GDB(GNUDebugger)是GNU项目下的功能强大的源码级调
    的头像 发表于 11-17 09:33 5097次阅读
    进迭时空 debug upstream | 取之于开源,贡献于开源

    Xilinx FPGA串行通信协议介绍

    Xilinx FPGA因其高性能和低延迟,常用于串行通信接口设计。本文深入分析了Aurora、PCI Express和Serial RapidIO这三种在Xilinx系统设计中关键的串行通信协议。介绍了它们的特性、优势和应用场景
    的头像 发表于 11-14 15:02 1956次阅读
    Xilinx FPGA<b class='flag-5'>串行</b>通信<b class='flag-5'>协议</b>介绍

    ElfBoard技术贴|如何在【RK3588】ELF 2开发板进行GDB调试

    GDB(GNU Project Debugger)是在Linux环境下功能全面的调试工具。它提供了一系列强大的调试功能,包括设置断点、单步执行、打印与观察变量、查看寄存器及堆栈信息等。在Linux软件开发的实践中,GDB被视为调试C及C++程序的核心工具,广泛用于帮助开发
    的头像 发表于 11-11 13:47 4940次阅读
    ElfBoard技术贴|如何在【RK3588】ELF 2开发板进行<b class='flag-5'>GDB</b>调试

    蜂鸟的GDB调试时无法在断点处停止是什么原因?

    各位大佬们,我们使用GDB调试程序的时候,在main函数打上断点,然后在gdb中continue,程序并没有在main函数入口处停下?请问大佬知道原因吗?谢谢~
    发表于 11-07 06:15

    RV-STAR无法连接到GDB server的解决办法

    demo跑一跑,现在卡在了“下载程序到开发板”这一步,connect to gdb server失败,使用的是板载调试器。请问这是什么情况? 具体信息如下: 1. 我已经安装
    发表于 11-07 06:15

    求助,关于RT-Thread Studio使用ST-Linlk调试遇到的问题求解

    /platform/ST-LINK/config.txt STMicroelectronics ST-LINK GDB server. Version 5.2.3 Copyright (c) 2019
    发表于 09-29 06:36

    PLC串口自由协议通信概述

    串口自由协议通信是一种灵活的串行通信方式。在该模式下,开发者无需遵循特定标准协议,可根据实际需求自由定义数据格式与交互规则。
    的头像 发表于 08-07 09:15 1860次阅读
    PLC串口自由<b class='flag-5'>协议</b>通信<b class='flag-5'>概述</b>

    国产!全志T113-i 双核Cortex-A7@1.2GHz 工业开发板—GDB程序调试方法说明

    (Linux) GDB工具是GNU项目调试器,基于命令行使用。和其他的调试器一样,可使用GDB工具单步运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等,它是UNIX/LINUX操作系统下强大的程序调试工具。GDB支持多
    的头像 发表于 08-05 15:33 344次阅读
    国产!全志T113-i 双核Cortex-A7@1.2GHz 工业开发板—<b class='flag-5'>GDB</b>程序调试方法说明

    PSoC 6 BLE PIONEER KIT烧录Bluetooth_LE_Battery_Server的demo进行调试时,无法成功烧录的原因?

    我在使用PSoC 6 BLE PIONEER KIT调试时,尝试烧录Bluetooth_LE_Battery_Server的demo进行调试时,发现无法成功烧录,并提示如下信息,请问下是什么原因呢
    发表于 07-01 07:37

    CM7能成功调试但CM4始终报\"Failed to read ROM table via AP 3\"错误,怎么解决?

    sequence: Failed to start GDB server Failed to start GDB server ST-Link设备进行初始化时出错。 原因:(255)
    发表于 06-06 08:04

    使用STM32CubeIDE对STM32H7进行开发和调试,CM4始终报\"Failed to read ROM table via AP 3\"错误怎么解决?

    sequence: Failed to start GDB server Failed to start GDB server ST-Link设备进行初始化时出错。 原因:(255)
    发表于 05-14 06:20

    STM32H7双核调试,CM7能成功调试但CM4始终报\"Failed to read ROM table via AP 3\"错误是怎么回事?

    sequence: Failed to start GDB server Failed to start GDB server ST-Link设备进行初始化时出错。 原因:(255)
    发表于 04-27 06:40

    STM32CubeIDE无法启动正常调试是哪里出了问题?

    STM32CubeIDE始终正常使用中,昨日系统升级为 macOS Sequoia 版本,启动调试出现错误提示,重新安装应用程序及 st-stlink-server 驱动,仍提示同样错误。 目前
    发表于 03-14 16:30

    CubeIDE下载程序时报错Target no device found,但是ST-LinkUpgrade可以识别到且可以更新固件,为什么?

    STMicroelectronics ST-LINK GDB server. Version 7.8.0 Copyright (c) 2024, STMicroelectronics. All
    发表于 03-14 07:21

    为什么会报错Could not determine GDB version using command: arm-none-eabi-gdb --version?

    我已经重启电脑了,没用; 重装软件没有,没有; 将ST_link_server卸载重装也没有; 将arm-none-eabi-gdb加入windows 11系统环境变量,也没用; 将软件的GDB
    发表于 03-12 08:08