解一个关于fork+cgroup的Linux内核bug

上周我发了个朋友圈以抱怨现实(我并不认为抱怨是一件不好的事情):

想玩debug一定要玩windows,通过linux内核玩debug不行的。
一个dis命令就看到了地址a,再一个l *a就看到了源码。。。简单的问题到此就结束了,你还会再去查寄存器查引用图吗?同样的简单问题如果是windows,你就必须继续debug。
linux内核源码和随意随处可加的printk取消了继续分析的动机。
有人又要反驳了是吧,万事皆有例外,这个我懂,我说的就是就事论事的当下具体事儿,一句话就能定论的具体事儿哪儿那么多然而和但是。话要少,多动手。

事情是这样的,碰到个NULL指针导致的crash:

在这里插入图片描述好久没有定位NULL了,开搞我等了3分钟电梯下楼抽根烟来点仪式感…然后下载debuginfo,下载crash tools,又花了2分钟,结果呢?

crash命令,bt,dis,l *… 然后就结束了,谢特了,总共不过1分钟!

我要是不懂Linux内核源码,还能多玩一会儿,现在怪我自己咯,我真是太熟悉fork了!


这个和fork有啥关系?


这个问题我是秒解的,因为我对这块代码太熟了(稍后我来讲我是如何秒解的)…然而事后,我网搜了一下相关的问题在社区是怎么解的。

我很遗憾,社区除了怼还是怼。这也是我从来不参与社区讨论的原因,Maybe I despise them…

请看下面的链接:
http://mailman.uclinux.org/pipermail/uclinux-dev/2008-October/047238.html
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1687512
http://lkml.iu.edu/hypermail/linux/kernel/1508.1/04166.html

Peter Zijlstra 是大牛吧,然而他除了怼人之外并没有提出任何建设性的意见,他的意见是对的:

  1. 不要掩盖问题,要找出问题的根因。

然而他有做什么告诉人们要怎么解决问题吗?

如果不能提出Howto的意见,就最好不要回答。别扯这些形而上的东西。So I never discuss with people in the Linux kernel community. I despise them, especially people like Wang Cong and David Miller…

It’s a fucking waste of time!

最终呢,还是这个patch解决了问题:
https://github.com/torvalds/linux/commit/eeb61e53ea19be0c4015b00b2e8b3b2185436f2b

在这里插入图片描述
不是Peter Zijlstra!


现在我来说一下我是如何秒解问题的。

因为我熟悉fork的过程。

关于fork,我先推荐一篇文章:
《一个FORK的面试题》: https://coolshell.cn/articles/7965.html

子进程复制父进程的一切,管它什么呢…

于是父进程的cg信息也跟着复制了,然而

一个进程fork了子进程,子进程复制了父进程,子进程还没有开始运行时父进程被人改了cgroup而子进程并不知道,然后造成子进程的元数据不一致…

这就是根源。简单至极。


浙江温州皮鞋湿,下雨进水不会胖。

发布了1545 篇原创文章 · 获赞 4728 · 访问量 1055万+

猜你喜欢

转载自blog.csdn.net/dog250/article/details/101601075