跳转到目录 点这里
GDB调试:
1)首先打开一个终端启动 qemu
这行命令打开一个Qemu 虚拟机,-S表示暂停等待调试程序gdb来连接 tcp后面指定端口, bzImage自己编译好的内核镜像
qemu -gdb tcp::8888 -S /kernel-debug/linux-5.9.8/arch/x86/boot/bzImage
2)然后进入源码编译目录通过GDB 来调试
cd /kernel-debug/linux-5.9.8 gdb vmlinux
3)进入GDB后 在kernel 在GDB 里面输入三个命令调试,每输入一个后回车
第一行 表示连接到打开的qemu
第二行 表示 在内核起点函数 start_kernel 打上断点
第三行 表示表示继续 qemu程序,正式启动内核
target remote:8888 hbreak start_kernel c
也可以用: target remote localhost:8888
4) 如果你想打多个断点,可以用一个脚本来放gdb命令,默认的,你在执行gdb令的目录放一个名为 .gdbinit的文件,把命令放上去就可以了。
但是在Manjaro上 还需要在当前用户的HOME 目录配置一下,如果是 root用户就 /root 目录下新增一个
vim /root/.gdbinit 文件,内容如下:
set auto-load safe-path /
vim /kernel-debug/linux-5.9.8/.gdbinit
target remote localhost:8888 hb start_kernel c b init/main.c:841 c step
5)带文件系统的调试
上面的调试是没有文件系统的,内核初始化完了,进入空转,然后挂载文件系统会报错。
如果你想调试系统调用,就必须挂载文件系统,然后再执行用户程序。
那么,只需要加个参数就 -hda 就行了,它就是指定Qemu硬盘文件。
-append root=/dev/sda 就是
这里的 /kernel-debug/initramfs.img 就是根文件系统(这个可以从别地下载,也可以自己制作)
-nographic 无界面启动,看你的需要(ssh执行时必需无界面才能启动)
qemu -gdb tcp::8888 -S -hda /boot/initramfs-5.8-x86_64.img -kernel /kernel-debug/linux-5.9.8/arch/x86/boot/bzImage -append "root=/dev/sda nokaslr" -nographic
用 eclilpse 调试 ,过程截图点这里
下载: wget https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/R/eclipse-cpp-neon-R-linux-gtk-x86_64.tar.gz
主要步骤如下:
主要注意要以 code As Makefile Project 方式导入项目,这样会自动生成索引,调时时就可以像调试java一下在界面下断点了。
eclipse 禁用索引 和自动编译
1、Window->Preferences->General->Workspace 中将Build Automatically选项去掉 (自动编译会破坏己生成的东西)。
2、Window->Preferences->C/C++ -> Indexer中,禁用 indexer (indexer 费时很卡)。
导入Makefile项目
File -> Import -> Project -> C/C++ -> C Existing Code As Makefile Project -> Next
-> Existing Code Location => /kernel-debug/linux-5.9.8
-> Project Name linux-5.9.8
-> Languages C/C++
-> Toolchain for Indexer Settings ->= Linux GCC
配置Debug选项
Debug configurations -> C/C++ Remote Application
GDB(DSF) Manual Remote Debugging Launcher (用gdbserver调试用户空间程序才选自动,这里选Manual)
Main TAB -> -C/C++ Application-> /kernel-debug/linux-5.9.8/vmlinux (选 vmLinux 文件绝对路径)
Main TAB -> -Disable auto build
Debugger TAB -> Stop on startup at 'start_kernel'
Debugger TAB -> Main -> GDB debuger -> = /usr/bin/gdb
Debugger TAB -> Main -> GDB command file-> = /kernel-debug/linux-5.9.8/.gdbinit
Debugger TAB -> Main -> Tracepoint mode-> = Normal
Debugger TAB -> connection -> TYPE -> = TCP
Debugger TAB -> connection -> Host Name or IP Address -> = 127.0.0.1
Debugger TAB -> connection -> Port number = 8888
各种工具版本号
-------gdb 版本--------
[hun@hun-hh ~]$ gdb -v
GNU gdb (GDB) 10.1
Copyright (C) 2020 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.
-------make 版本--------
[hun@hun-hh ~]$ make -v
GNU Make 4.3
为 x86_64-pc-linux-gnu 编译
Copyright (C) 1988-2020 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本<http://gnu.org/licenses/gpl.html>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。
-------qemu 版本--------
[hun@hun-hh ~]$ qemu -version
QEMU emulator version 5.1.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers
-------Eclipse 版本--------
Eclipse IDE for C/C++ Developers
Version: Neon Release (4.6.0)
Build id: 20160613-1800
-------java 版本--------
hun@hun-hh ~]$ java -version
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)
-------MANJARO 的linux内核版本--------
[hun-hh hun]# uname -a
Linux hun-hh 5.8.16-2-MANJARO #1 SMP PREEMPT Mon Oct 19 11:33:03 UTC 2020 x86_64 GNU/Linux
[hun-hh hun]# hostnamectl | grep -i kernel
Kernel: Linux 5.8.16-2-MANJARO
[hun-hh hun]# cat /proc/version
Linux version 5.8.16-2-MANJARO (builduser@development) (gcc (GCC) 10.2.0, GNU ld (GNU Binutils) 2.35) #1 SMP PREEMPT Mon Oct 19 11:33:03 UTC 2020