gdbserver 指南

news2024/11/19 13:37:37

文章目录

  • 1. 前言
  • 2. gdbserver 远程调试
    • 2.1 准备工作
      • 2.1.1 准备 `客户端 gdb` 程序
      • 2.1.2 准备 `服务端 gdbserver`
      • 2.1.3 准备 被调试程序
    • 2.2 调试
      • 2.2.1 通过网络远程调试
        • 2.2.1.1 通过 gdbserver 直接启动程序调试
        • 2.2.1.2 通过 gdbserver 挂接到已运行程序调试
      • 2.2.2 通过串口远程调试
        • 2.2.2.1 通过 gdbserver 直接启动程序调试
        • 2.2.2.2 通过 gdbserver 挂接到已运行程序调试
  • 3. 参考资料

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. gdbserver 远程调试

GDB 远程调试同时需要 服务端 gdbserver客户端 gdb 两个程序。本文以 ARM32 嵌入式设备内程序的调试为例,对 GDB 远程调试方法进行说明。

先对 服务端 gdbserver客户端 gdb 连接拓扑做一个梗概描绘:
在这里插入图片描述

2.1 准备工作

2.1.1 准备 客户端 gdb 程序

客户端 gdb 通过和 服务端 gdbserver 的交互,对运行于目标机器的程序进行调试。笔者使用 Ubuntu 系统作为调试客户端的宿主机,即 客户端 gdb 运行于 Ubuntu 下。

笔者测试使用的嵌入式设备 SDK 的交叉编译工具链已经包含了 客户端 gdb 程序,无需额外准备:

$ arm-linux-gnueabihf-gdb --version
GNU gdb (Linaro GDB 2016.02) 7.10.1.20160210-cvs
Copyright (C) 2015 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=x86_64-unknown-linux-gnu --target=arm-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://bugs.launchpad.net/gcc-linaro>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".

如果读者的交叉编译工具链没有包含 gdb,在 Ubuntu 下可通过命令安装适用于多架构平台的 gdb 客户端程序

sudo apt-get install gdb-multiarch

2.1.2 准备 服务端 gdbserver

gdbserver 运行于被调试的目标机器,在本文中目标机器指 ARM 嵌入式设备。笔者是通过 buildroot 构建的 gdbserver,不想使用 buildroot 的读者,可自行查阅相关资料进行 gdbserver 的构建。

构建好 gdbserver 后,将其拷贝到目标机器。笔者是将其拷贝到目标机器/usr/bin 目录,这样可以不用指定路径运行。

2.1.3 准备 被调试程序

/* test.c */

#include <unistd.h>

int main(void)
{
	while (1)
		sleep(5);

	return 0;
}

编译,然后将测试程序 test 拷贝到目标机器

$ arm-linux-gnueabihf-gcc -o test test.c

2.2 调试

2.2.1 通过网络远程调试

在这里插入图片描述

2.2.1.1 通过 gdbserver 直接启动程序调试

首先,在目标机器(本文是指 ARM32 嵌入式设备)上运行命令:

# gdbserver :2345 test 
Process test created; pid = 440
Listening on port 2345

然后,在调试器客户端机器(本文是指 Ubuntu)上运行下列命令:

$ arm-linux-gnueabihf-gdb
GNU gdb (Linaro GDB 2016.02) 7.10.1.20160210-cvs
Copyright (C) 2015 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=x86_64-unknown-linux-gnu --target=arm-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://bugs.launchpad.net/gcc-linaro>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) target remote 192.168.3.8:2345
Remote debugging using 192.168.3.8:2345
Reading /root/test from remote target...
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
Reading /root/test from remote target...
Reading symbols from target:/root/test...done.
Reading /lib/ld-linux-armhf.so.3 from remote target...
Reading /lib/ld-linux-armhf.so.3 from remote target...
Reading symbols from target:/lib/ld-linux-armhf.so.3...(no debugging symbols found)...done.
0xb6fd7a00 in _start () from target:/lib/ld-linux-armhf.so.3
(gdb)

客户端宿主机(本文指 Ubuntu)启动 arm-linux-gnueabihf-gdb 后,通过命令 target remote 192.168.3.8:2345 连接到目标机器。其中,192.168.3.8 是目标机器的的 IP。

这时候,目标机器(本文是指 ARM 嵌入设备)会输出 gdb 客户端连接的消息 Remote debugging from host 192.168.3.168

# gdbserver :2345 test 
Process test created; pid = 440
Listening on port 2345
Remote debugging from host 192.168.3.168

到此,就可以通过 gdb 在客户端宿主机(本文指 Ubuntu),调试目标机器(本文是指 ARM 嵌入设备)的 test 程序了。

2.2.1.2 通过 gdbserver 挂接到已运行程序调试

如果 test 已经运行,可以通过 attach 方式启动 gdbserver,挂接到 test 程序进行调试。

先在目标机器(本文是指 ARM32 嵌入式设备)上启动 test 程序,放入后台运行:

# ./test &
# ps -ef | grep -v grep | grep "test"
  445 root     ./test

gdbserver 挂接到 test 进程:

# gdbserver --attach :2345 445
Attached; pid = 445
Listening on port 2345

客户端宿主机(本文指 Ubuntu)启动 arm-linux-gnueabihf-gdb,然后通过命令 target remote 192.168.3.8:2345 连接到目标机器调试程序:

$ arm-linux-gnueabihf-gdb
GNU gdb (Linaro GDB 2016.02) 7.10.1.20160210-cvs
Copyright (C) 2015 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=x86_64-unknown-linux-gnu --target=arm-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://bugs.launchpad.net/gcc-linaro>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) target remote 192.168.3.8:2345
Remote debugging using 192.168.3.8:2345
Reading /root/test from remote target...
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
Reading /root/test from remote target...
Reading symbols from target:/root/test...done.
Reading /lib/libc.so.6 from remote target...
Reading /lib/ld-linux-armhf.so.3 from remote target...
Reading symbols from target:/lib/libc.so.6...(no debugging symbols found)...done.
Reading symbols from target:/lib/ld-linux-armhf.so.3...(no debugging symbols found)...done.
Reading /lib/ld-linux-armhf.so.3 from remote target...
0xb6e9e134 in nanosleep () from target:/lib/libc.so.6
(gdb)

2.2.2 通过串口远程调试

在这里插入图片描述

2.2.2.1 通过 gdbserver 直接启动程序调试

目标机运行命令:

gdbserver /dev/ttyS1 test

其中,/dev/ttyS1目标机上和客户端宿主机连接的串口设备对象。

客户端宿主机运行命令:

$ arm-linux-gnueabihf-gdb
[......]
(gdb) target remote /dev/ttyUSB0

其中,/dev/ttyUSB0客户端宿主机上和目标机连接的串口设备对象。

2.2.2.2 通过 gdbserver 挂接到已运行程序调试

目标机上依次运行下列命令:

# test &
# ps -ef | grep -v grep | grep "test" ## 查询 test 进程 PID
# gdbserver --attach /dev/ttyS1 445

客户端宿主机运行命令:

$ arm-linux-gnueabihf-gdb
[......]
(gdb) target remote /dev/ttyUSB0

3. 参考资料

[1] Using the gdbserver program
[2] gdbserver(1) — Linux manual page

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1890528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浏览器自动填充登录用户名和密码,如何清除

文章目录 刷新网页的时候浏览器会自动填充用户名和密码刷新之后效果图解决方案完整的login.vue代码核心代码原理(添加 readonly 和监听 focus 事件) 刷新网页的时候浏览器会自动填充用户名和密码 刷新之后效果图 解决方案 完整的login.vue代码 <template><div class…

linux系统主机查看系统日志(可查看被执行命令和远程登录等)

linux系统中&#xff0c;在/var/log/messages日志文件中&#xff0c;会记录显示系统所有运行的相关日志 如果被黑客攻击进来&#xff0c;可以在此日志做排查&#xff01; 例如&#xff1a;记录远程登录日志 记录执行命令日志

问题集锦2

1.商品详情和切换数据&#xff0c;要做好来源区分 今天&#xff0c;商品切换 我可以不可以&#xff0c;不选择传递空&#xff0c;导致if没有走到 2.查价格&#xff0c;用用户传递的

Rocky Linux 9 系统OpenSSH CVE-2024-6387 漏洞修复

Rocky Linux 9系统 OpenSSH CVE-2024-6387 漏洞修复 1、漏洞修复2、修复思路3、修复方案3.1、方案一3.2、方案二 4、总结5、参考 1、漏洞修复 CVE-2024-6387&#xff1a;regreSSHion&#xff1a;OpenSSH 服务器中的远程代码执行&#xff08;RCE&#xff09;&#xff0c;至少在…

如何选择适合自己的虚拟化技术?

虚拟化技术已成为现代数据中心和云计算环境的核心组成部分。本文将帮助您了解如何选择适合自己需求的虚拟化技术&#xff0c;以实现更高的效率、资源利用率和灵活性。 理解虚拟化技术 首先&#xff0c;让我们了解虚拟化技术的基本概念。虚拟化允许将一个物理服务器划分为多个虚…

机器人控制系列教程之Delta机器人奇异性分析

并联机器人奇异性 对于并联机构的奇异性问题比串联机构复杂。某些位形机构会失去自由度&#xff0c;某些位形机构会出现不可控自由度。其分析方法主要有几何法和代数法&#xff0c; 几何法&#xff1a; 即根据高等空间相关知识和机构中角度范围、干涉条件等推导出机构的奇异位…

LeetCode 算法:路径总和 III c++

原题链接&#x1f517;&#xff1a;路径总和 III 难度&#xff1a;中等⭐️⭐️ 题目 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶…

WPF对象样式

基本样式设置 Style 设置指定对象的属性 属性&#xff1a; TargetType 引用在哪个类型上面&#xff0c;例如Button、Textblock。。 如果在控件对象里面设置Style&#xff0c;则TargetType必须指定当前控件名 只在作用域里面有效果&#xff0c;其他的相同控件没有影响&…

【LeetCode的使用方法】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🔮LeetCode的使用方法 🔮LeetCode 是一个在线编程平台,广泛…

RPM包管理-rpm命令管理

1.RPM包命令原则 所有的rpm包都在光盘中 例&#xff1a;httpd-2.2.15-15.e16.centos.1.i686.rpm httpd 软件包名 2.2.15 软件版本 15 软件发布的次数 e16.centos 适合的Linux平台 i686 适合的硬件平台…

粒子扩展卡尔曼滤波|MATLAB代码

粒子滤波PF与扩展卡尔曼滤波EKF结合 下载链接:https://download.csdn.net/download/callmeup/89512392 粒子滤波 粒子滤波是一种用于估计状态变量的非线性滤波方法。它通过引入一组粒子来近似表示概率分布,从而利用蒙特卡洛方法进行状态估计。粒子滤波的主要思想是根据系统…

新手教学系列——慎用Flask-SQLAlchemy慢日志记录

在使用 Flask-SQLAlchemy 开发应用时,了解和避免潜在的问题是非常重要的。特别是在常驻进程和循环执行任务的场景下,慢查询记录功能(SQLALCHEMYRECORDQUERIES)可能会引发严重的内存泄漏问题。本文将详细介绍这个问题,并提供解决方案,帮助你在开发过程中避免掉入这些陷阱。…

哈希表 | 哈希查找 | 哈希函数 | 数据结构 | 大话数据结构 | Java

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;毛毛张今天分享的内容&#x1f586;是数据结构中的哈希表&#xff0c;毛毛张主要是依据《大话数据结构&#x1f4d6;》的内容来进行整理&#xff0c;不…

3D Gaussian Splatting代码中的train和render两个文件代码解读

现在来聊一聊训练和渲染是如何进行的 training train.py line 31 def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint, debug_from):# 初始化第一次迭代的索引为0first_iter 0# 准备输出和日志记录器tb_writer p…

0703_ARM7

练习&#xff1a; 封装exti&#xff0c;cic初始化函数 //EXTI初始化 void hal_key_exti_init(int id,int exticr,int mode){//获取偏移地址int address_offset (id%4)*8;//获取寄存器编号int re_ser (id/4)1;//printf("address_offset%d,re_ser%d\n",address_o…

苹果手机怎么刷机?适合小白的刷机办法!

自己的苹果手机用时间长了&#xff0c;有些人想要为自己的手机重新刷新一下&#xff0c;但又不知道怎么刷机。不要慌现在就来给大家详细介绍一下苹果手机怎么刷机&#xff0c;希望可以帮助到大家。 iPhone常见的刷机方式&#xff0c;分为iTunes官方和第三方软件两种刷机方式。 …

基于Web技术的教育辅助系统设计与实现(SpringBoot MySQL)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

强行仅用time.localtime制作“日历牌”——全程记录“顶牛”“调戏”我的AI学习搭子

强行只用time.localtime制作“日历牌”&#xff0c;码好代码试炼通过&#xff0c;想榨取ai智能优化算法&#xff0c;结果失败。本文详细记录“顶牛”全过程。 (笔记模板由python脚本于2024年07月01日 19:16:26创建&#xff0c;本篇笔记适合喜欢python&#xff0c;喜欢搞“事儿”…

p2p、分布式,区块链笔记: 通过libp2p的Kademlia网络协议实现kv-store

Kademlia 网络协议 Kademlia 是一种分布式哈希表协议和算法&#xff0c;用于构建去中心化的对等网络&#xff0c;核心思想是通过分布式的网络结构来实现高效的数据查找和存储。在这个学习项目里&#xff0c;Kademlia 作为 libp2p 中的 NetworkBehaviour的组成。 以下这些函数或…

controller不同的后端路径对应vue前端传递数据发送请求的方式,vue请求参数 param 与data 如何对应后端参数

目录 案例一&#xff1a; 为什么使用post发送请求&#xff0c;参数依旧会被拼接带url上呢&#xff1f;这应该就是param 与data传参的区别。即param传参数参数会被拼接到url后&#xff0c;data会以请求体传递 补充&#xff1a;后端controller 参数上如果没写任何注解&#xff0c…