iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >涉及到linux内核的bug排查过程是怎样的
  • 747
分享到

涉及到linux内核的bug排查过程是怎样的

2023-06-15 14:06:00 747人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关涉及到linux内核的bug排查过程是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。编写代码只是程序员的工作之一,调试代码的时间甚至会超过编写代码,之前为大家讲解了

这期内容当中小编将会给大家带来有关涉及到linux内核的bug排查过程是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

编写代码只是程序员的工作之一,调试代码的时间甚至会超过编写代码,之前为大家讲解了很多关于系统、架构编程等方面的内容,整理主要大家全方位展示一次涉及到内核的 bug 排查过程。

发现问题

话说一天公司服务器报警,登录到机器后发现进程已被“卡死”,常规 GDB 调试没有反应,查找 Log 也没有线索,问题似乎已经无解。

就在这时博主的脑海里浮现出了岛国的。。是的,你猜错了,是岛国的一休哥、柯南弟、国内的包青天、狄仁杰、国外的夏洛克等一众大佬,瞬间有如神助,一定还有办法!是的!

分析问题

先来仔细分析一下,既然进程看上去被卡死,那么如果被卡在用户态,那么该进程 CPU 使用率必然很高(死循环之类);如果被卡在内核态,这时进程应该正在进行 io 或者网络通信等,那么 CPU 使用率应该会很低,现在还能查到进程ID,有了进程ID运行 top 命令看一下:

涉及到linux内核的bug排查过程是怎样的

注意 CPU 那一列,显示 CPU 占用率为0%,我们发现此时该进程几乎没有占用CPU,这基本上是在告诉我们该进程是被卡死在内核态,进程要进入内核态那么就是因为调用了某个阻塞式系统调用导致被操作系统挂起,那么该怎么知道进程调用了什么系统调用呢?

跟踪进程系统调用

strace 命令就用来告诉你这个的,运行 strace 命令来查看一下此时进程调用了什么系统调用:

涉及到linux内核的bug排查过程是怎样的

Oops!strace 命令也被卡死了,无奈,再想想还有其它什么办法。。

跟踪进程用户态运行时栈

有了,可以用 pstack 命令,该命令能打印出进程运行时栈信息,虽然该命令不能追踪到内核,但是可以看到用户态最终调用了什么函数,从而推断出调用了什么系统调用,让我们来运行一下:

涉及到linux内核的bug排查过程是怎样的

和strace一样,pstack 也被卡死了。

现在我们还能去哪里找线索呢?

古老的ps命令永不过时

我们可以利用 ps 命令来查看进程的运行状态和 WCHAN(waiting channel)。

WCHAN 是什么意思呢?

在 Linux 世界,有问题问男人(man),这就是万能的 man 命令,我们使用 man 命令来看一下 ps 展示内容的含义:

$ man ps

运行 man 命令并搜索“WCHAN”,啊哈!最终在“STANDARD FORMAT SPECIFIERS”这一部分中找到了 WCHAN 的含义,是这样写的:

涉及到linux内核的bug排查过程是怎样的

这里清楚的写着 WCHAN 指的是当前进程正阻塞在哪个内核函数上。

OK,我们来运行一下 ps 命令:

涉及到linux内核的bug排查过程是怎样的

这里值得注意的是,因为 ps 打印的只是运行ps命令这一时刻相应进程的状态,也就是说运行一次 ps 相当于一次采样,因此你应该多运行几次ps,确保运行结果没有变化,否则只运行一次并且时间足够巧那么有可能会获得到一个错误的线索。

两种进程阻塞状态

从ps打印的结果可以看出,该进程运行状态是D,运行状态D表示什么意思呢?我们再次请教man,发现了这样的信息:

涉及到linux内核的bug排查过程是怎样的

原来进程运行状态D表示 uninterruptible sleep,不可被打断的 sleep,意思是说该进程正在睡觉,就算你拍它一巴掌也不会醒,即该进程当前不响应任何外部信号,此时哪怕 kill 命令都杀不掉该进程(除非内核允许该进程接收 kill 信号),直观感受就是该进程被“卡死”了。

与不可被打断的 sleep 相对于的是可被打断 sleep,从上图看状态为S,此时进程正在阻塞等待某个事件(比如网络数据到来等等),处于该状态的进程可以接收信号,直观感受就是该进程还有反应。

通过ps命令我们可以看到进程状态为D,进一步验证了进程确实被“卡死”了。

那么进程被卡死在了哪里呢?

幸运的是 WCHAN 这一列可以告诉你答案。

进程阻塞在哪个内核函数上

上面的ps命令 WCHAN 这一列显示的是 rpc_wa,嗯。。rpc_wa 什么呢?看上去是被截断了,不过没关系,我们可以从源头上找到 wchan 的完整输出,实际上ps等命令也是在这个源头上查找信息并展示出来的,这个源头就是 proc 文件系统,proc 文件系统记录了内核以及各个进程的运行时信息,我们可以使用最简单的 cat 命令,使用 proc 后跟进程ID以及wchan:

涉及到linux内核的bug排查过程是怎样的

啊哈,我们终于找到进程此时到底卡死在哪里了!

看起来该进程正在等待一个 RPC 调用,RPC 实际上就是一个进程正在和另一个进程网络通信,尽管我们知道了进程被卡死在了哪里,但是我们依然不知道为什么会被卡死在这里。

至此线索似乎中断了。。。

柳暗花明

让我们再仔细想一想。

既然进程被卡死了,那么此时进程必然没有位于用户态,不是用户态就肯定是内核态,那么进程怎样才能进入内核态呢?答案很显然是调用了某个系统调用。

那么我们该怎样知道某个进程当前正在调用哪个系统调用呢?

You are lucky dog,Say hi to /procsyscall,我们同样可以用简单的 cat 命令去 proc 文件系统中查找,使用/proc后跟进程ID+syscall即可。

涉及到linux内核的bug排查过程是怎样的

WTF。。。这是一串什么鬼东西!

原来这一串看起来不知所云的东西正是系统调用,第一个数字代表系统调用 ID,后面一堆是参数,我们可以不用关心。

从上面的输出我们可以看到调用的是第 262 号系统调用,只有一个数字是没什么意义的,这个数字到底代表那个系统调用呢?

根据内核源码查系统调用

要知道这个数字的含义,我们就需要参考内核代码了,一般在 Linux 系统中必要的内核头文件位于/usr/include目录,在博主 64 位 Linux 机器上,我找到了这个文件:

涉及到linux内核的bug排查过程是怎样的

Gotyou!!!我们可以看到调用了 newfstatat 系统调用,这个系统调用有什么作用呢?让我们再一次问男人(man命令):

$ man newfstatat

得到了这样的信息:

涉及到linux内核的bug排查过程是怎样的

啊哈!原来是fstatat,这是在读取文件的元信息。

现在我们已经知道了调用什么系统调用,可是一个新的问题再次出现,那就是我们为什么调用这个系统调用后最终会因为等待一个 rpc 被卡死呢?

显然我们需要调用栈信息来验证。

跟踪内核运行时栈

OOOOKey,是时候请出重量级工具了,这就是/proc/PID/stack,通过简单的查看这个文件我们就能知道相应进程在内核中的调用栈!!!就问你 Linux 这种设计有没有很厉害,有没有!!!

涉及到linux内核的bug排查过程是怎样的

这个内核调用栈最终揭开了所有秘密。

真相大白

首先我们来看调用栈的栈顶,栈顶正是 ps 命令 WCHAN 那一列打印出来的,进程在内核中正是因为调用这个函数被卡死的。

涉及到linux内核的bug排查过程是怎样的

接下来我们从调用栈的最底层看,我们发现了系统调用,印证了正是进程调用这个系统调用而导致卡住的。

涉及到linux内核的bug排查过程是怎样的

那么调用这个系统调用发生了什么呢?我们接着往上看,注意这几行:

涉及到linux内核的bug排查过程是怎样的

Finally!!!从调用栈中我们看到了一系列 NFS 相关的函数,NFS全称Network File System,也就是网络文件系统,我们平时挂载(mount)一个远程文件系统就是NFS来实现的,正是 NFS 进行网络通信才导致在 rpc 上等待,

从内核调用栈我们知道,进程在查询某个远程主机上文件的元数据时因网络问题导致被卡死。

通过这一线索我们最终定了出现问题的代码。

上述就是小编为大家分享的涉及到linux内核的bug排查过程是怎样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网操作系统频道。

--结束END--

本文标题: 涉及到linux内核的bug排查过程是怎样的

本文链接: https://www.lsjlt.com/news/280530.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 涉及到linux内核的bug排查过程是怎样的
    这期内容当中小编将会给大家带来有关涉及到linux内核的bug排查过程是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。编写代码只是程序员的工作之一,调试代码的时间甚至会超过编写代码,之前为大家讲解了...
    99+
    2023-06-15
  • Linux内核处理中断的过程是怎样的
    Linux内核处理中断的过程是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。中断是现代 CPU 工作方式中重要的部分。例如:当你每次在键盘上按下一个按键后,CPU 会...
    99+
    2023-06-28
  • Linux内核是怎样的
    这篇文章主要介绍“Linux内核是怎样的”,在日常操作中,相信很多人在Linux内核是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内核是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-05
  • Linux内核是怎么样的
    这篇文章将为大家详细讲解有关Linux内核是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux 内核,这个经常听见,却不不知道它具体是干嘛的东西,是不是觉得非常神秘Linux 内核看不见摸不...
    99+
    2023-06-16
  • 升级Linux内核的教程是怎样的
    本篇文章为大家展示了升级Linux内核的教程是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。大家好,今天我们学习一下如何从Elrepo或者源代码来安装最新的Linux内核4.0。代号为&...
    99+
    2023-06-13
  • Linux内核驱动fsync机制实现过程是怎样的
    Linux内核驱动fsync机制实现过程是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Linux内核中的IO模型基本分为4类: 1、同步阻塞I/O 2、同步非阻塞I/...
    99+
    2023-06-13
  • Linux内核和Windows内核的区别是怎样的
    Linux内核和Windows内核的区别是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Windows 和 Linux 可以说是我们比较常见的两款操作系统的。Window...
    99+
    2023-06-15
  • Linux内核调优是怎样的
    这篇文章主要为大家分析了Linux内核调优是怎样的的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Linux内核调优是怎样的”的知识吧。一、内核文件系统操作系...
    99+
    2023-06-28
  • linux内核结构是怎样的
    Linux内核是一个分层的结构,由多个模块组成,每个模块负责不同的功能。下面是Linux内核的主要组成部分:1. 进程管理模块:负责...
    99+
    2023-10-08
    linux
  • Linux内核进程管理的基础是怎样的
    本篇文章为大家展示了Linux内核进程管理的基础是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。内核通过 task_struct 描述进程用命令 pstree 可以让内核以树形的结构把进程之间...
    99+
    2023-06-15
  • Linux内核源码的进程调度是怎样的
    这篇“Linux内核源码的进程调度是怎样的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux内核源码的进程调度是怎样的...
    99+
    2023-06-16
  • Linux内核中dev_info、dev_dbg、dev_err及动态调试是怎样的
    Linux内核中dev_info、dev_dbg、dev_err及动态调试是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。目前在kernel驱动代码中,都不再建议直接使用...
    99+
    2023-06-15
  • 程序员,你碰到过的最难调的Bug是什么样的?
    Bug无论是对于测试还是开发来说,应该都不陌生,虽然我们经历的大部分bug有的被其他人修复了并且在互联网分享出来了,这时候我们通过Stackoverflow、Baidu、Google等搜索引擎找到答案了。 但是我们在工作中也可能会...
    99+
    2023-06-05
  • Linux内核开发工具介绍是怎么样的
    本篇文章给大家分享的是有关Linux内核开发工具介绍是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。众所周知,Linux内核是使用make命令来配置并编译的,那必然少不...
    99+
    2023-06-16
  • Linux手工入侵排查思路是怎样的
    Linux手工入侵排查思路是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。当Linux主机发生安全事件需要进行入侵排查时,一般可以使用常见的shell命令...
    99+
    2023-06-15
  • 从内核到插件到模板的ZBLOG变化以及Zblog更新过程
    本篇文章给大家分享的是有关从内核到插件到模板的ZBLOG变化以及Zblog更新过程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。zblog新版后台功能预览.先来一张登陆界面吧从...
    99+
    2023-06-12
  • Linux内核测试生命周期是怎么样的
    这篇文章主要为大家展示了“Linux内核测试生命周期是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux内核测试生命周期是怎么样的”这篇文章吧。从一次更改开始内核中每一项令人兴奋的...
    99+
    2023-06-16
  • Linux中arm64多核启动流程是怎样的
    今天小编给大家分享一下Linux中arm64多核启动流程是怎样的的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Kernel ...
    99+
    2023-06-28
  • Ubuntu 9.04升级到9.10的过程是怎样的
    这篇文章将为大家详细讲解有关Ubuntu 9.04升级到9.10的过程是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Ubuntu 9.10(Karmic Koala)采用GNOME ...
    99+
    2023-06-13
  • Linux oracle 9i安装过程是怎样的
    这期内容当中小编将会给大家带来有关Linux oracle 9i安装过程是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  下面进行Oracle安装前期准备中的第一点,完成Linux的安装.在安装中...
    99+
    2023-06-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作