精品欧美一区二区三区在线观看 _久久久久国色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在线播放| 国产精品一区二区免费视频| 日韩影视在线观看| 色天使色偷偷av一区二区 | 一区二区三区韩国免费中文网站| 一本到不卡精品视频在线观看| 天天综合狠狠精品| www.黄色片| 久久久久国产精品一区二区| www.亚洲人.com| 好吊色视频一区二区三区| 88xx成人免费观看视频库| 综合电影一区二区三区| 精品国产免费一区二区三区| 一级黄色小视频| 亚洲高清网站| 久久精品99国产精品酒店日本 | a级日韩大片| 色婷婷综合久久久中文字幕| wwwjizzjizzcom| 国产福利免费在线观看| 夫妻av一区二区| 国产精品国产亚洲伊人久久 | 色综合久久五月| 在线播放成人| 色婷婷av久久久久久久| 岛国大片在线播放| 二区三区在线观看| 欧美韩日一区二区三区| 国产一区二区在线网站 | 精品粉嫩超白一线天av| 中文字幕视频三区| gogo亚洲高清大胆美女人体| 亚洲二区在线视频| 91传媒免费视频| 免费av在线播放| 日本一区二区综合亚洲| 久久视频在线观看中文字幕| 可以免费观看的毛片| 九九热在线视频观看这里只有精品| 91产国在线观看动作片喷水| 福利所第一导航| 五月天久久网站| 日韩在线观看免费全集电视剧网站| 日本黄色特级片| 欧美高清视频看片在线观看| 欧美成人激情免费网| 婷婷激情小说网| 成人在线视频www| 欧美二区三区91| 中文字幕第88页| 桃子视频成人app| 欧美亚洲一区二区在线| 国产一区视频免费观看| 欧美人与性动交xxⅹxx| 色婷婷激情久久| 久久精品香蕉视频| 亚洲成人不卡| 欧美亚洲动漫精品| 邪恶网站在线观看| 欧美视频免费看| 欧美夫妻性生活| 亚洲精品一二三四| 香蕉大人久久国产成人av| 日韩一区二区三免费高清| 国产三级生活片| 99热这里有精品| 日韩一区二区高清| 无码国产精品一区二区免费式直播| 欧美二区观看| 亚洲国产高清福利视频| 久久精品老司机| 精品日韩在线| 久久色在线播放| 免费视频网站www| 亚洲看片一区| 国产成人中文字幕| 夜夜躁狠狠躁日日躁av| 国产一区欧美日韩| 国产精品久久久久久久免费大片| 日韩一级免费视频| 久久久久久免费网| 一区二区三区国产福利| 91精品国产91久久久久久青草| 亚洲午夜在线观看视频在线| 日本不卡在线观看视频| 嫩草伊人久久精品少妇av杨幂| 欧美日韩精品福利| www.欧美com| 自拍偷拍精品| 色999日韩欧美国产| 久久久久久免费观看| 久久精品91| 96sao精品视频在线观看| 日韩一级中文字幕| 国产精品国产精品国产专区不蜜| 国产在线视频在线| 亚洲成人看片| 欧美大片免费久久精品三p| www.久久av| 欧美淫片网站| 国产精品扒开腿爽爽爽视频| 精品国产99久久久久久宅男i| 99久久精品国产一区| 一区二区精品免费视频| 麻豆mv在线看| 欧美一级黄色片| 亚洲精品国产一区黑色丝袜| 国产精品观看| 国产精品免费久久久久影院| 99re只有精品| 欧美激情一区二区| 欧美视频免费看欧美视频| 亚洲伊人精品酒店| 亚洲片国产一区一级在线观看| 91高清免费看| 免费高清在线视频一区·| 国产不卡一区二区在线观看 | 欧美精品久久一区二区| 怡春院在线视频| 久久综合色天天久久综合图片| 特色特色大片在线| 91大神在线观看线路一区| 国产视频精品免费播放| 久久在线视频精品| 国产在线视视频有精品| 色99中文字幕| 欧美一区 二区 三区| 亚洲国产精品久久久| 黄色一级片在线免费观看| 青青草国产成人av片免费| 久久久久久欧美精品色一二三四| 欧洲性视频在线播放| 91麻豆精品国产91久久久久| 久久久久99精品成人| 老司机亚洲精品| 久久综合色一本| 岛国av免费在线观看| 精品国产自在久精品国产| 色欲一区二区三区精品a片| 欧美aⅴ一区二区三区视频| 欧美伦理一区二区| 亚洲私拍视频| 亚洲精品色婷婷福利天堂| 国产成人精品一区二三区| 99综合电影在线视频| 亚洲国产精品无码av| 97久久亚洲| 欧美黄色片在线观看| 午夜精品久久久久久久91蜜桃| 亚洲天堂成人在线观看| 天美一区二区三区| 亚洲国产精品91| 亚洲999一在线观看www| av观看在线| 日韩免费视频一区| 久久精品美女视频| aaa欧美日韩| 天天摸天天碰天天添| 国产一区网站| 91精品久久久久久久久久另类 | 亚洲成人一级片| 亚洲图片有声小说| 人妻无码一区二区三区| 日本中文字幕不卡| 一区二区三区四区久久| 日韩欧美久久| 国内外成人免费激情在线视频| 手机在线观看免费av| 欧美性猛交xxxx乱大交3| 级毛片内射视频| 国产一区二区视频在线| 亚洲熟妇无码av在线播放| 欧美中文一区| 国产精品国产三级国产aⅴ浪潮| 免费av在线网站| 亚洲精品在线一区二区| 国内自拍视频在线播放| 中文字幕欧美激情一区| 特黄特黄一级片| 国产日韩欧美一区二区三区在线观看| 日本在线观看一区二区| 色综合久久久| 性欧美办公室18xxxxhd| 激情综合闲人网| 这里只有精品视频在线观看| 日韩福利片在线观看| 国产欧美日韩精品一区| 少妇愉情理伦片bd| 午夜一区二区三区不卡视频| 亚洲国产另类久久久精品极度| 亚洲网一区二区三区| 清纯唯美亚洲综合| 免费av网站在线看| 亚洲精品国产综合区久久久久久久| 波多野结衣视频观看| 一区二区三区中文字幕电影 | 国产成人福利网站| 黄页视频在线播放| 亚洲欧美999| www.精品久久| 在线观看亚洲精品视频| 看片网站在线观看| 日本一区二区高清| 午夜视频在线观看国产| 久久精品国产成人一区二区三区| 国产免费黄色小视频| 99精品视频在线观看免费播放| 国产一区免费在线| 国产精品久久久久久久久久辛辛 | 91浏览器在线视频| 午夜影院免费版| 日韩精品电影在线| 国产九九九九九| 欧美亚洲不卡| 香蕉视频在线网址| 国产亚洲第一伦理第一区| 欧美国产一区在线| 国产不卡在线观看| 女同一区二区免费aⅴ| 综合国产在线视频| 欧洲毛片在线| 精品电影一区二区三区| 国产精品久久久国产盗摄| 91久久一区二区| 四虎永久在线精品| 亚洲精品日产精品乱码不卡| 女人十八毛片嫩草av| 99久久久久久| 黄色在线免费播放| 国产精品99久久久久久久vr| 日韩一区二区三区不卡视频| 噜噜噜在线观看免费视频日韩 | 国产亚洲福利社区| 亚洲亚洲一区二区三区| 91中文字幕在线观看| 天堂综合在线播放| 国产欧美日韩丝袜精品一区| 深夜视频一区二区| 国产精品日韩专区| 99久久er| 成人精品视频久久久久| 亚洲精品自拍| 91色在线视频| 精品国产乱码久久久久久樱花| 国产精品情侣自拍| 欧美综合社区国产| 91精品在线播放| 九色精品蝌蚪| 国产精品.com| 色天天色综合| 青娱乐一区二区| 日本大胆欧美| 一区二区三区四区在线视频| 99久久国产综合精品成人影院| 一区二区精品视频| 欧美激情性爽国产精品17p| 路边理发店露脸熟妇泻火| 欧美福利影院| 青草青青在线视频| 麻豆久久精品| av污在线观看| 国产精品一区在线观看乱码| 国产又黄又嫩又滑又白| 成人性生交大片免费看中文 | 国内老熟妇对白xxxxhd| 欧美成人一级视频| 青青国产在线| 自拍偷拍免费精品| 青青青草视频在线| 日韩av黄色在线观看| 国产综合色激情| 国产高清在线精品一区二区三区| 日韩美女国产精品| 午夜精品一区二区三区在线观看 | 国产日韩在线不卡| 日韩欧美国产成人精品免费| 亚洲高清免费视频| 中文字幕免费高清网站| 91麻豆精品国产91久久久久久 | 国产欧美一区二区三区鸳鸯浴| 亚洲一区 欧美| 一区二区三区四区精品在线视频| 自拍偷拍欧美亚洲| 在线免费观看成人短视频| 国产强被迫伦姧在线观看无码| 亚洲成人中文字幕| 超碰国产在线观看| 久久久免费精品| 四虎4545www精品视频| 91视频最新| 国产成人精品免费视| 欧美少妇一区二区三区| 男女精品视频| 日本黄色三级网站| 欧美韩日一区二区三区四区| 豆国产97在线 | 亚洲| 欧美偷拍一区二区| 人人妻人人玩人人澡人人爽| 在线成人激情黄色| yellow在线观看网址| 国产欧美一区二区三区四区| 美女视频亚洲色图| 正在播放精油久久| 久久资源在线| 东京热av一区| 亚洲人成在线观看一区二区| 一本一道无码中文字幕精品热| 日韩视频一区二区三区在线播放| 韩国精品视频| 国模视频一区二区| 成人在线啊v| 天堂av一区二区| 亚洲永久免费| 成人区人妻精品一区二| 亚洲欧美在线aaa| 亚洲中文字幕无码爆乳av | 黄色性视频网站| 亚洲欧美综合在线精品| 91video| 欧美成人伊人久久综合网| 日本免费在线视频| 日韩美女av在线免费观看| baoyu135国产精品免费| 亚洲日本一区二区三区在线不卡| 国产精品久久久久久久免费软件 | 九九久久综合网站| 日韩毛片免费看| 翔田千里亚洲一二三区| 久久一日本道色综合久久| 国产精品一区二区入口九绯色| 亚洲福中文字幕伊人影院| а√中文在线资源库| 欧美成人黑人xx视频免费观看| 欧美日韩在线精品一区二区三区激情综合 | 国产精品播放| 欧美福利电影在线观看| 无套白嫩进入乌克兰美女| 国产精品久久久久久久久搜平片| 成年人视频免费| 亚洲欧美在线x视频| 欧美激情网站| 欧美激情导航| 天堂久久一区二区三区| 欧美老熟妇乱大交xxxxx| 欧美性猛交xxxx偷拍洗澡| 欧美女子与性| 国产精品大陆在线观看| 欧美伦理在线视频| 欧美三级午夜理伦三级富婆| 国产精品欧美综合在线| 一本到在线视频| 九色成人免费视频| 在线日韩成人| 欧美三级在线观看视频| 91丨porny丨国产入口| 国产成人精品777777| 亚洲夜晚福利在线观看| 日本久久久久| 污污污污污污www网站免费| 不卡av电影在线播放| 久久国产视频精品| 中文字幕视频一区二区在线有码 | 国产一区二区三区在线视频观看| 91精品午夜视频| 国产蜜臀一区二区打屁股调教| 国产一区国产精品| 日韩电影免费在线看| 99久久久免费精品| 精品久久久久久最新网址| 伊人成综合网站| 五月天国产一区| 国产精品一区免费视频| 免费日韩一级片| 一本一道久久a久久精品逆3p | 欧美视频1区| 精品一二三四区| 日韩久久久久久久久| 一区二区三区国产视频| 国产精品成人**免费视频| 成人中文字幕在线播放| 中文字幕第一区| 亚洲黄色在线免费观看| 国产va免费精品高清在线观看| 久久久久久久久久久9不雅视频| 日本在线不卡一区二区| 色94色欧美sute亚洲13| 直接在线观看的三级网址| 欧美日韩综合另类| 国产精品1区2区| 亚洲av无码不卡| 午夜精品在线视频| 欧美成人自拍| 一级国产黄色片| 555夜色666亚洲国产免| 日本综合字幕| 青青青青在线视频| 亚洲天堂av老司机| 极品美乳网红视频免费在线观看| 成人免费看片网站|