GDB远程协议:如何分析数据包?

2024-02-17

I have:

  • 带有 eCos 操作系统的专有原型 ARM 板(基于 Cortex-M3)
  • 该板具有已编程的 RedBoot 引导加载程序
  • 串行线 (RS-232)
  • 适用于 ARM 的 GDB 调试器 (arm-eabi-gdb)
  • 主机操作系统是 Windows/Cygwin 和/或 Linux(实际上,并不重要)

Problem:GDB 调试器无法通过串行线连接到目标。

我想要的是:是嗅探GDB远程协议的数据包,以了解目标上的GDB存根是否存活并正在运行。

Details:RedBoot 可以选择将目标的控制权传递给内置的 GDB 存根。我知道 RedBoot 处于活动状态,我可以连接到它并通过串行线路向它发送命令。RedBoot 手册 http://ecos.sourceware.org/docs-latest/redboot/redboot-commands-and-examples.html说可以通过输入 $ 或 + 符号(实际上是 GDB 远程协议数据包的前缀)来切换到 GDB 存根。当我发送这些符号时,它似乎适用于终端死机。但我不确定 RedBoot 是否是使用 GDB 存根支持编译的(不要问我为什么:-))。

然后,当我尝试使用 GDB 调试器连接到开发板时,我得到以下图片(在 Windows 上):

(gdb) target remote COM3
Remote debugging using COM3
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Ignoring packet error, continuing...

端口正确,波特率也正确。实际上,如果我尝试对另一个未连接任何东西的串行端口执行相同的操作,我会得到相同的输出。

我想知道的是GDB存根是否发回任何东西?

直觉上我认为可能

set verbose on

会有所帮助,但 GDB 手册说它的效果非常有限,我的情况超出了它的范围。

也许可以使用启用调试日志记录的宏来编译 GDB 调试器?


我想知道的是GDB存根是否发回任何东西?

执行此操作(之前target remote):

(gdb) set debug remote 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDB远程协议:如何分析数据包? 的相关文章

  • 在剥离的 ELF 可执行文件中设置断点

    我有一个 ELF 32 位动态链接 剥离文件 我希望对其进行调试 尝试在某个地址设置断点时 出现一条消息 提示符号表未加载 我的问题是 当你说 ELF 文件是stripped究竟发生了什么 如何剥离 ELF 文件 是否可以以某种方式重建符号
  • 为什么我的核心文件没有被覆盖?

    在 Ubuntu 12 04 上 打开一个新的文本文件并写入 include
  • 想要持续观察并偶尔检查 gdb 中当前帧之外的变量

    假设我定义了一个名为var在主函数中 我为其设置了一个观察点 然后我输入另一个函数func 此时 观察点可能会被删除 这样我就无法访问该变量了 有什么方法可以让您随时随地保持观察点吗 另外 我知道我可以使用类似的语法print main v
  • 如何在 gdb 中使用 python 访问寄存器

    如何访问当前调试实例的cpu寄存器 例如 您可以从 gdb 调用printf 0x x eax and set eax b eax还有一种方法可以通过 gdb 提供的 python 支持来做到这一点吗 或者我应该创建一个可以像这样调用的 p
  • 当 std::cerr 上打印某些内容时设置 gdb 断点

    我使用 qt creator 作为 gdb 的 IDE 和前端 当对 std cerr 变量调用operator 如何在 std cerr 设置断点 你的问题没有意义 std cerr是一个全球性的variable 您只能在函数上设置断点
  • GDB - 如何打破“有些东西被写入cout”?

    我想设置一个断点 每次写入内容时都会触发stdout通过cout流 但我无法找到该断点的可能位置 我怎样才能在 gdb 中做到这一点 这是一种依赖于平台的方式 如果您在 x86 64 上并使用 gcc 进行构建 则写入 std cout 会
  • C++ 程序在执行 std::string 分配时总是崩溃

    我一直在尝试调试崩溃的应用程序中的崩溃 即断言 检测到 glibc free 无效指针 0x000000000070f0c0 当我尝试对字符串进行简单分配时 请注意 我正在使用 gcc 4 2 4 的 Linux 系统上进行编译 优化级别设
  • 在不附加 GDB 的情况下获取所有线程的堆栈跟踪

    有没有一种方法可以在不附加 GDB 的情况下打印所有线程的堆栈跟踪 或者是否有一个命令可以用作 gdb 批处理模式来打印所有线程的堆栈跟踪 elfutils https sourceware org elfutils 除其他实用程序外 还包
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • 在 MacOS 上从源代码构建 gdb

    我正在尝试在 Apple M1 MacBook 上安装交叉编译的 gdb 我下载了 gdb 11 1 并执行了以下操作 tmp src gdb 11 1 configure enable targets all make sudo make
  • fork 后调试子进程(配置了 follow-fork-mode 子进程)

    我正在开发一个应用程序 父级分叉子级来处理某些任务 我遇到一个问题 我已将 gdb 配置为 follow fork mode 子级 但在 fork 后 到达断点后 它发送 SIGTRAP 但子级以某种方式终止并向父级发送 SIGCHLD 我
  • gdb 输入文件中的十六进制值

    我正在尝试通过使用 gdb 内的 run 我可以成功地溢出程序 但在将十六进制值附加到字符串时遇到问题 我尝试过引用 将 mem addr 的值转换为 ascii 以及各种转义尝试 但没有成功 输入文件示例 AAAA x42 在上面的示例中
  • GDB 函数参数上的条件中断

    我想在函数参数大于某个值时设置断点 下面的虚拟代码 int main void uint64 t num 123456 uint64 t x 847534 uint64 t other num x x num other stuff her
  • dprintf 与 break + 命令 + continue 之间有什么区别?

    例如 dprintf main hello n run 生成与以下内容相同的输出 break main commands silent printf hello n continue end run 使用是否有显着的优势dprintf ov
  • 在 GDB 中显示结构体值

    在 GDB 中 给定一个指向结构体的变量 print将显示原始指针值并x将显示指向的原始字节 有什么方法可以显示指向该结构的数据 即字段及其值的列表 print variable 如果这样做 它将在 GDB 中显示该变量的值 您还可以选择显
  • gdb 通过指向错误的代码行显示不正确的回溯

    我们可以通过在源代码中包含多个中止调用 用非常简单的示例重现此问题 在下面的示例代码中 我们在不同条件下总共有四个中止调用 但是当我们使用优化标志 O3 进行编译时 我们只能看到一个中止调用的调试信息 因此 在这四个中止调用中发生崩溃时 g
  • 哪个信号被传递到信号处理程序中死锁的进程

    我有一个来自调用信号处理程序后死锁的进程的核心转储 如何确定传送了哪个信号以及是谁发送的 GDB 为接收信号的线程生成的回溯如下 信号处理程序在第 15 帧中被调用 gdb bt 0 0x00007fa9c204654b in sys fu
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • GDB错误:“进程记录:当前架构不支持记录功能”

    我正在尝试在 GDB 中进行反向执行 特别是target record按照说明在 gdb 中运行我的程序后here https stackoverflow com questions 1206872 go to previous line
  • 观察点固定地址

    对于我当前的嵌入式应用程序 我尝试将 GDB 观察点放在固定的内存地址处 例如 我的应用程序更新以下地址 0x10793ad0 为了确定代码的哪一部分破坏了值 我尝试了 watch 0x10793ad0 即使 GDB 在此之后不会打印任何错

随机推荐