国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

深度細(xì)節(jié) | Go 的 panic 秘密都在這

共 18961字,需瀏覽 38分鐘

 ·

2021-09-06 03:05




前情提要


關(guān)于 panic 的時(shí)機(jī),在上篇 深度細(xì)節(jié) | Go 的 panic 的三種誕生方式 對(duì) panic 總結(jié)三種誕生方式:

  • 程序猿主動(dòng):調(diào)用 panic( ) 函數(shù);
  • 編譯器的隱藏代碼:比如除零場(chǎng)景;
  • 內(nèi)核發(fā)送給進(jìn)程信號(hào):比如非法地址訪問 ;

三種都?xì)w一到 panic( ) 函數(shù)的調(diào)用,指出 Go 的 panic 只是一個(gè)特殊的函數(shù)調(diào)用,是語(yǔ)言層面的處理。初學(xué) Go 的時(shí)候,奇伢心里也常常有些疑問:

  • panic 究竟是啥?是一個(gè)結(jié)構(gòu)體?還是一個(gè)函數(shù)?
  • 為什么 panic 會(huì)讓 Go 進(jìn)程退出的 ?
  • 為什么 recover 一定要放在 defer 里面才生效?
  • 為什么 recover 已經(jīng)放在 defer 里面,但是進(jìn)程還是沒有恢復(fù)?
  • 為什么 panic 之后,還能再 panic ?有啥影響?

今天便是深入到代碼原理,明確解答以上問題。Go 源碼版本聲明

Go 1.13.5


_panic 數(shù)據(jù)結(jié)構(gòu)


看看 _panic 的數(shù)據(jù)結(jié)構(gòu):

// runtime/runtime2.go
// 關(guān)鍵結(jié)構(gòu)體
type _panic struct {
    argp      unsafe.Pointer
    arg       interface{}    // panic 的參數(shù)
    link      *_panic        // 鏈接下一個(gè) panic 結(jié)構(gòu)體
    recovered bool           // 是否恢復(fù),到此為止?
    aborted   bool           // the panic was aborted
}

重點(diǎn)字段關(guān)注

  • link 字段:一個(gè)指向 _panic 結(jié)構(gòu)體的指針,表明 _panic_defer 類似,_panic 可以是一個(gè)單向鏈表,就跟 _defer 鏈表一樣;
  • recovered 字段:重點(diǎn)來了,所謂的 _panic 是否恢復(fù)其實(shí)就是看這個(gè)字段是否為 true,recover( ) 其實(shí)就是修改這個(gè)字段;


再看一下 goroutine 的兩個(gè)重要字段:

type g struct {
    // ...
    _panic         *_panic // panic 鏈表,這是最里的一個(gè)
    _defer         *_defer // defer 鏈表,這是最里的一個(gè);
    // ...
}

從這里我們看出:_defer_panic 鏈表都是掛在 goroutine 之上的。什么時(shí)候會(huì)導(dǎo)致 _panic 鏈表上多個(gè)元素?

panic( ) 的流程下,又調(diào)用了 panic( ) 函數(shù)。

這里有個(gè)細(xì)節(jié)要注意了,怎么才能做到 panic( ) 流程里面再次調(diào)用 panic( )

劃重點(diǎn):只能是在 defer 函數(shù)上,才有可能形成一個(gè) _panic 鏈表。因?yàn)?panic( ) 函數(shù)內(nèi)只會(huì)執(zhí)行 _defer 函數(shù) !


recover 函數(shù)


為了方便講解,我們由簡(jiǎn)單的開始分析,先看 recover 函數(shù)究竟做了什么?

defer func() {
    recover()
}()

recover 對(duì)應(yīng)了 runtime/panic.go 中的 gorecover 函數(shù)實(shí)現(xiàn)。


 1   gorecover 函數(shù)

func gorecover(argp uintptr) interface{} {
    // 只處理 gp._panic 鏈表最新的這個(gè) _panic;
    gp := getg()
    p := gp._panic
    if p != nil && !p.recovered && argp == uintptr(p.argp) {
        p.recovered = true
        return p.arg
    }
    return nil
}

這個(gè)函數(shù)可太簡(jiǎn)單了:

  1. 取出當(dāng)前 goroutine 結(jié)構(gòu)體;
  2. 取出當(dāng)前 goroutine 的 _panic 鏈表最新的一個(gè) _panic,如果是非 nil 值,則進(jìn)行處理;
  3. _panic 結(jié)構(gòu)體的 recovered 賦值 true,程序返回;

這就是 recover 函數(shù)的全部?jī)?nèi)容,只給 _panic.recovered 賦值而已,不涉及代碼的神奇跳轉(zhuǎn)。而 _panic.recovered 的賦值是在 panic 函數(shù)邏輯中發(fā)揮作用。


panic 函數(shù)


panic 的實(shí)現(xiàn)在一個(gè)叫做 gopanic 的函數(shù),位于 runtime/panic.go 文件。panic 機(jī)制最重要最重要的就是 gopanic 函數(shù)了,所有的 panic 細(xì)節(jié)盡在此。為什么 panic 會(huì)顯得晦澀,主要有兩個(gè)點(diǎn):

  1. 嵌套 panic 的時(shí)候,gopanic 會(huì)有遞歸執(zhí)行的場(chǎng)景;
  2. 程序指令跳轉(zhuǎn)并不是常規(guī)的函數(shù)壓棧,彈棧,在 recovery 的時(shí)候,是直接修改指令寄存器的結(jié)構(gòu)體,從而直接越過了 gopanic 后面的邏輯,甚至是多層 gopanic 遞歸的邏輯;
一切秘密都在下面這個(gè)函數(shù):
// runtime/panic.go
func gopanic(e interface{}) {
    // 在棧上分配一個(gè) _panic 結(jié)構(gòu)體
    var p _panic
    // 把當(dāng)前最新的 _panic 掛到鏈表最前面
    p.link = gp._panic
    gp._panic = (*_panic)(noescape(unsafe.Pointer(&p)))
    
    for {
        // 取出當(dāng)前最近的 defer 函數(shù);
        d := gp._defer
        if d == nil {
            // 如果沒有 defer ,那就沒有 recover 的時(shí)機(jī),只能跳到循環(huán)外,退出進(jìn)程了;
            break
        }

        // 進(jìn)到這個(gè)邏輯,那說明了之前是有 panic 了,現(xiàn)在又有 panic 發(fā)生,這里一定處于遞歸之中;
        if d.started {
            if d._panic != nil {
                d._panic.aborted = true
            }
            // 把這個(gè) defer 從鏈表中摘掉;
            gp._defer = d.link
            freedefer(d)
            continue
        }

        // 標(biāo)記 _defer 為 started = true (panic 遞歸的時(shí)候有用)
        d.started = true
        // 記錄當(dāng)前 _defer 對(duì)應(yīng)的 panic
        d._panic = (*_panic)(noescape(unsafe.Pointer(&p)))

        // 執(zhí)行 defer 函數(shù)
        reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz))

        // defer 執(zhí)行完成,把這個(gè) defer 從鏈表里摘掉;
        gp._defer = d.link
        
        // 取出 pc,sp 寄存器的值;
        pc := d.pc
        sp := unsafe.Pointer(d.sp)
        // 如果 _panic 被設(shè)置成恢復(fù),那么到此為止;
        if p.recovered {
            // 摘掉當(dāng)前的 _panic
            gp._panic = p.link
            // 如果前面還有 panic,并且是標(biāo)記了 aborted 的,那么也摘掉;
            for gp._panic != nil && gp._panic.aborted {
                gp._panic = gp._panic.link
            }
            // panic 的流程到此為止,恢復(fù)到業(yè)務(wù)函數(shù)堆棧上執(zhí)行代碼;
            gp.sigcode0 = uintptr(sp)
            gp.sigcode1 = pc
            // 注意:恢復(fù)的時(shí)候 panic 函數(shù)將從此處跳出,本 gopanic 調(diào)用結(jié)束,后面的代碼永遠(yuǎn)都不會(huì)執(zhí)行。
            mcall(recovery)
            throw("recovery failed"// mcall should not return
        }
    }

    // 打印錯(cuò)誤信息和堆棧,并且退出進(jìn)程;
    preprintpanics(gp._panic)
    fatalpanic(gp._panic) // should not return
    *(*int)(nil) = 0      // not reached
}

上面邏輯可以拆分為循環(huán)內(nèi)循環(huán)外兩部分去理解:

  • 循環(huán)內(nèi):程序執(zhí)行 defer,是否恢復(fù)正常的指令執(zhí)行,一切都在循環(huán)內(nèi)決定;
  • 循環(huán)外:一旦走到循環(huán)外,說明 _panic 沒人處理,認(rèn)命吧,程序即將退出;


 for 循環(huán)內(nèi)


循環(huán)內(nèi)的事情拆解成:

  1. 遍歷 goroutine 的 defer 鏈表,獲取到一個(gè) _defer 延遲函數(shù);
  2. 獲取到 _defer 延遲函數(shù),設(shè)置標(biāo)識(shí) d.started,綁定當(dāng)前 d._panic(用以在遞歸的時(shí)候判斷);
  3. 執(zhí)行 _defer 延遲函數(shù);
  4. 摘掉執(zhí)行完的 _defer 函數(shù);
  5. 判斷 _panic.recovered 是否設(shè)置為 true,進(jìn)行相應(yīng)操作;
    1. 如果是 true 那么重置 pc,sp 寄存器(一般從 deferreturn 指令前開始執(zhí)行),goroutine 投遞到調(diào)度隊(duì)列,等待執(zhí)行;
  6. 重復(fù)以上步驟;

 1   思考問題有答案了!


你會(huì)發(fā)現(xiàn),更改 recovered 這個(gè)字段的時(shí)機(jī)只有在第三個(gè)步驟的時(shí)候。在任何地方,你都改不到 _panic.recovered 的值。

問題一:為什么 recover 一定要放在 defer 里面才生效?

因?yàn)?,這是唯一的修改 _panic.recovered 字段的時(shí)機(jī) !

舉幾個(gè)對(duì)比的栗子:

func main() {
    panic("test")
    recover()
}

上面的例子調(diào)用了 recover( ) 為什么還是 panic ?

因?yàn)?strong>根本執(zhí)行不到 recover 函數(shù),執(zhí)行順序是:

    panic 
        gopanic
            執(zhí)行 defer 鏈表 
            exit

有童鞋較真,那我把 recover()panic("test") 前面唄?

func main() {
    recover()
    panic("test")
}

不行,因?yàn)閳?zhí)行 recover 的時(shí)候,還沒有 _panic 掛在 goroutine 上面呢,recover 了個(gè)寂寞。

問題二:為什么 recover 已經(jīng)放在 defer 里面,但是進(jìn)程還是沒有恢復(fù)?

回憶一下上面 for 循環(huán)的操作:

    // 步驟:遍歷 _defer 鏈表
    d := gp._defer
    // 步驟:執(zhí)行 defer 函數(shù)
    reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz))
    // 步驟:執(zhí)行完成,把這個(gè) defer 從鏈表里摘掉;
    gp._defer = d.link

劃重點(diǎn):在 gopanic 里,只遍歷執(zhí)行當(dāng)前 goroutine 上的 _defer 函數(shù)鏈條。所以,如果掛在其他 goroutine 的 defer 函數(shù)做了 recover ,那么沒有絲毫用途。

舉一個(gè)栗子:

func main() { // g1
    go func() { // g2
        defer func() {
            recover()
        }()
    }()
    panic("test")
}

因?yàn)椋?code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">panic 和 recover  在兩個(gè)不同的 goroutine,_panic 是掛在 g1 上的,recover 是在 g2 的 _defer 鏈條里。

gopanic 遍歷的是 g1 的 _defer 函數(shù)鏈表,跟 g2 八桿子打不著,g2 的 recover 自然拿不到 g1 的 _panic 結(jié)構(gòu),自然也不能設(shè)置 recovered 為 true ,所以程序還是崩了。

問題三:為什么 panic 之后,還能再 panic ?有啥影響?

這個(gè)其實(shí)很容易理解,有些童鞋可能想復(fù)雜了。gopanic 只是一個(gè)函數(shù)調(diào)用而已,那函數(shù)調(diào)用為啥不能嵌套遞歸?

當(dāng)然可以。

觸發(fā)的場(chǎng)景一般是:

  • gopanic 函數(shù)調(diào)用 _defer 延遲函數(shù);
  • defer 延遲函數(shù)里面又調(diào)用了 panic/gopanic 函數(shù);

這不就有了嘛,就是個(gè)簡(jiǎn)單的函數(shù)嵌套而已,沒啥不可以的,并且在這種場(chǎng)景下,_panic 結(jié)構(gòu)體就會(huì)從 gp._panic 開始形成了一個(gè)鏈表。

gopanic 函數(shù)指令執(zhí)行的特殊在于兩點(diǎn):

  1. _panic 被人設(shè)置成 recovered 之后,重置 pc,sp 寄存器,直接跨越 gopanic (還有嵌套的函數(shù)棧),跳轉(zhuǎn)到正常業(yè)務(wù)流程中;
  2. 循環(huán)之外,等到最后,沒人處理 _panic 數(shù)據(jù),那就 exit 退出進(jìn)程,終止后續(xù)所有指令的執(zhí)行;

舉個(gè)嵌套的栗子:

func main() {
    defer func() { // 延遲函數(shù)
        panic("panic again")
    }()
    panic("first")
}

函數(shù)執(zhí)行:

    gopanic
        defer 延遲函數(shù) 
            gopanic
                無 defer 延遲函數(shù)(遞歸往上),終止條件達(dá)成
                
     // 打印堆棧,退出程序
    fatalpanic

童鞋你理解了嗎?下面就來考考你哦??匆粋€(gè)栗子:

func main() {
    println("=== begin ===")
    defer func() { // defer_0
        println("=== come in defer_0 ===")
    }()
    defer func() { // defer_1
        recover()
    }()
    defer func() { // defer_2
        panic("panic 2")
    }()
    panic("panic 1")
    println("=== end ===")
}

上面的函數(shù)會(huì)出打印堆棧退出進(jìn)程嗎?

答案是:不會(huì)。 猜一下輸出是啥?終端輸出結(jié)果如下:

?  panic ./test_panic
=== begin ===
=== come in defer_0 ===

你猜對(duì)了嗎?奇伢給你梳理了一下完整的路線:

main
    gopanic // 第一次
        1. 取出 defer_2,設(shè)置 started
        2. 執(zhí)行 defer_2 
            gopanic // 第二次
                1. 取出 defer_2,panic 設(shè)置成 aborted
                2. 把 defer_2 從鏈表中摘掉
                3. 執(zhí)行 defer_1
                    - 執(zhí)行 recover
                4. 摘掉 defer_1
                5. 執(zhí)行 recovery ,重置 pc 寄存器,跳轉(zhuǎn)到 defer_1 注冊(cè)時(shí)候,攜帶的指令,一般是跳轉(zhuǎn)到 deferreturn 上面幾個(gè)指令

    // 跳出 gopanic 的遞歸嵌套,直接到執(zhí)行 deferreturn 的地方;
    defereturn
        1. 執(zhí)行 defer 函數(shù)鏈,鏈條上還剩一個(gè) defer_0,取出 defer_0;
        2. 執(zhí)行 defer_0 函數(shù)
    // main 函數(shù)結(jié)束

再來一個(gè)對(duì)比的例子:

func main() {
    println("=== begin ===")
    defer func() { // defer_0
        println("=== come in defer_0 ===")
    }()
    defer func() { // defer_1
        panic("panic 2")    
    }()
    defer func() { // defer_2
        recover()
    }()
    panic("panic 1")
    println("=== end ===")
}

上面的函數(shù)會(huì)打印堆棧,并且退出嗎?

答案是:會(huì)。輸出如下:

?  panic ./test_panic
=== begin ===
=== come in defer_0 ===
panic: panic 2

goroutine 1 [running]:
main.main.func2()
 /Users/code/gopher/src/panic/test_panic.go:9 +0x39
main.main()
 /Users/code/gopher/src/panic/test_panic.go:11 +0xf7

奇伢給你梳理的執(zhí)行路徑如下:

main
    gopanic // 第一次
        1. 取出 defer_2,設(shè)置 started
        2. 執(zhí)行 defer_2 
            - 執(zhí)行 recover,panic_1 字段被設(shè)置 recovered
        3. 把 defer_2 從鏈表中摘掉
        4. 執(zhí)行 recovery ,重置 pc 寄存器,跳轉(zhuǎn)到 defer_1 注冊(cè)時(shí)候,攜帶的指令,一般是跳轉(zhuǎn)到 deferreturn 上面幾個(gè)指令

    // 跳出 gopanic 的遞歸嵌套,執(zhí)行到 deferreturn 的地方;
    defereturn

        1. 遍歷 defer 函數(shù)鏈,取出 defer_1   
        2. 摘掉 defer_1
        2. 執(zhí)行 defer_1
            gopanic // 第二次
                1. defer 鏈表上有個(gè) defer_0,取出來;
                2. 執(zhí)行 defer_0 (defer_0 沒有做 recover,只打印了一行輸出)
                3. 摘掉 defer_0,鏈表為空,跳出 for 循環(huán)
                3. 執(zhí)行 fatalpanic
                    - exit(2) 退出進(jìn)程

你猜對(duì)了嗎?


 2   recovery 函數(shù)


最后,看一下關(guān)鍵的 recovery 函數(shù)。在 gopanic 函數(shù)中,在循環(huán)執(zhí)行 defer 函數(shù)的時(shí)候,如果發(fā)現(xiàn) _panic.recovered 字段被設(shè)置成 true 的時(shí)候,調(diào)用 mcall(recovery) 來執(zhí)行所謂的恢復(fù)。

看一眼 recovery 函數(shù)的實(shí)現(xiàn),這個(gè)函數(shù)極其簡(jiǎn)單,就是恢復(fù) pc,sp 寄存器,重新把 Goroutine 投遞到調(diào)度隊(duì)列中。

// runtime/panic.go
func recovery(gp *g) {
    // 取出棧寄存器和程序計(jì)數(shù)器的值
    sp := gp.sigcode0
    pc := gp.sigcode1
    // 重置 goroutine 的 pc,sp 寄存器;
    gp.sched.sp = sp
    gp.sched.pc = pc
    // 重新投入調(diào)度隊(duì)列
    gogo(&gp.sched)
}

重置了 pc,sp 寄存器代表什么意思?

pc 寄存器指向指令所在的地址,換句話說,就是跳轉(zhuǎn)到其他地方執(zhí)行指令去了。而不是順序執(zhí)行 gopanic 后面的指令了,補(bǔ)回來了。

_defer.pc 的指令行,這個(gè)指令是哪里?

這個(gè)要回憶一下 defer 的章節(jié),defer 注冊(cè)延遲函數(shù)的時(shí)候?qū)?yīng)一個(gè) _defer 結(jié)構(gòu)體,在 new 這個(gè)結(jié)構(gòu)體的時(shí)候,_defer.pc 字段賦值的就是 new 函數(shù)的下一行指令。這個(gè)在 Golang 最細(xì)節(jié)篇 — 解密 defer 原理,究竟背著程序猿做了多少事情? 詳細(xì)說過。

舉個(gè)例子,如果是棧上分配的話,那么在 deferprocStack ,所以,mcall(recovery) 跳轉(zhuǎn)到這個(gè)位置,其實(shí)后續(xù)就走 deferreturn 的邏輯了,執(zhí)行后續(xù)的 _defer 函數(shù)鏈。

本次 panic 就到此為止,相當(dāng)于就恢復(fù)了程序的正常運(yùn)行。

當(dāng)然,如果后續(xù)在 defer 函數(shù)里面又出現(xiàn) panic ,那可能形成一個(gè) _panic 的鏈條,但是每一個(gè)的處理還是一樣的。

劃重點(diǎn):函數(shù)的 call,ret 是最常見的指令跳轉(zhuǎn)。最本源的就是 pc 寄存器,函數(shù)壓棧,出棧的時(shí)候,修改的也是 pc 寄存器,在 recovery 流程里,則來的更直接一點(diǎn),直接改 pc ,sp。


 for 循環(huán)外

走到 for 循環(huán)外,那程序 100% 要退出了。因?yàn)?fatalpanic 里面打印一些堆棧信息之后,直接調(diào)用 exit 退出進(jìn)程的。到這已經(jīng)沒有任何機(jī)會(huì)了,只能乖乖退出進(jìn)程。

退出的調(diào)用就在 fatalpanic 里:

func fatalpanic(msgs *_panic) {
    // 1. 打印協(xié)程堆棧

    // 2. 退出進(jìn)程
    systemstack(func() {
        exit(2)
    })

    *(*int)(nil) = 0 // not reached
}

所以這個(gè)問題清楚了嘛:為什么 panic 會(huì)讓 Go 進(jìn)程退出的 ?

還能為啥,因?yàn)檎{(diào)用了 exit(2) 嘛。


總結(jié)


  1. panic() 會(huì)退出進(jìn)程,是因?yàn)檎{(diào)用了 exit 的系統(tǒng)調(diào)用;
  2. recover() 并不是說只能在 defer 里面調(diào)用,而是只能在 defer 函數(shù)中才能生效,只有在 defer 函數(shù)里面,才有可能遇到 _panic 結(jié)構(gòu);
  3. recover() 所在的 defer 函數(shù)必須和 panic 都是掛在同一個(gè) goroutine 上,不能跨協(xié)程,因?yàn)?gopanic 只會(huì)執(zhí)行當(dāng)前 goroutine 的延遲函數(shù);
  4. panic 的恢復(fù),就是重置 pc 寄存器,直接跳轉(zhuǎn)程序執(zhí)行的指令,跳轉(zhuǎn)到原本 defer 函數(shù)執(zhí)行完該跳轉(zhuǎn)的位置(deferreturn 執(zhí)行),從 gopanic 函數(shù)中跳出,不再回來,自然就不會(huì)再 fatalpanic ;
  5. panic 為啥能嵌套?這個(gè)問題就像是在問為什么函數(shù)調(diào)用可以嵌套一樣,因?yàn)檫@個(gè)本質(zhì)是一樣的。

后記


panic 就是一個(gè)函數(shù)調(diào)用,沒啥特殊的。點(diǎn)贊、在看 是對(duì)奇伢最大的支持。


~完~


往期推薦



往期推薦



深度細(xì)節(jié) | Go 的 panic 的三種誕生方式

Go 存儲(chǔ)基礎(chǔ) — “文件”被偷偷修改?來,給它裝個(gè)監(jiān)控!

Go 并發(fā)編程 — 結(jié)構(gòu)體多字段的原子操作

深入理解 Linux 的 epoll 機(jī)制

自制文件系統(tǒng) —— 05 總結(jié):一切都為了狙擊“文件”



堅(jiān)持思考,方向比努力更重要。關(guān)注我:奇伢云存儲(chǔ)

瀏覽 74
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 成人网站在线| av网站免费在线观看| 91羞射短视频在线观看| 91人人妻| 九九精品久久| 欧美精品系列| 男人视频网站| 9l蝌蚪PORNY中文| 乱码中文字幕日韩欧美在线| 亚洲AV成人片无码网站网蜜柚| 性欧美69| 欧美二区三区| 免费看黄色毛片| 91人妻日韩人妻无码专区精品| 黄色操逼网站| 日韩欧美爱爱| 欧美另类色| 日本一区二区视频在线| 精品狼友| 日韩中文字幕无码人妻| 99热免费| 视频一区中文字幕| 亚洲av高清无码| 欧美激情另类| 九九九九九九精品| 国产香蕉视频在线播放| 欧美午夜精品久久久久免费视| 人人妻人人澡人人爽久久con| 青青草视频在线免费观看| 亚洲久久久久久| 91人妻人人澡人人爽人妻| 东京热日韩无码| 亚洲无码午夜| 日韩人妻电影| 五月婷婷中文字幕| 高清无码视频免费观看| 日韩成人在线免费观看| 在线无码一区二区三区| 北条麻妃精品在线| 爱搞搞爱干干| 97人妻人人澡人人| 一级a一级a爱片兔兔软件| 六月丁香五月| 一道本一区二区三区免费视频| 成人在线黄色视频| 狼友视频在线播放| 四季AV综合网站| 日韩乱伦av| 久久久精品网站| 亚洲精品高清视频| 日韩Va| AV无码国产| 日韩一级视频| 在线播放你懂的| 天天操夜夜操狠狠操| 一级片久久| 免费一级大片| 中文字幕亚洲第一| 欧美日黄| 日韩不卡视频在线观看| 超碰午夜| 手机看片福利视频| 免费看一级高潮毛片| 91视频免费观看| 久久人妻| 先锋影音在线资源| 污视频免费在线观看| 一本色道久久88加勒比| 日韩精品91| 欧美一区二区三区免费| 强奸乱伦五月天| 久草视频福利在线| 国产麻豆一区二区三区| 中文字幕av网| 丁香久久婷婷| 亚洲三级黄片| 18精品爽视频| 亚洲免费av在线| 亚洲香蕉国产| 亚洲无码午夜| 大香蕉福利在线| 免费看三级网站| 三级理论片| 欧美国产日韩欧美亚洲国产| 精品夜夜澡人妻无码AV| 亚洲天堂无码| 俺去也| 国产激情视频在线| 国产久久视频| av无码在线观看| 欧美操比视频| 500部大龄熟乱4K视频| 18禁www| 中文字幕第八页| A级成人网站| 在线中文av| 中文字幕日韩在线视频| 成人午夜激情| 亚洲日韩在线观看视频| 99伊人| 国产成人精品一区二区三区| 久久综合中文| 黄色小视频在线观看| www.国产在线| 欧美性猛交XXXX乱大交3| a网站在线观看| 久久久无码精品亚洲| 中文字幕AV播放| 中文字幕国产精品| 人人操人人干人人摸| 91探花在线观看| 影音先锋二区| 日韩中文字幕AV| 欧美9999| 91视频一区二区| 安徽妇女BBBWBBBwm| 亚洲vs无码秘蜜桃少妇| 果冻传媒A片一二三区| 日韩视频在线免费观看| 日韩视频一区| 精品无套| 成年人性生活免费视频| 中国毛片网站| 人人人干| 美女网站永久免费观看| 天堂性爱AV| 欧美性生交18XXXXX无码| 五月天婷婷网站| 在线观看日韩视频| 欧美日韩中文字幕在线视频| 免费黄色视频在线| 麻豆一区二区三区四区| 在线黄色AV| 亚洲黄色影视| 成人做爰黄AA片免费看三区| 狠狠干大香蕉| 黄色亚洲| 浙江妇搡BBBB搡BBBB| 成人在线乱码视频| 成人肏逼视频在线| 91探花精品偷拍在线播放| 影音先锋女人aV鲁色资源网站| 久久亚洲AV无码午夜麻豆| 亚洲xxxxxx| 经典三级在线视频| 毛片资源| 91叉叉叉| 激情五月天网址| 俺来也俺就去www色情网| 青草青视频| 色欲AV在线| 91老熟女| 99热加勒比| 91久久久久久久91| 国产一区二区不卡视频| 特黄一级片| 国产免费观看视频| 婷婷精品在线视频| 狠狠操狠狠操狠狠操| 黄色小视频在线免费观看| 黄色片a| 国产无码高清| 搡BBBB搡BBB搡五十粉嫩| v天堂在线观看| 俺来也俺去www色情网| h片无码| 国产精品免费观看久久久久久久久 | 无码导航| 欧美另类综合| 亚洲无码成人片| 残忍另类BBWBBWBBW| 免费在线观看AV网站| 99久久综合国产精品二区| 肏屄综合网| xxxxxbbbbb| 一道本无码在线观看| 亚洲无码在线免费视频| 岛国免费av| 91AV在线播放| 天天日天天干麻豆| 老太色HD色老太HD.| 日韩少妇| 国内毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 日韩av中文| 18禁一区| 九九热精品在线视频| 人人操在线| 亚洲日韩免费在线观看| 免费人成视频观看| 操逼视频网站免费| 国产麻豆性爱视频| 免费AV网站在线| 亚洲中文字幕第一| 亚洲国产成人无码a在线播放| 日B视频在线观看| 奇米狠狠操| 亚洲AV无码成人精品涩涩麻豆| 肏逼网站| 国产小视频免费在线观看| 免费观看黄片视频| 免费二区| 翔田AV无码秘三区| 视频一区中文字幕| 五月丁香六月久久| 国产主播AV| 亚洲无码资源| 国产在线观看无码免费视频| 国产三级无码| 另类老妇性bbwbbwbbw| 亚洲四房播| 国产手机拍视频推荐2023 | 男女av免费| 亚洲V国产v欧美v久久久久久 | 国产精品宾馆在线| 男人亚洲天堂| 中文字幕无码在线视频| 午夜成人小视频| 精品无码免费视频| 免费在线黄色视频| 三级三级久久三级久久18| 亚洲无码免费观看| 囯产一级黄片| 日韩无码操逼| 91久久国产综合久| 91亚洲国产| 亚洲内射网| 无套内射无码| 丰满人妻精品一区二区在线| 国产视频久久久| 亚洲激情成人| 蜜桃视频app| 亚人精品中文字幕在线观看| 日韩日逼视频| 欧美性爱动态| 国产日本在线观看| 99色色网| 大香蕉电影网| 天天日天天干天天爽| 五月婷视频| 国产真实乱婬A片三区高清蜜臀| 免费在线观看黄色视频网站| 99er这里只有精品| 免费Av在线| 91欧美日韩综合| 91精品婷婷国产综合久久韩漫| 国产福利免费视频| 91丨九色丨蝌蚪丨丝袜| 亚洲秘无码一区二区三区,| 免费成人黄视频| 在线天堂a| 国产三级三级三级| 无码视频免费在线观看| 国产成人精品亚洲男人的天堂 | www.中文字幕| 操女人的网站| 一本色综合亚洲精品| 免费69视频| 欧美性爱一级视频| 天堂在线9| 亚洲欧美精品在线| 国产高清AV| 亚洲精品福利视频导航| 日韩性做爰免费A片AA片| 日韩人妻无码专区| 人人肏人人射| 亚洲天堂男人的天堂| 国产精品一区二区在线| 久久草草热国产精| 狠狠干狠狠艹| 啊啊啊网站| 婷婷手机在线| 夜色88V精品国产亚洲| 熟练中出-波多野结衣| 国产福利视频| 免费av观看| 精品在线第一页| 国产黄色一级片| 麻豆999| 另类色综合| 美女毛片视频| 日韩成人无码精品| а√最新版在线中文8| 青草视频在线| 午夜尤物| 国产精品国产三级国产专业不| 亚洲vs无码秘蜜桃少妇小说| 五月婷婷综合激情| 青青草国产亚洲精品久久| 日本高清一区二区高清免费视频 | 家庭乱伦av| 北条麻妃视频在线| 美女被操面费网站| 婷婷久久亚洲| 国产欧美综合视频| 99黄网| 欧美熟妇精品一级A片视色| 444444免费高清在线观看电视剧的注意| A片国产| 热99| 91国产精品在线视频| 在线内射视频| 99热在线播放| 91亚洲国产成人久久精品网站| 国产婷婷色一区二区在线观看| 日韩草比| 无码区一区二区| 操逼的网站| 国产1区在线观看| 色婷婷一区二区三区久久午夜| 日韩无码免费视频| 欧美熟妇高潮流白浆| 中文字幕AV无码| 麻豆精品传媒国产剧的特点 | 欧美插菊花综合网| 国产视频99| 电家庭影院午夜| 欧美日韩中文| 一区二区三区视频| 99久久99久久兔费精桃| 山东wBBBB搡wBBBB| 无码人妻丰满熟妇区17水蜜桃| 91麻豆精品国产91久久久吃药 | 一区二区三区欧美| 欧美成人电影在线观看| 国产精品性爱视频| 婷婷在线影院| 日韩在线成人| 欧美爱| 老熟妇搡BBBB搡BBBB| 性爱无码| 久草免费福利| 亚洲黄色电影网站| 国产精品777777| 久久综合中文| 亚洲无码一卡| 你懂得在线观看| 99视频色| 日韩人妻丝袜中文字幕| 日日夜夜精品| 中文字幕精品视频在线观看| 久99热| 国产精品福利在线播放| 人妻无码一区二区三区摄像头| 国产一区二区免费在线观看| 欧美少妇视频| 天天天天天天天天干| 日韩乱伦av| 大香蕉av一区二区三区在线观看 | 亚洲成人少妇老妇a视频在线| 色五月婷婷久久| 中文字幕成人在线| 狠狠干2025| 九色91视频| 毛片无遮挡| 高清无码视频在线播放| 久草电影网站| 视色网| 干少妇视频| 牛牛影视av| 成人免费A片视频| 成人免费视频国产免费麻豆,| 黄片91| 欧美另类| 美女操网站| wwwAV| 3d动漫一区二区| 国产视频福利在线| 国产午夜精品视频| 亚洲欧美日本在线观看| 性欧美V| 日韩AV在线免费| 免费一级欧美片在线观看| 四虎成人精品无码永久在线的客服| 一级黄片学生妹| 青青草手机在线观看| 久草在在线视频| 国产成人ab| 手机AV免费| www四虎com| 欧美日韩中文在线视频| 一二三区视频| 综合激情av| 激情五月丁香五月| 亚洲xxxxxx| 亚洲一级内射| 18成人网站在线观看| 无码人妻一区二区三区精品不付款| 亚洲第一黄色视频| 操逼免费观看| www久久99| 中文字幕一级A片免费看| 日本成人毛片| 不卡一二三区| 91欧美精品| 亚洲精品乱码在线| 亚洲秘无码一区二区三区,| 日韩欧美91| 韩国成人啪啪无码高潮| 丁香六月婷婷综合激情欧美| 国产精品123区| 日韩中文字幕在线免费观看| 国产熟女一区二区三区五月婷| 豆花视频成人版www满18| A级视频网| 操逼视频无码| 好好的日视频| 亚洲精品欧美| 国产毛片毛片| 天天躁狠狠躁夜躁2024| av黄页| 亚洲精品视频在线观看免费| 91在线视频精品| 天天干91| 九九热精品| 亚洲最大福利视频| 丁香花中文字幕| 久久综合热| 中文字幕日韩美| 超碰在线观看97| 在线色网站| 国产精品国内自产拍| 中文字幕在线观看不卡| 九九re| 一本色道久久加勒比精品| 东方av在线播放| 一级黄色大毛片| 操逼网首页| 青青草视频免费在线观看| 国产一级特黄A片| 竹菊传媒一区二区三区| 国产无套在线观看| av天堂中文在线| 亚洲无码一区二区三| 成人在线免费视频观看| 中字无码制服| 艹b视频在线观看| 日韩高清av| 久久久久久久艹| 老女人日逼| 淫色五月| 超碰2025| 亚洲小电影在线| 五月丁香六月情| 成人网在线观看| 亚洲第一成人久久网站| 亚洲一级黄色电影| 成人高清无码在线观看| 久久久一级| 51妺嘿嘿午夜福利| 欧美熟妇一区二区| a在线观看免费| av无码中文字幕| 黄色av免费网站| 国产探花视频在线免费观看| 亚洲久久久久久| 国产伦精品一级A片视频夜夜| 国产麻豆视频| 99高清无码| 亚洲人妖在线| 国产精品福利在线观看| A视频免费观看| 亚洲精品无码一区| 成人在线视频免费观看| 日韩av中文字幕在线| 最新中文字幕无码| 97精品| jzzijzzij亚洲成熟少妇在线播放| 一本色道久久综合狠狠躁| 黄色片网站在线观看| 无码无码无码| 男女av在线观看| 污污污污污www网站免费观看| 69av电影| AA无码| 日韩成人高清| 蝌蚪窝免费在线视频| 操逼视频在线免费观看| 亚洲一级视频在线观看| 五月天深爱激情网| 爱搞逼综合网| 国产成人精品av| 久草视频在线免费播放| 蜜桃av.38| 神马午夜精品| 日本A片免费| AA级黄色视频| 亚色天堂| 国产精品成人免费久久黄AV片| 色噜噜狠狠一区二区三区| www久久| 日韩麻豆| A片国产| 激情A| 97无码精品人妻| 啊啊啊啊啊网站| 日韩AV自拍| 特级毛片在线观看| 亚洲有码在线观看| 老熟女91| 爱爱爱爱网| 欧美三级长视频| 人人妻人人爽人人澡人人精品 | 国产成人精品无码片区在线观91 | 北条麻妃一区二区三区在线| 狠狠干在线视频| 熟女天堂| 日韩欧美91| 乌克兰xxxx| 国产三级黄片| 欧美午夜成人一区二区三区| 国产欧美综合三级伦| 永井玛丽亚av无码中出流出| 少妇嫩搡BBBB搡BBBB| 伊人精品在线| 国产精品男女| 女人特级毛片18| 国产黄色网页| 久久久久久久麻豆| 久久久久久大香蕉| 亚日韩视频| 最近中文字幕免费mv第一季歌词強上| 国内精品卡一卡二卡三| 亚洲成人在线观看视频| 豆花视频成人网站入口| 六月丁香五月婷婷| 超碰在线大香蕉| 黄色片网站免费观看| 欧美日韩在线观看一区二区三区| 婷婷色777777| 五月天无码| 国产无码操逼| 色视频免费在线观看| 伊人日日| 色噜噜狠狠一区二区三区Av蜜芽| 国产又爽又黄A片| 大香蕉1024| 先锋影音AV资源站| 在线亚洲日韩| 国内精品一区二区| 亚洲清高毛无码毛片| 69福利视频| 人妻啪啪| 国产地址| 开心四房播播第四婷婷| 久久久久久亚洲Av无码精品专口| 日本三区| 精品亚洲一区二区三区四区五区| 草比网站| 无套进入无套内谢| yw在线观看| 久久午夜无码鲁丝片| 九九视频免费观看| 欧美后门菊门交3p、| 伊人啪啪| 小H片在线观看| 亚洲欧美久久| 91丨熟女丨首页| 蜜臀久久99精品久久久兰草影视| 日韩欧美小电影| 三级成人av| 88海外华人免费一区| 中文字字幕在线中文乱码电影| 日逼电影网| 亚洲日韩视频在线播放| 国产亚洲精品午夜福利巨大软件| 国产欧美日韩综合精品| 玖玖爱AV| 国产色视频| 精品99视频| 日操夜操| 欧美操b视频| 人妻少妇偷人精品久久| 婷婷视频导航| 蝌蚪AV| 免费黄色成人网站| 午夜高清无码| 黄片免费看视频| 亚洲AV无码永久精品| 国产成人AV一区二区三区在线观看| 91人人妻人人做人人爽| 中文无码人妻少妇| 天天天天干| 日韩免费一级片| 91在线日韩| 亚洲乱码在线观看| 欧洲一区在线观看| 黄色片久久| 亚欧美日韩| 亚洲成人中文字幕在线| 超碰在线91| 国产成人秘免费观看一区二区三区 | 在线二区| 西西444WWW大胆无视频软件亮点| 狼人狠狠干| 久久精品苍井空免费一区二| 骚网站在线观看| 日韩AV自拍| 伊人网导航| 99久操| 国产精品久久久久久久免牛肉蒲 | 日韩乱伦小说| a免费视频| 免费看黄片,在线观看| 成人色色网站| 国产女人18毛片水18精品| 亚洲天堂影音先锋| 色色网的五月天| 国产3p露脸普通话对白| 九九九色视频| 一级毛AA片| 欧美一区二区| 国产一级内射| 天天插天天干| 久久久久成人片免费观看蜜芽| 熟练中出-波多野结衣| 国产视频一区二区三区四区五区 | 韩国一区二区三区在线观看| 日韩A片免费| 人人操人人爽| 国产精品久久久久久久久| 性BBwBBwBBwBBw禽| 九色PORNY自拍视频| 成人无码视频在线观看| 国产免费AV网站| 黄色AV免费在线观看| a片免费网站| 先锋资源一区| 欧美在线中文| 91九色TS另类国产人妖| 新BBWBBWBBWBBW| 久久先锋| 99re99热| 精品国产999久久久免费| 中文字幕无码精品| 一级a片在线| 亚洲午夜无码精品专区| 91免费观看国产| 国产高清做爱| 伊人免费视频| 波多野结衣一区二区三区| 91精品久久久久久| 六月色| 亚洲无码动漫| jizzjizzjizzjizz| 九九热精品视频在线播放| 嘿嘿午夜| 一本道中文字幕| 岛国av在线播放| 麻豆精品在线| 91丨熟女丨首页| 少妇搡BBBB搡BBB搡造水爽| 正在播放JUQ-878木下凛凛子| 国产精品一区二区性色AV| 欧美综合精品| 91调教视频| 国产操逼视频网站| 日本少妇网站| 无码成人av| 成人三级片免费| 日韩人妻精品无码| 成人AV中文解说水果派| 国产在线无码视频| 久草手机视频| 国产AV不卡| 人人干人人操人人摸| 中文字幕人妻丰满熟妇| 白嫩外女BBWBBWBBW| 午夜福利亚洲| 欧美国产精品一二三产品在哪买 | 国产黄色视频免费| 国产最新视频| 一级a一级a免费观看视频Al明星| 黄色美女视频网站| 欧美中文字幕在线视频| 污网站免费在线观看| 91在线视频精品| 大香蕉69| 蜜桃精品视频| 青娱乐青青草| 国产日逼视频| 天堂在线社区| 女人自慰网站在线观看| 免费一级黄色毛片| 韩国精品一区| 亚洲美女网站| 日本亚洲精品秘入口A片| 高清无码视频直接看| 亚洲成人a| 婷婷五月中文| 色播一区| 欧美一级婬片AAAAAA片| 亚洲欧美高清| 中文无码一区| 国产又爽又黄免费视频免费| 一级片| 狠狠操网站| 五月丁香色婷婷| 无码视频在线| 国产vA| 一级a片在线免费观看| 免费AV资源在线观看| 国产一区二区三区四区五区六区七区 | www.国产在线| 精品久久久久久久久久| 丁香六月激情| 蜜桃91精品秘入口| 逼逼75大秀| 亚洲国产成人在线| 欧美日韩三级在线| 第四色视频| 成人性爱视频网| 免费黄色欧美| 偷拍二区| 人妻操逼| 肏屄免费视频| 国产在线激情| 色秘乱码一区二区三区| 国产AV日韩AⅤ亚洲AV中文| 99国产精品久久久久久久| 欧美一区二区三区四| 2018中文字幕第一页| 筱田步美| 狠狠躁日日躁夜夜躁2022麻豆| 日本三区| 久久嫩草精品久久久久| 安徽妇女BBBWBBBwm| 亚洲不卡视频| 日韩精品一区二区三区四区| 丁香花在线高清完整版视频| 国产一区在线观看视频| 男人的天堂网页| 四川少妇bbbbbbbbb| 无码秘人妻一区二区三-百度| 成人黄网免费观看视频| 亚洲无码福利| 黄色激情网站| 天天谢天天干| 91AV天天在线观看| AV五月| 在线免费观看视频黄| 欧美成人视屏| 一级黄色视频在线观看| 91久久欧美极品XXXXⅩ| 欧洲尤物不卡播放六区| 德国肥妇熟妇BBwBBw| 五十路熟妇| 色悠悠国产| 色婷婷视频网站| 99久久精| xxx综合网| 欧美级毛片高潮| www.黄色在线| 亚洲成人大片| 日韩欧美中文字幕在线视频 | 成人高清无码在线观看| 成人三级片免费| av在线精品| 加勒比DVD手机在线播放观看视频| www99| 久久久久久久久久久久高清毛片一级 | 一道本在线| 国产一级性爱视频| 亚洲一二三四区| 一区二区三区观看| 无码精品久久| 中文字幕第83页| 欧美日日| 天天综合网站| 屁屁影院CCYYCOM国产| 91精品久久久久久久久久| 日韩一区二区免费视频| 在线观看91| 天天视频色版免费观看视频| 色婷婷电影网| 黄色成人免费视频| 欧美黄片一区| 高清无码在线观看18| 一区二区三区在线看| 欧美在线观看视频一区| 国产一区二区在线播放| 自拍偷拍影音先锋| 亚洲视频在线免费播放| 黄色精品视频| 国产精品久久久久久久久久二区三区 | 国产一区二区三区成人| 日本在线免费视频| 草久免费视频| 麻豆视频在线| yw在线观看| 青青草婷婷| 久久伊人电影| 国产成人视频免费| 2014天堂网| 99电影网手机在线观看| 国产精品2025| 日本电影一区二区三区| 在线观看99| 91搞搞| 亚洲区无码| 女人av天堂| 日本特黄AA片免费视频| 激情一区二区三区| 中文字幕淫乱视频欧美| 18网站视频| 人妻人人骑| 亚洲91精品| 2014亚洲天堂| 在线免费观看av网站| 蜜桃av秘无码一区三| 亚洲欧美在线观看视频| 激情一区| 操逼视频看看| 亚洲综合在线观看视频| 欧美黄色片在线观看| 操逼日爱| 久久免费成人电影| 欧美性爱手机在线| 豆花AV| av玖玖| 黄色视频免费观看国产| 密臀av在线| 一区二区三区在线观看视频| 青青草99热| 免费人成视频在线| AV黄色在线观看| 亚洲在线中文字幕| 国产青草视频在线观看| 人人爽人人做| 亚洲AV激情无码专区在线播放| 超碰199| 欧洲a视频| 91视频网站在线| 亚韩无码| www五月天com| 中文字幕第72页| 操逼视频在线看| 电影豹妹香港版| 久久久精品一区| 激情五月天导航| 国产黄色网| 69视频在线观看免费| 特一级黄色视频| V天堂在线| 人人操人人干97| 中文字幕av网| 九色国产在线| 乱伦无码| 天堂网www| 国产成人免费做爰视频| 一区二区三区亚洲| 波多野结衣被操| 欧美日韩中文在线| 国产高清无码自拍| 九九性视频| 日本电影一区二区三区| 天天综合国产| brazzers疯狂作爱| 九色欧美| 毛多水多丰满女人A片| 怡红影院美乳| 天天干免费视频| 国产乱子伦视频国产印度| 91成人无码| 免费色色网站| 超碰在线天天干| 亚洲视频在线免费观看| 黄色小说在线看| 色婷婷在线观看视频| 亚洲女人天堂| 第四色视频| 国产免费AV网站| 亚洲男人综合| 成人免费操| 久热官网| 蜜桃导航-精品导航| 蜜桃久久av一区| 天天干天天拍| 性欧美XXXX| 天码人妻一区二区三区在线看| 广东BBW搡BBBB搡| 亚洲女人天堂AV| 一级黄色小视频| 大香蕉毛片| 在线一区视频| 国产一级婬片A片免费无成人黑豆| 久久AV电影| 真人一级片| 中文字幕99| 少妇激情网站| 青青青青青操| 最新一区二区三区| 国产91www| 日本A在线观看| 欧美干| 男人天堂无码视频| 天堂综合| 成人伦理聚合| 大地影视中文第三页最新在线观看 | 日本AA片视频| jizz在线观看视频|