I've been studying spaghetti-based state-machine, meaning that it's composed of a bunch of if-else statements scattered everywhere, in large kernel module recently in order to port this module to other platform.
To understand how control flow goes between each state, I use printk() in the first place to print every line number so that I can see every detail of program behavior in run-time. However, too many printk() increase too much processing load and result in wrong behavior.
Afterward, I try printk_once() and printk_ratelimited() to reduce line number. But this way causes another problem, especially at the time during transition.
Let me explain why:
Suppose there are four states A, B, C, and D, and each state's control flow is overlapped partly with each other. Also, there are two events e1 and e2 that I can trigger by plugging/unplugging hardware.
Furthermore, we define stable state as a state being stable, meaning that the path of control flow for this state is not changing until event occurs; We also define unstable state as a state being unstable, meaning that this state is just a transition state for other states.
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
If I use printk_once(), I'm not able to get all path of control flow from A to C as a whole, because some part of it are the same, and already be printed.
If I use printk_ratelimited(), it's not guaranteed to capture the path of control flow for transition from A to C because the span is too short to be captured.
What I want is a control flow that clearly shows how program runs step by step from state A to B then to C, so that I can totally understand what's going on between each state.
That's it.
I would like to know how people deal with this. Thanks!