当前所在位置: 首页 > 社会 >

反思报告:调试理论,防御性编程,invariant,COW,感受痛苦以及摆烂和熬夜

2023-06-26 04:44:41来源:哔哩哔哩

随便聊聊。最近de COW的 bug实在是让我太痛苦了,50行不到的代码足足让我de了那么三天,加上中间摆烂的天数,那就是五天,五天就那么消失了,现在回过头来看,我觉得我不应该但是可以理解,也许我习惯好点我不会有那么多痛苦。


(资料图)

我觉得我的收获是很大的,但是是否要吃这么多的苦呢?那些直接copy 445 和 824的人,又失去了多少东西呢?他们真的得到了自己认为的效率最大化的结果了吗?

看了jyy的调试理论课,发现程序出错大概可以抽象成三个东西。

一个是 bug,然后是fault,最后是error

bug是你代码实现和需求的不匹配,你的软件设计里有一个坑。

fault是你的状态机执行到了对应的那个地方,掉到坑里了,导致了错误状态的出现(机器永远是对的,对于你写的代码而言,这个状态是合理的,但是和你的需求有gap)

error是你发现你的状态机出问题了,可能是崩溃,也可能是其他的什么东西,总之结果不对。

就我目前比较浅薄的视角来看。我们在为了方便 debug 做的所有的努力,就是为了尽快的让你定位到对应的fault,努力减少 fault error之间的 gap,然后,就诞生了防御性编程。

说实话,我觉得这些有启发,但是如果你真的不去做的话,这些都是空话。高屋建瓴的话,怎么说都是对的,只有落实到实处,让自己真正切切的感受到痛苦后,我们可能才会意识到这些话的重要性,很多软件工程的书都是需要有一定的代码开发经验之后才能看懂;大概是这个样子吧。

我很痛苦,之后我理解了防御性编程的宝贵。

系统的出错,实在是太痛苦了,首先debug就很难,gdb要来回在用户态和内核切,接着就是你一个小地方出错,可能过了很久才会在另一个地方暴雷,最后我敢保证,暴雷的这个,对应的kernel trap 或者 user trap 导致的panic,你大概率是看不懂的。

我知道我有错,但是我不知道我哪里有错,这就是从零开始的debug生活。

jyy在课上说,所有的程序的功能都是现实世界的需求在软件世界的投影,这个投影并不是完全一比一照搬的,所以我们的程序在执行的时候可能会有一些隐含的假设,我们可能没有写出来的假设。

比如说银行卡里面的钱,它不可能是负数,只可能是正数,这是你的假设,你的程序运行在这个假设上面。

防御性编程,我现在的理解就是,他的目的是为了检验你程序运行的假设。

比如你不能 kfree 之前你 kfree过的块。不能 kalloc 之前你 kalloc 的内存。

assert做的就是这种检验前提的事情。

说实话一开始防御性的编程的时候,我有一个疑问:如果你知道哪里可能出错的话,那么,你为什么还会出错呢?如果在每个可能出错的地方,你都打上了assert,你的代码不是会非常的冗余吗?

对此我现在的回答是,如果你的理所应当都是对的,那么就不会有bug,但是既然有,就不存在什么理所应当。代价是有的,但是是有限的。你可能不能找出所有的错误,但是你不能什么都不干啊。

bug是让人最痛苦的事情(如果有其他还要痛苦的,一定是debug),首先,你不知道哪里会有bug。其次,你不知道这个东西为什么是bug?最后你甚至发现为了修补这个bug,你需要把你设计的东西全部推倒,重新设计一个对应的结构。

日。

曾经我上jyy的课,大受震撼但是不理解,直到COW的后期,我基本对每个函数都进行了合法性的检查我才发现,早点麻烦的吃点土,就不会吃自己生产出来的()了。

这可能就像是代码复用和代码风格的干净一样,只有在你真正的处理非小型项目的时候,需要用到它的时候,可能才会猛然间的发现这个东西会有多少有用。

说到前提,我想起以前看过的一篇文章

有趣的CS - 种程序 - 圆角骑士魔理沙的文章 - 知乎https://zhuanlan.zhihu.com/p/587249189

我觉得我好像抓到点什么?

感觉invariant,递归,之类的,唔。

程序是一套规则,然后递归是规则的自然推导(规则之间的规则),然后防御性编程是规则的前提或者后果的检查。但是问题来了。

如何设计一个复杂的系统呢?曾经想过什么数据流之类的,把控几个修改的函数就可以把控之类的。但是如果系统越来越大,越来越复杂。

哎,不是很清楚,接着学吧,希望可以7.15前收掉081(估计不行。)

之后又是碎碎念。

说实话我原来都放弃了COW,不管怎么搞,总有些free页会莫名其妙的消失,最后我想着,就算了吧,出于程序员的洁癖,我合并了一下我的代码,把decrease改成了kfree,结果就panic了,一开始我没怎么在意,只觉得这个机器怎么又抽风了,就直接改了回去,换了一条路走,后来不知道怎么的,kalloc也开始报panic了。

我那个时候,我觉得糟透了。但是。忽然的,电光火石间,我想到了一些什么东西,我没有考虑并发。

结果是我粗暴的上了一把大锁,解决了并发问题,拿到了110分。

哎,我已经连着5天看到早上的白天,希望能乘着军训调整回状态。

解锁技能:防御性编程。

关键词:

上一篇:环球资讯:《金铲铲之战》S9艾欧尼亚挑战卡莎怎么玩
下一篇:最后一页