精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用 gdb 工具調試 Go

開發 開發工具
排除應用程序故障是比較復雜的,特別是處理像 Go 這樣的高并發語言。它更容易在具體位置使用 print 打印語句來確定程序狀態,但是這個方法很難根據條件發展去動態響應你的代碼。

排除應用程序故障是比較復雜的,特別是處理像 Go 這樣的高并發語言。它更容易在具體位置使用 print 打印語句來確定程序狀態,但是這個方法很難根據條件發展去動態響應你的代碼。

調試器提供了一個強大得令人難以置信的故障排除機制。添加排除故障的代碼可以巧妙地影響到應用程序該如何運行。調試器可以給正在迷茫的你更精確的看法。

[[145285]]

已經有許多 Go 的調試器存在了,其中一些調試器的不好之處是通過在編譯時注入代碼來提供一個交互終端。gdb 調試器則允許你調試已經編譯好的二進制文件,只要他們已經與 debug 信息連接,并不用修改源代碼。這是個相當不錯的特性,因此你可以從你的部署環境中取一個產品然后靈活地調試它。你可以從Golang 官方文檔中閱讀更多關于 gdb 的信息,那么這篇指南將簡單講解使用 gdb 調試器來調試 Go 應用程序的基本用法。

這兒會宣布一些 gdb 的***更新,最特別的是替換 -> 操作為 . 符號來訪問對象屬性。記住這兒可能在gdb 和 Go 版本中有細微改變。本篇指南基于 gdb 7.7.1和go 1.5beta2。

開始 gdb 調試

為了實驗 gdb 我使用了一個測試程序,完整的源代碼可以在gdb_sandbox_on_Github上查看。讓我們從一個非常簡單的程序開始吧:

 

  1. package main 
  2.  
  3. import (  
  4.     "fmt"  
  5.  
  6. func main() {  
  7.     for i := 0; i < 5; i++ { 
  8.         fmt.Println("looping")  
  9.     }  
  10.     fmt.Println("Done")  

我們可以運行這段代碼并看到它輸出內容的和我們想象的一樣:

  1. $ go run main.go 
  2. looping 
  3. looping 
  4. looping 
  5. looping 
  6. looping 
  7. Done 

我們來調試這個程序吧。首先,使用 go build 編譯成二進制文件,接著使用這個二進制文件的路徑做為參數運行 gdb。根據你的設定,你也可以使用 source 命令來獲取 Go 運行時(Go runtime)的支持?,F在我們已經在 gdb 的命令行中了,我們可以在運行我們的二進制文件前為它設置斷點。

  1. $ go build -gcflags "-N -l" -o gdb_sandbox main.go  
  2. $ ls 
  3. gdb_sandbox  main.go  README.md 
  4. $ gdb gdb_sandbox 
  5. .... 
  6. (gdb) source /usr/local/src/go/src/runtime/runtime-gdb.py 
  7. Loading Go Runtime support. 

***關,我們在 for 循環里面設置一個斷點(b)來查看執行每次循環時我們的代碼會各有什么狀態。我們可以使用print(p)命令來檢查當前內容的一個變量,還有 list(l)和 backtrace(bt)命令查看當前步驟周圍的代碼。程序運行時可以使用 next(n)執行下一步或者使用 breakpoint(c)執行到下一個斷點。

  1. (gdb) b main.go:9  
  2. Breakpoint 1 at 0x400d35: file /home/bfosberry/workspace/gdb_sandbox/main.go, line 9.  
  3. (gdb) run  
  4. Starting program: /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/gdb_sandbox Breakpoint 1, main.main () at  
  5. /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:9  
  6. 9         fmt.Println("looping")  
  7. (gdb) l  
  8. 4         "fmt"  
  9. 5         )  
  10. 6   
  11. 7 func main() { 
  12. 8         for i := 0; i < 5; i++ {  
  13. 9         fmt.Println("looping")  
  14. 10        }`  
  15. 11        fmt.Println("Done")  
  16. 12 }  
  17. (gdb) p i  
  18. $1 = 0  
  19. (gdb) n  
  20. looping  
  21. Breakpoint 1, main.main () at  
  22. /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:9  
  23. 9        fmt.Println("looping")  
  24. (gdb) p i  
  25. $2 = 1  
  26. (gdb) bt 
  27. 0 main.main () at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:9 

我們的斷點可以設置在關聯文件的行號中、GOPATH里的文件的行號或一個包里的函數。如下也是一個有效的斷點:

  1. (gdb) b github.com/bfosberry/gdb_sandbox/main.go:9 
  2. (gdb) b 'main.main' 

Structs

我們可以用稍微復雜一點的代碼來實例演示如何調試。我們將使用f函數生成一個簡單的pair,x和y,當x相等時y=f(x),否則=x。

 

  1. type pair struct {  
  2.     x int  
  3.     y int  
  4.  
  5. func handleNumber(i int) *pair {  
  6.     val := i  
  7.     if i%2 == 0 {  
  8.         val = f(i)  
  9.     }  
  10.     return &pair{  
  11.        x: i,  
  12.        y: val,  
  13.     }  
  14.  
  15. func f(int x) int {  
  16.     return x*x + x  

也可以在循環中改變代碼來訪問這些新函數。

  1. p := handleNumber(i) 
  2. fmt.Printf("%+v/n", p) 
  3. fmt.Println("looping"

因為我們需要調試的是變量 y。我們可以在y被設置的地方放置斷點然后單步執行。可以使用 info args 查看函數的參數,在 bt 之前可以返回當前回溯。

 

  1. (gdb) b 'main.f'  
  2. (gdb) run  
  3. Starting program: /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/gdb_sandbox 
  4.  
  5. Breakpoint 1, main.f (x=0, ~anon1=833492132160)  
  6.     at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:33  
  7. 33       return x*x + x  
  8. (gdb) info args  
  9. x = 0  
  10. (gdb) continue  
  11. Breakpoint 1, main.f (x=0, ~anon1=833492132160)  
  12.     at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:33  
  13. 33       return x*x + x  
  14. (gdb) info args  
  15. x = 2  
  16. (gdb) bt 
  17. #0 main.f (x=2, ~anon1=1)  
  18.     at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:33 
  19. #1 0x0000000000400f0e in main.handleNumber (i=2, ~anon1=0x1
  20.     at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:24 
  21. #2 0x0000000000400c47 in main.main () 
  22.     at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:14 

因為我們在變量 y 是在函數 f 中被設定的這樣一個條件下,我們可以跳到這個函數的上下文并檢查堆區的代碼。應用運行時我們可以在一個更高的層次上設置斷點并檢查其狀態。

  1. (gdb) b main.go:26  
  2. Breakpoint 2 at 0x400f22: file  
  3. /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go, line 26.  
  4. (gdb) continue  
  5. Continuing. 
  6. Breakpoint 2, main.handleNumber (i=2, ~anon1=0x1)  
  7.     at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:28  
  8. 28             y: val,  
  9. (gdb) l  
  10. 23         if i%2 == 0 {  
  11. 24             val = f(i)  
  12. 25         }  
  13. 26         return &pair{  
  14. 27             x: i,  
  15. 28             y: val,  
  16. 29         }  
  17. 30     }  
  18. 31   
  19. 32 func f(x intint {  
  20. (gdb) p val  
  21. $1 = 6  
  22. (gdb) p i  
  23. $2 = 2 

如果我們在這個斷點處繼續住下走我們將越過在這個函數中的斷點1,而且將立即觸發在 HandleNumer 函數中的斷點,因為函數 f 只是對變量 i 每隔一次才執行。我們可以通過暫時使斷點 2不工作來避免這種情況的發生。

  1. (gdb) disable breakpoint 2  
  2. (gdb) continue  
  3. Continuing.  
  4. &{x:2 y:6}  
  5. looping  
  6. &{x:3 y:3}  
  7. looping  
  8. [New LWP 15200]  
  9. [Switching to LWP 15200
  10. Breakpoint 1, main.f (x=4, ~anon1=1)  
  11.     at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:33  
  12. 33         return x*x + x  
  13. (gdb) 

我們也可以分別使用 clear 和 delete breakpoint NUMBER 來清除和刪除斷點。動態產生和系住斷點,我們可以有效地在應用流中來回移動。

Slices and Pointers

上例程序太簡單了,只用到了整數型和字符串,所以我們將寫一個稍微復雜一點的。首先添加一個slice(切片類型)的指針到 main 函數,并保存生成的 pair,我們后面將用到它。

  1. var pairs []*pair 
  2. for i := 0; i < 10; i++ { 
  3.     p := handleNumber(i) 
  4.     fmt.Printf("%+v/n", p) 
  5.     pairs = append(pairs, p) 
  6.     fmt.Println("looping"
  7.     } 

現在我們來檢查生成出來的 slice 或 pairs,首先我們用轉換成數組來看一下這個 slice。因為 handleNumber 返回的是一個 *pair 類型,我們需要引用這個指針來訪問 struct(結構)的屬性。

 

  1. (gdb) b main.go:18  
  2. Breakpoint 1 at 0x400e14: file /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go, line 18.  
  3. (gdb) run  
  4. Starting program: /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/gdb_sandbox &{x:0 y:0
  5.  
  6. Breakpoint 1, main.main () at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:18  
  7. 18         fmt.Println("looping")  
  8. (gdb) p pairs  
  9. $1 = []*main.pair = {0xc82000a3a0}  
  10. (gdb) p pairs[0]  
  11. Structure has no component named operator[].  
  12. (gdb) p pairs.array  
  13. $2 = (struct main.pair **) 0xc820030028  
  14. (gdb) p pairs.array[0]  
  15. $3 = (struct main.pair *) 0xc82000a3a0  
  16. (gdb) p *pairs.array[0]  
  17. $4 = {x = 0, y = 0}  
  18. (gdb) p (*pairs.array[0]).x  
  19. $5 = 0  
  20. (gdb) p (*pairs.array[0]).y  
  21. $6 = 0  
  22. (gdb) continue  
  23. Continuing.  
  24. looping  
  25. &{x:1 y:1
  26.  
  27. Breakpoint 1, main.main () at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:18  
  28. 18         fmt.Println("looping")  
  29. (gdb) p (pairs.array[1][5]).y  
  30. $7 = 1  
  31. (gdb) continue  
  32. Continuing.  
  33. looping  
  34. &{x:2 y:6
  35.  
  36. Breakpoint 1, main.main () at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:18  
  37. 18         fmt.Println("looping")  
  38. (gdb) p (pairs.array[2][6]).y  
  39. $8 = 6  
  40. (gdb) 

你會發現這里 gdb 并不確定 pairs 是一個 slice 類型,我們不能直接訪問它的屬性,為了訪問它的成員我們需要使用 pairs.array 來轉換成數組,然后我們就可以檢查 slice 的 length(長度)和 capacity(容量):

  1. (gdb) p $len(pairs) 
  2. $12 = 3 
  3. (gdb) p $cap(pairs) 
  4. $13 = 4 

這時我們可以讓它循環幾次,并透過這個 slice 不用的成員方法監聽增加的 xy 的值,要注意的是,這里的 struct 屬性可以通過指針訪問,所以 p pairs.array[2].y 一樣可行。

Goroutines

現在我們已經可以訪問 struct 和 slice 了,下面再來更加復雜一點的程序吧。讓我們添加一些goroutines 到 mian 函數,并行處理每一個數字,返回的結果存入信道(chan)中:

 

  1.     pairs := []*pair{} 
  2.     pairChan := make(chan *pair) 
  3.     wg := sync.WaitGroup{} 
  4.         for i := 0; i < 10; i++ { 
  5.           wg.Add(1
  6.           go func(val int) { 
  7.             p := handleNumber(val) 
  8.             fmt.Printf("%+v/n", p) 
  9.             pairChan <- p 
  10.             wg.Done() 
  11.             }(i) 
  12.     } 
  13.     go func() { 
  14.             for p := range pairChan { 
  15.               pairs = append(pairs, p) 
  16.             } 
  17.     }() 
  18.     wg.Wait() 
  19.     close(pairChan) 
  20.  
  21. 如果我等待 WaitGroup 執行完畢再檢查 pairs slice 的結果,我們可以預期到內容是完全相同的,雖然它的排序可能有些出入。gdb 真正的威力來自于它可以在 goroutines 正在運行時進行檢查: 
  22.  
  23. (gdb) b main.go:43  
  24. Breakpoint 1 at 0x400f7f: file /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go, line 43.  
  25. (gdb) run  
  26. Starting program: /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/gdb_sandbox 
  27.  
  28. Breakpoint 1, main.handleNumber (i=0, ~r1=0x0)  
  29.     at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:43  
  30. 43         y: val,  
  31. (gdb) l  
  32. 38     if i%2 == 0 {  
  33. 39         val = f(i)  
  34. 40     }  
  35. 41     return &pair{  
  36. 42         x: i,  
  37. 43         y: val,  
  38. 44     }  
  39. 45 }  
  40. 46   
  41. 47 func f(x intint {  
  42. (gdb) info args  
  43. i = 0  
  44. ~r1 = 0x0  
  45. (gdb) p val  
  46. $1 = 0 

你會發現我們在 goroutine 要執行的代碼段中放置了一個斷點,從這里我們可以檢查到局部變量,和進程中的其它 goroutines:

  1. (gdb) info goroutines  
  2.   1 waiting runtime.gopark  
  3.   2 waiting runtime.gopark  
  4.   3 waiting runtime.gopark  
  5.   4 waiting runtime.gopark  
  6. 5 running main.main.func1  
  7.   6 runnable main.main.func1  
  8.   7 runnable main.main.func1  
  9.   8 runnable main.main.func1  
  10.   9 runnable main.main.func1  
  11. 10 running main.main.func1  
  12.   11 runnable main.main.func1  
  13.   12 runnable main.main.func1  
  14.   13 runnable main.main.func1  
  15.   14 runnable main.main.func1  
  16.   15 waiting runtime.gopark  
  17. (gdb) goroutine 11 bt 
  18. #0 main.main.func1 (val=6, pairChan=0xc82001a180, &wg=0xc82000a3a0
  19.     at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:19 
  20. #1 0x0000000000454991 in runtime.goexit () at /usr/local/go/src/runtime/asm_amd64.s:1696 
  21. #2 0x0000000000000006 in ?? () 
  22. #3 0x000000c82001a180 in ?? () 
  23. #4 0x000000c82000a3a0 in ?? () 
  24. #5 0x0000000000000000 in ?? () 
  25. (gdb) goroutine 11 l  
  26. 48         return x*x + x  
  27. 49     }  
  28. (gdb) goroutine 11 info args  
  29. val = 6  
  30. pairChan = 0xc82001a180  
  31. &wg = 0xc82000a3a0  
  32. (gdb) goroutine 11 p val  
  33. $2 = 6 

在這里我們做的***件事就是列出所有正在運行的 goroutine,并確定我們正在處理的那一個。然后我們可以看到一些回溯,并發送任何調試命令到 goroutine。這個回溯和列表清單并不太準確,如何讓回溯更準確,goroutine 上的 info args 顯示了我們的局部變量,以及主函數中的可用變量,goroutine 函數之外的使用前綴&。

結論

當調試應用時,gdb 的強大令人難以置信。但它仍然是一個相當新的事物,并不是所有的地方工作地都很***。使用***的穩定版 gdb,go 1.5 beta2,有不少地方有突破:

Interfaces

根據 go 博客上的文章, go 的 interfaces 應該已經支持了,這允許在 gdb 中動態的投影其基類型。這應該算一個突破。

Interface{} 類型

目前沒有辦法轉換 interface{} 為它的類型。

列出 goroutine 的不同點

在其他 goroutine 中列出周邊代碼會導致一些行數的漂移,最終導致 gdb 認為當前的行數超出文件范圍并拋出一個錯誤:

  1. (gdb) info goroutines  
  2.   1 waiting runtime.gopark  
  3.   2 waiting runtime.gopark  
  4.   3 waiting runtime.gopark  
  5.   4 waiting runtime.gopark  
  6. 5 running main.main.func1  
  7.   6 runnable main.main.func1  
  8.   7 runnable main.main.func1  
  9.   8 runnable main.main.func1  
  10.   9 runnable main.main.func1  
  11. 10 running main.main.func1  
  12.   11 runnable main.main.func1  
  13.   12 runnable main.main.func1  
  14.   13 runnable main.main.func1  
  15.   14 runnable main.main.func1  
  16.   15 waiting runtime.gopark  
  17. (gdb) goroutine 11 bt 
  18. #0 main.main.func1 (val=6, pairChan=0xc82001a180, &wg=0xc82000a3a0
  19.     at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:19 
  20. #1 0x0000000000454991 in runtime.goexit () at /usr/local/go/src/runtime/asm_amd64.s:1696 
  21. #2 0x0000000000000006 in ?? () 
  22. #3 0x000000c82001a180 in ?? () 
  23. #4 0x000000c82000a3a0 in ?? () 
  24. #5 0x0000000000000000 in ?? () 
  25. (gdb) goroutine 11 l  
  26. 48         return x*x + x  
  27. 49     }  
  28. (gdb) goroutine 11 l  
  29. Python Exception <class 'gdb.error'> Line number 50 out of range; /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go has 49 lines.:  
  30. Error occurred in Python command: Line number 50 out of range; /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go has 49 lines. 

Goroutine 調試還不穩定

處理 goroutines 往往不穩定;我遇到過執行簡單命令產生錯誤的情況?,F階段你應該做好處理類似問題的準備。

gdb 支持 Go 的配置非常麻煩

運行 gdb 支持 Go 調試的配置非常麻煩,獲取正確的路徑結合與構建 flags,還有 gdb 自動加載功能好像都不能正常的工作。首先,通過一個 gdb 初始化文件加載 Go 運行時支持就會產生初始化錯誤。這就需要手動通過一個源命令去加載,調試 shell 需要像指南里面描述的那樣去進行初始化。

我什么時候該使用一個調試器?

所以什么情況下使用 gdb 更有用?使用 print 語言和調試代碼是更有針對性的方法。

  • 當不適合修改代碼的時候

  • 當調試一個問題,但是不知道源頭,動態斷點或許更有效

  • 當包含許多 goroutines 時,暫停然后審查程序狀態會更好

“Debugging #golang with gdb” – via @codeship —— from Tweet

 

責任編輯:王雪燕 來源: oschina
相關推薦

2021-07-28 08:53:53

GoGDB調試

2021-03-15 06:23:40

GDB調試代碼編程語言

2025-03-31 03:25:00

2010-06-04 17:48:20

Linux編程工具

2025-07-03 02:00:00

2022-07-25 07:57:19

工具代碼調試

2017-02-06 18:42:37

Linuxgdb程序

2023-03-29 08:18:16

Go調試工具

2024-02-26 00:02:00

開發Go

2021-06-04 05:18:29

ARM程序Gdbserver

2020-07-10 16:52:43

DelveGo程序開源

2016-03-29 10:32:34

2022-09-15 14:56:12

GDB調試鴻蒙

2023-11-22 13:13:54

多線程死鎖

2010-03-26 15:41:39

Python腳本

2025-06-26 05:00:00

2022-12-19 10:10:07

GDB命令

2025-07-08 00:00:00

2021-07-26 10:14:38

Go語言工具

2016-12-02 20:23:51

AndroidADB
點贊
收藏

51CTO技術棧公眾號

免费成人在线影院| 秋霞综合在线视频| 一区二区三区加勒比av| 亚洲a级在线观看| 欧美极品aaaaabbbbb| 在线精品国产亚洲| 色婷婷亚洲精品| 在线视频欧美一区| 人妻无码中文字幕| 日韩精品一二区| 欧美精品在线免费| 亚洲综合网在线观看| 欧美日韩免费电影| 亚洲国产sm捆绑调教视频| 青青草国产精品| 精品国产免费无码久久久| 国产视频一区三区| 麻豆成人在线看| 中文字幕人妻一区二区| 欧美成年网站| 欧美三级一区二区| 福利视频免费在线观看| 最新av网站在线观看 | 玩弄中年熟妇正在播放| av播放在线| 99久久99久久精品国产片果冻| 国产精品人人做人人爽| 日韩免费视频网站| 欧美福利在线| 一区二区三区无码高清视频| 制服丝袜av在线| vam成人资源在线观看| 日本韩国一区二区三区| aa视频在线播放| 性欧美videoshd高清| 国产精品视频一二三| 精品久久久久久亚洲| 亚洲h视频在线观看| 精品一区二区三区蜜桃| 国产精品成人播放| 丰满人妻老熟妇伦人精品| 黄色亚洲在线| 欧美成人免费全部| 999精品久久久| 中文字幕中文字幕精品| 亚洲精品www久久久| 69亚洲乱人伦| 日韩有吗在线观看| 欧美日产国产精品| av网站在线不卡| 韩国精品主播一区二区在线观看| 欧美日韩免费在线| 国产中文字幕免费观看| 欧美日韩国产观看视频| 亚洲v日本v欧美v久久精品| 激情成人开心网| 色图在线观看| 亚洲综合一二三区| 欧美一级视频在线播放| av中文字幕电影在线看| 香蕉加勒比综合久久| 免费av手机在线观看| 69av成人| 欧美日韩激情视频8区| www黄色日本| 欧美成人ⅴideosxxxxx| 在线观看视频一区二区| 9久久婷婷国产综合精品性色| 亚洲www啪成人一区二区| 色欧美88888久久久久久影院| 欧在线一二三四区| 成人毛片免费| 5858s免费视频成人| 日本黄色www| 国产精品99久久免费观看| 亚洲电影成人av99爱色| 青青草视频成人| 国产欧美日韩精品高清二区综合区| 亚洲视频在线观看免费| xxxxx99| 欧美~级网站不卡| 久久久久久国产三级电影| 欧美日韩精品区| 日韩中文字幕区一区有砖一区| 国产精品免费在线免费 | 青娱乐精品在线视频| 91色视频在线导航| 日韩中文字幕影院| 国产欧美日韩在线| 99精品一区二区三区的区别| 福利网站在线观看| 色婷婷亚洲综合| 91视频福利网| 日韩有码av| 日韩中文在线观看| 伊人365影院| 全国精品久久少妇| 国产chinese精品一区二区| 人操人视频在线观看| 中文字幕亚洲综合久久菠萝蜜| 999久久欧美人妻一区二区| 成人动漫一区| 91精品婷婷国产综合久久| 亚洲色图欧美日韩| 日韩在线不卡| 性欧美在线看片a免费观看| 中文字幕久久久久| 丁香婷婷深情五月亚洲| 茄子视频成人在线观看 | 一卡二卡三卡四卡五卡| 亚洲另类春色校园小说| 欧美成人激情在线| 国产91av在线播放| www.日韩精品| 男人天堂网站在线| 欧美xnxx| 日韩成人在线观看| 麻豆疯狂做受xxxx高潮视频| 久久久蜜桃一区二区人| 岛国视频一区| 黄色网址视频在线观看| 色婷婷国产精品久久包臀| 一级日本黄色片| 精品久久综合| 91精品国产亚洲| 国产黄色大片网站| 国产精品无遮挡| 国产精品免费观看久久| 成人在线超碰| 久久不射热爱视频精品| 中文字幕日产av| 久久精品一区二区三区不卡| 福利视频一二区| 国产一区二区三区亚洲综合| 一本一本久久a久久精品牛牛影视| 日本a在线观看| 国产成人小视频| 中文字幕制服丝袜在线| 99只有精品| 亚洲性夜色噜噜噜7777| 国产无码精品在线观看| 国产成人在线网站| 日本一二三区视频在线| 99久热在线精品视频观看| 最近2019年日本中文免费字幕| 偷偷操不一样的久久| av在线不卡网| 精品久久久久久久久久中文字幕| 99久热这里只有精品视频免费观看| 久久婷婷国产麻豆91天堂 | 久久精品久久久精品美女| 日本不卡二区高清三区| 最新中文字幕在线播放| 日韩国产高清污视频在线观看| 国产精品第108页| 成人h精品动漫一区二区三区| 男人添女荫道口喷水视频| 日韩在线精品强乱中文字幕| 欧美剧在线观看| 精品人妻一区二区三区四区不卡| 亚洲精品乱码久久久久久久久| 婷婷中文字幕在线观看| 中文字幕一区二区三区久久网站 | 欧美激情视频在线| 亚洲第一视频在线| 性感美女极品91精品| www.超碰97| 销魂美女一区二区三区视频在线| 免费看污久久久| 日韩av大片站长工具| 在线播放日韩av| 亚洲最大成人av| **性色生活片久久毛片| av地址在线观看| 亚洲每日在线| 日韩av一区二区三区美女毛片| 国产精品成人国产| 欧美成人高清视频| 日韩永久免费视频| 欧美亚洲国产怡红院影院| 成人18视频免费69| 成人免费视频网站在线观看| 久久网站免费视频| 大色综合视频网站在线播放| 亚洲伊人久久大香线蕉av| 丰满的护士2在线观看高清| 亚洲乱码国产乱码精品精天堂| 中文在线免费看视频| 亚洲欧美日韩久久| 成人手机在线免费视频| 免费在线观看日韩欧美| 69精品丰满人妻无码视频a片| 精品国产一区二区三区成人影院| 国产成人精品视频在线观看| 精品欧美色视频网站在线观看| 亚洲国产中文字幕在线观看| 羞羞色院91蜜桃| 亚洲综合一区在线| 超碰97av在线| 不卡视频一二三四| 97超碰成人在线| 一区二区黄色| 在线免费观看一区二区三区| 日韩电影在线观看完整免费观看| 国产精品久久久| 超碰97免费在线| 中文字幕精品久久久久| 欧美 日韩 国产 成人 在线 91 | 久久噜噜噜精品国产亚洲综合| 第三区美女视频在线| 欧美变态tickling挠脚心| 亚洲 国产 日韩 欧美| 亚洲永久精品国产| 色噜噜噜噜噜噜| 972aa.com艺术欧美| 日本网站在线看| 日韩激情在线观看| 男女视频网站在线观看| 97国产精品| 日韩高清三级| 日本国产精品| 肥熟一91porny丨九色丨| 国产精品99| 国产精品福利无圣光在线一区| 888av在线视频| 久久99久国产精品黄毛片入口| h视频在线免费| 亚洲精品一区二区网址| 全国男人的天堂网| 日韩一级大片在线| 97在线公开视频| 日本久久电影网| av大片免费观看| 亚洲成av人片一区二区三区| 国产高潮流白浆| 亚洲欧美中日韩| 任我爽在线视频| 中文字幕不卡在线观看| 这里只有久久精品| 久久亚洲影视婷婷| 亚洲精品在线视频免费观看| av中文字幕在线不卡| 白嫩情侣偷拍呻吟刺激| 国产不卡在线一区| 女同性αv亚洲女同志| 国产精品99久久久| 美女流白浆视频| 成人永久免费视频| 美女搡bbb又爽又猛又黄www| 国产成人精品亚洲午夜麻豆| 久久久国产精品久久久| 国产一二三精品| 男插女视频网站| 国精产品一区一区三区mba视频 | 国产av人人夜夜澡人人爽麻豆| 欧美阿v一级看视频| 91制片厂免费观看| 亚洲电影影音先锋| www.亚洲成人网| 最新成人av网站| heyzo国产| 日韩精品一级二级| 性chinese极品按摩| 激情伊人五月天久久综合| 久久久久久国产精品日本| 成人一区在线观看| 亚洲国产欧美视频| 欧美国产视频在线| 激情五月激情综合| 亚洲精品国产成人久久av盗摄| 久久综合久久鬼| 欧美日韩精品二区| 一级片在线免费播放| 777午夜精品免费视频| 性生交生活影碟片| 精品视频久久久久久久| av女优在线| 久久综合网hezyo| 鲁鲁在线中文| 国产精品免费一区| av在线亚洲色图| 日韩欧美亚洲精品| 欧美96在线丨欧| 蜜臀精品一区二区| 日韩高清不卡在线| 午夜免费视频网站| 久久亚洲精精品中文字幕早川悠里| 欧美多人猛交狂配| 亚洲品质自拍视频| 日韩大片免费在线观看| 欧美探花视频资源| 国产91免费看| 中文字幕日韩在线播放| 日韩123区| 国产精品扒开腿做爽爽爽的视频| 日韩精品一区二区三区中文在线| 国产一区二区三区四区五区在线 | 欧美亚洲日本一区二区三区| 蜜臀久久99精品久久久久宅男| 可以看的av网址| 国产三级一区二区三区| 久青草免费视频| 欧美特级限制片免费在线观看| 亚洲免费国产视频| 中文综合在线观看| 国产精选在线| 成人一区二区电影| 国产欧美日韩精品一区二区免费| 成人在线播放网址| 老色鬼精品视频在线观看播放| 国产麻豆xxxvideo实拍| 亚洲色图19p| 老熟妇一区二区三区| 欧美精品一区二区精品网| 91青青在线视频| 91av视频在线免费观看| 亚州一区二区| 亚洲天堂电影网| 美女爽到呻吟久久久久| 日本天堂在线播放| 《视频一区视频二区| 中文字幕av久久爽| 国产视频在线观看一区二区| 欧美hdxxx| 亚洲www在线观看| 久久精品播放| 精品少妇无遮挡毛片| 91亚洲精品久久久蜜桃网站| 免费一级肉体全黄毛片| 69av一区二区三区| 一级毛片视频在线| 国产精品成人播放| 国产一区二区电影在线观看| 99精品在线免费视频| 成人综合激情网| 黄色一级免费视频| 91精选在线观看| 日本网站在线免费观看视频| 国产精品日韩一区| 国产一区网站| 欧美性猛交久久久乱大交小说| 99国产精品久久久久| 日本少妇激情视频| 亚洲国产精品嫩草影院久久| 精品精品导航| 粉嫩av四季av绯色av第一区| 欧美黄色大片网站| 四虎国产精品永久免费观看视频| 亚洲欧美精品午睡沙发| jlzzjlzzjlzz亚洲人| 麻豆一区二区在线观看| 国产精品一级在线观看| 18视频在线观看娇喘| 国产精品一色哟哟哟| 亚洲国产精品免费在线观看| 91精品国产欧美一区二区| 二区三区在线观看| 91色精品视频在线| 韩日成人在线| 欧美深性狂猛ⅹxxx深喉| 欧美日韩视频免费播放| 九色在线观看| 国产精品人成电影| 欧美a级片一区| 亚洲天堂2024| 日韩欧美在线字幕| 成人在线二区| 91久久精品国产91性色| 国产综合自拍| 搡老熟女老女人一区二区| 色呦呦国产精品| 一级毛片视频在线| 国产精品.com| 久久久夜精品| 国产又粗又硬又长又爽| 欧美不卡123| 自拍偷自拍亚洲精品被多人伦好爽| 亚洲国内在线| 国产mv日韩mv欧美| 久久99国产综合精品免费| 中文字幕亚洲欧美在线| 日韩一级淫片| 黄色av免费在线播放| 亚洲欧美欧美一区二区三区| 婷婷色在线视频| 国产欧美 在线欧美| 激情成人综合| 欧美成人另类视频| 精品嫩草影院久久| 日本在线视频一区二区| 久久人妻无码一区二区| 久久综合色播五月| 国产精品探花视频| 2019av中文字幕| 羞羞答答成人影院www| 中文字幕日韩三级片| 欧美老年两性高潮| 一个人www视频在线免费观看| 自拍视频一区二区三区| 91亚洲精品久久久蜜桃|