郑工昨天问我,这样一个问题:“我想知道是谁调用了这个函数”,他在解决一个关于wifi的bug。
我想了一会儿说,在代码中插入一个空指针,让内核报一个空指针异常,可以打印一个栈帧信息。看到出错函数的调用关系。
可是还是有点麻烦,有木有,一种方式能够知道这个问题呢?自然是有的。
我们的函数总是“被”调用的。你可以想一下,main函数是被谁调用的?
也就是说无论怎么样,计算机都有一个控制流的执行起点,当需要完成某种特定的功能时,我们还需要调用一些已经存在的函数帮助我们。执行完以后还要返回到原来的函数。
在操作系统中,这些东东由一个叫做栈的区域去保存防止程序出错,帧是一大片连续的存储区,里面分成若干栈帧,它是栈的基本单位。
而栈帧的意义在于存储与当前正在执行的函数相关的信息。
调用者的信息 |
。 。 。 。 。 。 。 |
被调用者的信息 |