低并发编程 战略上藐视技术,战术上重视技术
今天终于成功 debug 了 Linux 内核,允许我一惊一乍给大家分享下喜悦吧!
之前读 Linux 的源码,一直想着如果能 debug 就好了。
无奈 Java 出身的我,本来对 c 就很不熟,跑起一个 c 代码就很费劲了,更别说调试,而且还是调试这种和普通 c 项目不一样的内核代码。
仅仅是出于学习 Linux 内核源码的目的想要调试,所以不想花太多时间研究如何构建这个调试环境,想着在网上找个教程,一次性部署好之后就一直用了,无奈一直没找到能照着文档就搭建成功的。
今天终于找到一个大佬的文档,直接按上面说的就能操作成功,分享给大家,同时我自己也做个备份。
先照着这个文档,使得可以用 gdb 进行调试:
https://wenfh2020.com/2021/05/19/gdb-kernel-networking/
再按照这个文档,用 vscode 进行更直观地调试(当然也是 gdb 方式):
https://wenfh2020.com/2021/06/23/vscode-gdb-debug-linux-kernel/
最终效果是。
虚拟机这边用 qemu 启动 Linux 5.0.1 内核。
本机这边用 vscode 的 ssh-remote 插件远程连接虚拟机,然后用 gdb debug。
给大家放大点。
main.c 下的主方法。
看到断点进来相当激动了!这个文档我可得保存好,虚拟机镜像也不敢动了,哈哈,以后就可以开开心心 debug Linux 内核啦。
不过中间也踩了好多坑,原本我想着灵活一点,用自己的 ubuntu 版本,用自己想调试的 Linux 内核版本,无奈都失败了,中间有各种奇奇怪怪的问题...
我就放弃了,乖乖先按照人家的文档跑起来再说吧~
不知道文档里是不是有多余操作,反正各种骚操作我是看不懂,还要改 gdb 的源码。
之后我看看能不能把低版本的 Linux 也搞通,如果大家有更方便地调试方法,可以教教我,这块真是空白。
Linux 内核终于可以 debug 了! (qq.com)
gdb 调试 Linux 内核网络源码(附视频)
最近在看 Linux 内核的网络部分源码,在 MacOS 上搭建调试环境,通过 gdb 调试,熟悉内核网络接口的工作流程。
调试环境是跑在虚拟机里的,在 windows 上应该也能将环境搭建起来。
1. 目标
- 目标:gdb 调试 Linux 内核网络部分源码。
- 环境:macos + vmware + ubuntu + qemu + gdb + linux kernel。
- 参考:构建调试Linux内核网络代码的环境MenuOS系统。
2. 视频
视频连接:gdb 调试 Linux 内核网络源码。
3. 流程
- 下载 ubuntu 14.04
|
|
- vmware 安装 ubuntu。
- 虚拟系统磁盘空间,尽量给大一些,例如 100 G。
- 通过 root 权限安装 linux 内核。
|
|
- 下载编译 linux 内核。
|
|
- 调试内核。
|
|
- 安装高版本 gdb
|
|
|
|
|
|
- 调试 tcp 网络通信。
|
|
|
|
用户可以根据自己的需要去下断点,也可以修改 linuxnet 源码进行调试。
4. vscode + gdb
vscode + gdb 调试 Linux 内核更人性化一点。
详看:vscode + gdb 远程调试 linux 内核源码(附视频)
5. 参考
vscode + gdb 远程调试 linux 内核源码(附视频)
前段时间才搭建起来 gdb 调试 Linux 内核网络源码(视频 ),但是 gdb 命令调试效率不高。磨刀不误砍柴工,所以折腾一下 vscode,使调试人性化一点。
1. 视频
视频连接:vscode + gdb 远程调试 linux (EPOLL) 内核源码
2. 搭建调试环境
要搭建 vscode + gdb 调试 Linux 内核环境,首选要搭建:gdb 调试 Linux 内核源码(视频),然后再配置 vscode 进行测试调试。
3. vscode 配置
3.1. vscode 插件
- ms-vscode.cpptools
- remote-ssh
避免 remote-ssh 工作过程中频繁要求输入登录密码,最好设置一下 ssh 免密码登录(参考:[shell] ssh 快捷登录)。
3.2. 项目调试配置
|
|
4. 测试调试
4.1. 虚拟机操作
|
|
4.2. 实体机操作
- vscode 连接远程虚拟机。
- vscode 打开虚拟机 Linux 内核源码。
- vscode 在 Linux 内核源码的 eventpoll.c 文件,对对应接口(epoll_create, epoll_wait, epoll_ctl)下断点。
- F5 快捷键启动 vscode 调试。
5. 小结
- 我认为在阅读 Linux 内核源码前,最好先把调试环境搭建起来,因为 Linux 内核源码庞大复杂,新手很难从复杂的源码调用关系中理清思路。
- 老师传道受业,只会给你指出一条学习路线,还会提醒你路上可能遇到哪些大坑,但是路上还有无数小坑,你只有通过实践调试,才能找到答案。
- 在求知的路上,让我们共勉!
Ubuntu18.04编译调试OpenJDK15
自从 Oracle Java SE support Roadmap 更新, OpenJDK就分为了 Oracle's OpenJDK
和 AdoptOpenJDK
Oracle's OpenJDK :
Oracle从JDK 9开始开始发布基于GPL协议的开源构建版本,从JDK 11开始,Oracle's OpenJDK和Oracle JDK在功能上几乎完全一致AdoptOpenJDK :
由社区维护的发行版本,纯血的OpenJDK
获取OpenJDK源码
OpenJDK 社区采用mercurial 作为版本控制工具. 安装mercurial
$ sudo apt install mercurial
安装完成后即可下再OpenJDK源码, 可以在 OpenJDK Repositories 中找到对应的版本,并通过mercurial下载源码
以OpenJDK最新版本Master + dev
为例
$ hg clone https://hg.openjdk.java.net/jdk/jdk
经过漫长的等待后 通过
$ bash get_source.sh
获取源码,尽量多重复获取几次,因此单次下载不一定完整,直到不出现如下提示即下载完整了
WARNING: langtools exited abnormally (255)
WARNING: nashorn exited abnormally (255)
boot JDK
构建OpenJDK需要一个预先存在的JDK。这称为“boot JDK”
Boot JDK最好是当前版本的前一个版本,即 n-1
,因此选择下载 OpenJDK 14 下载完后解压备用
Build AdoptOpenJDK
$ cd ${OpenJDK源码目录}
$ bash configure --with-boot-jdk=${YourBootJDKPath} --with-debug-level=slowdebug
其中 :
--with-boot-jdk :
表示指定boot JDK的路径,如果已经设置了JAVA_HOME
则无需指定--with-debug-level :
表 设置debug等级,可选值为release
,fastdebug
,slowdebug
oroptimized
. 默认为release
.slowdebug
表示没有优化,有debug log 其定义于 Define
然后过程中会检查系统依赖,如果缺少依赖会提示安装, 下面是所有需要安装的依赖
$ sudo apt-get install autoconf
$ sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
$ sudo apt-get install libcups2-dev
$ sudo apt-get install libfontconfig1-dev
$ sudo apt-get install libasound2-dev
直到出现如下信息表示配置完成:
summary
它会在 build/
目录生成相应的 configuration , 然后通过
$ make all
编译.
值得注意的是 如果有多份configurations那么就需要在 CONF
环境变量中指定配置不然会如下错误
未指定configuration
可以指定CONF
环境变量 即可开始编译
$ CONF=linux-x86_64-server-slowdebug make all
风扇的呼啸
大概10分钟左右编译完成.
完成之后可以在 build/linux-x86_64-server-slowdebug/jdk/bin
中执行./java -version
调试
这里选择使用vscode
调试, OpenJDK提供了一个命令
$ make vscode-project
可以快速生产vscode workspace.
我这里使用vscode remote
连接到 Ubuntu中,然后 vscode File
-> Open Workspace...
选择 build/linux-x86_64-server-slowdebug/jdk.code-workspace
即可,然后根据提示安装相应的插件
安装完成后需要reload
vscode
然后 Run
->Open Configurations
打开launch.json
在 "name": "java"
的配置中加上 "args": ["-version"]
,然后 F5
即可看到如下结果
众所周知... C/C++ 的入口为 main 函数, 所以 打开 main.c
文件, 下一个断点.. 就可以愉快的玩耍了...
更多编译的选项可以阅读官方文档...