趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85459 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

61 | 搭建操作系统实验环境(下):授人以鱼不如授人以渔

远程debug内核
使用gdb运行内核二进制文件
修改qemu启动参数
找到内核二进制文件
安装gdb
编译内核时加入debug信息
gdb命令
在Linux下使用gdb
Debug kernel
了解gdb
课堂练习
总结时刻
调试内核
编译内核
添加系统调用
搭建操作系统实验环境

该思维导图由 AI 生成,仅供参考

上一节我们做了一个实验,添加了一个系统调用,并且编译了内核。这一节,我们来尝试调试内核。这样,我们就可以一步一步来看,内核的代码逻辑执行到哪一步了,对应的变量值是什么。

了解 gdb

在 Linux 下面,调试程序使用一个叫作 gdb 的工具。通过这个工具,我们可以逐行运行程序。
例如,上一节我们写的 syscall.c 这个程序,我们就可以通过下面的命令编译。
gcc -g syscall.c
其中,参数 -g 的意思就是在编译好的二进制程序中,加入 debug 所需的信息。
接下来,我们安装一下 gdb。
apt-get install gdb
然后,我们就可以来调试这个程序了。
~/syscall# gdb ./a.out
GNU gdb (Ubuntu 8.1-0ubuntu3.1) 8.1.0.20180409-git
......
Reading symbols from ./a.out...done.
(gdb) l
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <linux/kernel.h>
5 #include <sys/syscall.h>
6 #include <string.h>
7
8 int main ()
9 {
10 char * words = "I am liuchao from user mode.";
(gdb) b 10
Breakpoint 1 at 0x6e2: file syscall.c, line 10.
(gdb) r
Starting program: /root/syscall/a.out
Breakpoint 1, main () at syscall.c:10
10 char * words = "I am liuchao from user mode.";
(gdb) n
12 ret = syscall(333, words, strlen(words)+1);
(gdb) p words
$1 = 0x5555555547c4 "I am liuchao from user mode."
(gdb) s
__strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:79
(gdb) bt
#0 __strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:79
#1 0x00005555555546f9 in main () at syscall.c:12
(gdb) c
Continuing.
return 63 from kernel mode.
[Inferior 1 (process 1774) exited normally]
(gdb) q
在上面的例子中,我们只要掌握简单的几个 gdb 的命令就可以了。
l,即 list,用于显示多行源代码。
b,即 break,用于设置断点。
r,即 run,用于开始运行程序。
n,即 next,用于执行下一条语句。如果该语句为函数调用,则不会进入函数内部执行。
p,即 print,用于打印内部变量值。
s,即 step,用于执行下一条语句。如果该语句为函数调用,则进入函数,执行其中的第一条语句。
c,即 continue,用于继续程序的运行,直到遇到下一个断点。
bt,即 backtrace,用于查看函数调用信息。
q,即 quit,用于退出 gdb 环境。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了在Linux环境下使用gdb工具进行内核调试的方法。通过添加系统调用并编译内核,读者可以逐步了解内核代码逻辑执行到哪一步以及对应的变量值。文章首先介绍了gdb工具的基本用法,包括设置断点、运行程序、逐行执行、打印变量值、查看函数调用信息等。通过示例演示了如何使用gdb调试程序,让读者能够快速上手。文章还介绍了在调试整个内核时的步骤,包括安装gdb、找到内核的二进制文件、修改qemu的启动参数、远程attach到qemu里面的内核等。通过实际操作,读者可以了解如何在虚拟机中进行内核调试,并通过gdb追踪系统调用的整个过程,从而深入了解内核的工作机制。总的来说,本文为读者提供了一份详实的内核调试指南,使他们能够更好地理解和掌握在Linux环境下使用gdb进行内核调试的方法和技巧。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • LDxy
    打断点的指令b后面是不是既可以跟行号也可以跟函数名?

    作者回复: 是的

    2019-08-17
    2
  • 魏颖琪
    终于在virtualbox中做完了这两课的实验。请问老师,云服务是否很少用 vbox,基本都用qemu?
    2019-09-20
    6
  • yanger
    缺省很多变量被编译优化了,有O0编译kernel的方法吗
    2020-02-01
    1
    3
  • 邹德虎
    如果没有虚拟机而是实体的服务器,怎么调试内核呢?
    2022-05-23
    1
  • 莫名
    编译、调试较新版本的内核稍微有些区别,大体流程基本相同。
    2020-09-24
  • kkxue
    赞👍
    2019-08-16
  • 许童童
    跟着老师一起精进。
    2019-08-16
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部