|
哈喽,大家好,我就是那个不喜欢在大厂搬砖,不喜欢在研究院做研究,只喜欢创业做计算机底层课程的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】咨询我的课程
|