对于一些异常一般很难构建,尤其是像系统 API 调用、硬件故障等等,通过 FailPoints 可以在指定的代码段注入一些异常处理。
实际上,BSD 已经提供了一套相关的 FailPoints 机制。
BSD
首先,通过一个示例介绍如何使用。
假设有如下的函数,然后需要修改 DO STUFF
中的内容,那么应该如何进行测试。
rc = func(foo, bar, blatz);
if (rc) {
/* DO STUFF */
}
在原有的代码处添加一个 FailPoint ,如下。
#include <sys/fail.h>
rc = func(foo, bar, blatz);
KFAIL_POINT_CODE(FP_KERN, myfailpoint, error = RETURN_VALUE);
if (rc) {
/* DO STUFF */
}
然后可以通过 sysctl
处理。
----- 默认是关闭
# sysctl fail_point.kern.myfailpoint
fail_point.kern.myfailpoint: off
----- 设置异常场景
# sysctl fail_point.kern.myfailpoint=".1%return(5)"
fail_point.kern.myfailpoint: off -> .1%return(5)
也就是在执行到对应的代码块之后,会有 0.1%
的概率返回 sysctl 指定的值。
其它的操作还有。
1%sleep(100) # sleep for 100ms
1%panic() # panic immediately
1%break() # break to debugger
1%print() # print to console