我一直在研究基于意大利面条的状态机,这意味着它是由一堆if-else
散布在各处的语句组成的,最近在大型内核模块中,以便将该模块移植到其他平台。
为了理解控制流如何在每个状态之间进行,我printk()
首先使用打印每个行号,以便我可以在运行时查看程序行为的每个细节。但是,太多printk()
会增加太多的处理负载并导致错误的行为。
之后,我尝试printk_once()
减少printk_ratelimited()
行数。但是这种方式会导致另一个问题,尤其是在过渡期间。
让我解释一下原因:
假设有四个状态A
、B
、C
和D
,并且每个状态的控制流彼此部分重叠。此外,还有两个事件e1
,e2
我可以通过插入/拔出硬件来触发。
此外,我们将状态定义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()
,我将无法获得整个控制流的所有路径A
,C
因为它的某些部分是相同的,并且已经被打印出来。
如果我使用printk_ratelimited()
,则不能保证捕获从A
到转换的控制流路径,C
因为跨度太短而无法捕获。
我想要的是一个控制流,它清楚地显示程序如何从一个状态A
逐步B
然后再到C
,这样我就可以完全理解每个状态之间发生了什么。
而已。
我想知道人们是如何处理这个问题的。谢谢!