一種通用遞歸深度檢測技術 - 基於棧幀內容的檢測 - Golang語言描述

背景

在遞歸處理的調用中,在具體的工程實踐中通常會引入遞歸深度檢測,防止由於錯誤的數據形成系統的資源極大的消耗,本方法定義了一種通用簡單的遞歸檢查方法。函數

步驟

實現函數RecursiveDepthChecker

func RecursiveDepthChecker(max int) bool {
    //注意,這裏咱們跳過了本函數本身的棧,找到父調用的函數名
    caller, _, _, _ := runtime.Caller(1)
    currentFuncName := runtime.FuncForPC(caller).Name()
    stack := make([]byte, 65535*1) //max 1MB stack traceback
    //因爲Golang Runtime中不少關於棧的函數未導出,沒法使用。所以使用最骯髒的字符串檢測方法
    runtime.Stack(stack, false)
    start := 0
    depth := 0
    for {
        count := strings.Index(string(stack[start:]), currentFuncName)
        if count >= 0 {
            start += count + len(currentFuncName)
            depth++
        } else {
            break
        }
    }

    if depth > max {
        return false
    }
    return true
}

在須要進行檢測的函數用引入檢查便可

func TFunc() {
    fmt.Println("Start Caller...")
    if !RecursiveDepthChecker(5) {
        fmt.Println("Stack Overflow")
        return
    }
    TFunc()
}
相關文章
相關標籤/搜索