0

我一直在研究基于意大利面条的状态机,这意味着它是由一堆if-else散布在各处的语句组成的,最近在大型内核模块中,以便将该模块移植到其他平台

为了理解控制流如何在每个状态之间进行,我printk()首先使用打印每个行号,以便我可以在运行时查看程序行为的每个细节。但是,太多printk()会增加太多的处理负载并导致错误的行为。

之后,我尝试printk_once()减少printk_ratelimited()行数。但是这种方式会导致另一个问题,尤其是在过渡期间。

让我解释一下原因:

假设有四个状态ABCD,并且每个状态的控制流彼此部分重叠。此外,还有两个事件e1e2我可以通过插入/拔出硬件来触发。

此外,我们将状态定义stable state为稳定状态,这意味着该状态的控制流路径在事件发生之前不会改变;我们还将状态定义unstable state为不稳定状态,这意味着该状态只是其他状态的过渡状态。

event    current state    next state

x              A              A   <---- always start from A
e1             A              B
x              B              C
e2             C              D
x              D              A

A, C: stable state
B, D: unstable state

如果我使用printk_once(),我将无法获得整个控制流的所有路径AC因为它的某些部分是相同的,并且已经被打印出来。

如果我使用printk_ratelimited(),则不能保证捕获从A到转换的控制流路径,C因为跨度太短而无法捕获。

我想要的是一个控制流,它清楚地显示程序如何从一个状态A逐步B然后再到C,这样我就可以完全理解每个状态之间发生了什么。

而已。

我想知道人们是如何处理这个问题的。谢谢!

4

0 回答 0