内核达人

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4|回复: 0

gdb远程调试底层实现原理

[复制链接]

25

主题

25

帖子

83

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
83
发表于 7 天前 | 显示全部楼层 |阅读模式
哈喽,大家好,我就是那个不喜欢在大厂搬砖,不喜欢在研究院做研究,只喜欢创业做计算机底层课程的coder,子牙老师

在gdb的所有功能模块中,有一个功能模块是基于gdb+socket实现的,你知道是哪个吗?
就是远程调试!远程调试还是非常实用的,比如你自己写操作系统,需要用到远程调试。你想单步调试Linux内核,也需要用到单步调试……

如果你想搞明白远程调试的底层实现原理,或者你在使用远程调试过程中遇到问题,因为不懂原理不知道如何去排查及解决,这篇文章都能帮到你

BTW,图中划线的7个功能模块就是我做的全网唯一的课程《从零手写gdb调试器》实现了的,除此之外,还实现了gdb不支持的功能:借助Linux内核驱动实现对Linux内核的窥探,比如内存读写、数据查看、内核态调用链等。对课程感兴趣的可以咨询班主任【jvm-anan】,关于调试器底层原理的教学,国内连书都没有,全网唯一的视频课程,带你真正玩转调试器!

开始正文。以下,enjoy

远程调试怎么玩的
可能有小伙伴没用过gdb的远程调试功能,举个例子:用gdb+gdbserver调试我写的调试器yagdb为例

先启动gdbserver
再通过clion配置gdb去连它
就可以实现远程调试了
gdb的远程调试功能,非常非常实用!如果你自己想写操作系统或实战Linux内核,必用!

比如调试Linux内核,先启动Linux内核,怎么没看到gdbserver?对的,qemu调试模式的底层是基于gdbserver实现的,只是看不到而已
启动起来了,调试看看,木有问题
之前在写操作系统的时候,很多学员因为不懂gdb远程调试的底层原理,导致在做实验的时候遇到无法调试的时候不知道如何解决,所以后来我在课程中加入了gdb远程调试底层原理的讲解,后面大家好像很少再遇到这个问题了。接下来把这个内容分享给大家

底层原理
前面说了,qemu调试模式的底层是基于gdbserver实现的,内部实现可能类似这样
gdbserver,其实就是一个基于socket实现的服务端,上证据
启动了一个server,在1234端口上监听。gdbserver的代码类似这样,socket+bind+listen创建server,使用epoll监听io,比如有连接,走accept,比如读写
到此,你应该知道gdb连接gdbserver是如何做到的了吧,就是一个client,代码类似这样
那如果让你写一个gdb连接gdbserver,你知道怎么写了吗?不过gdb与gdbserver的通信是基于RSP协议
我的课程《从零手写gdb调试器》第八专题,就是实现了RSP协议,实现了我自己写的gdb与gdbserver通信。对课程感兴趣的小伙伴可以咨询班主任【jvm-anan】

光有socket还不够
如果你想实现c源码级别的调试,还需要一个东西,就是调试符号。所以如果你无法调试一个程序,不妨检查一下此

什么是调试符号呢?看图
这些东西是怎么来的?就是你使用gcc编译程序加-g的作用

总结:如果你无法调试一个程序,首先检查程序有没有生成调试符号,通过readelf -SW查看可执行文件的节表就能看出来。如果没有,再去检查编译的时候有没有带-g。如果这些都没有问题,再看程序有没有打断点,别笑,真有人犯这个低级错误。都没有问题,再看1234端口有没有跑起来。就这个流程,几乎能解决一切不能调试的问题

gcc不带-g能调试吗
很多人对此的理解是错误的

程序能否调试,要从两个角度去理解:汇编级别的调试、c源码级别的调试。所以这个问题的答案是:如果编译时不带-g,编译生成的程序,是可以调试的,但是只能汇编级别的调试,不能c源码级别的调试

来验证一下,去掉-g编译程序,看节表,没有调试信息
测试汇编级别调试
是可以调试的,但是我使用list命令查看c源码,提升没有符号表

那c源码级别的调试要如何实现呢?我知道如何实现,但是我还没空去写代码,现在讲难免太空,后面把代码写完了再分享。对此感兴趣的小伙伴关注公众号【硬核子牙】,第一时间获取文章推送信息

自实现gdb接入gdbserver
前面知道,gdbserver就是一个socket server,那我们写一个socket client就能与之通信了,但是它的通信协议是RSP,我们来观摩一下。完整功能,课程中学习,你也可以自行研究,我觉得没啥难度

比如用我写的gdbclient连接运行Linux内核的gdbserver,成功连上
我执行continue,让Linux内核运行起来了
有趣不?这就是底层的魅力!这篇文章讲到的所有技术点,我的新课《从零手写gdb调试器》中全部有,感兴趣的小伙伴咨询班主任【jvm-anan】

最后再打个小广告,如果你想学习手写操作系统及实战Linux内核,如果你对调试器底层实现感兴趣,同时想写一个自己可以百分百控制的调试器,调试你自己写的操作系统,欢迎找班主任【jvm-anan】咨询我的课程


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|内核达人

GMT+8, 2025-12-6 13:33 , Processed in 0.086906 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表