亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

(轉)Xcode中LLDB的基本命令的使用(Swift)

2019-11-06 09:43:48
字體:
來源:轉載
供稿:網友

隨著Xcode 5的發布,LLDB調試器已經取代了GDB,成為了Xcode工程中默認的調試器。它與LLVM編譯器一起,帶給我們更豐富的流程控制和數據檢測的調試功能。LLDB為Xcode提供了底層調試環境,其中包括內嵌在Xcode IDE中的位于調試區域的控制面板,在這里我們可以直接調用LLDB命令.平時用Xcode運行程序,實際走的都是LLDB。熟練使用LLDB,可以讓你debug事半功倍。

我們以一個實際例子進行學習使用,為了方便,我們先寫一個Person類:

class Person: NSObject {        var name:String    var age:UInt32    init(name:String,age:UInt32) {        self.name = name        self.age = age    }    //重寫description是為了方便調試    override var description: String{     return "name:/(name),age:/(age)"    }}

進入 ViewController.swift添加一個測試函數,添加相應斷點,并在viewDidLoad()中調用,執行代碼到函數的最后,如下圖:

/

 

首先看一下打印命令p/po

 

在控制臺使用p和po來替代PRint,對于p和po,第一次看到可能不明白是啥,我們可以輸入help,在幫助信息中我們可以找到p和po部分如下:

 

(lldb) help

p -- ('expression --') Evaluate an expression (ObjC++ or Swift)in

the current program context, using user defined variables and

variables currentlyin scope.

po -- ('expression -O -- ') Evaluate an expression (ObjC++ or Swift)

in the current program context, using user defined variables and

variables currentlyin scope.

 

所以,p命令,本質是expression --;po命令,本質是expression -O —,其中-O的表示:-O ( --object-description ) Display using a language-specific description API, if possible.

 

注意打印輸出的最底部信息:For more information on any command, type'help '.我們通過輸入help和命令名得到更詳細的幫助。

 

1:p命令會打印出對象的類型和相關屬性.

(lldb) p person

(LLDBDemo.Person) $R0 = 0x00007f93fb4f4ae0 {

ObjectiveC.NSObject = {}

name = "Jack"

age = 24

}

 

2:po命令對于繼承自NSObject得對象,指示會打印出description中的內容,類似于print函數.

 

(lldb) po person

name:Jack,age:24

3:在看一個數組的小例子,直接console中輸入:

  

(lldb) po ["123","456"]

? 2 elements

- [0] : "123"

- [1] : "456"

 

(lldb) p ["123","456"]

([String]) $R3 = 2 values {

[0] = "123"

[1] = "456"

}

 

 

4:打印視圖的層級結構,該功能還是挺有用的

 

(lldb) (lldb) po view.performSelector("recursiveDescription")

? Unmanaged

- _value : >

| >

| <_UILayoutGuide: 0x7f93fb489720; frame = (0 0; 0 0); hidden = YES; layer = >

| <_UILayoutGuide: 0x7f93fb4ef7a0; frame = (0 0; 0 0); hidden = YES; layer = >

 

這里還有一個好玩的東西,那就是每個視圖中,都有一個16進制的字符串,代表這個視圖的ID,比如這個:UIView:0x7fd71ac66970;這個 ID的作用非常的強大,得到了這個ID,我們就可以通過這個命令來得到這個視圖的引用了:

 

(lldb) expression let $view = unsafeBitCast(0x7f93fb4dc930, UIView.self)

 

 

然后就可以對該視圖進行操作了,例如執行如下代碼:

 

(lldb)expression$view.backgroundColor = UIColor.redColor()

 

 

程序運行完成,整個視圖背景顏色變紅。ID還是很有用的,當然我們也可以直接操作當前視圖,如下:

 

(lldb)expressionself.view.backgroundColor = UIColor.redColor() 

既然可以動態改變視圖背景,那么我們也可以動態添加相應的視圖,接下來我們添加一個layer到當前視圖上:

 

(lldb) (lldb) expression

Enter expressions, then terminate with an empty line to evaluate:

1 let layer = CALayer()

2 layer.backgroundColor = UIColor.yellowColor().CGColor

3 layer.bounds = CGRect(x:0, y:0, width:100, height:100)

4 layer.position = CGPoint(x:250, y:300)

5 layer.cornerRadius = 12.0

6 view.layer.addSublayer(layer)

7

效果如下圖:/ 

看起來不錯啊,但是如果接下來,我們還需要使用之前創建的layer,那該怎么辦?如果我們直接使用肯定不行,(lldb)expression layer,直接報錯,所以創建全局常量或者變量就好了,一起來看一下:

 

(lldb) expression let $layer = CALayer()

(lldb) expression

Enter expressions, then terminate with an empty line to evaluate:

1 $layer.backgroundColor = UIColor.yellowColor().CGColor

2 $layer.bounds = CGRect(x:0, y:0, width:100, height:100)

3 $layer.position = CGPoint(x:250, y:300)

4 $layer.cornerRadius = 12.0

5 view.layer.addSublayer($layer)

6

(lldb) po $layer 

[ (kCGColorSpaceDeviceRGB)] ( 1 1 0 1 )>

 5:打印視圖控制器的層級結構 

(lldb) po UIWindow.valueForKeyPath("keyWindow.rootViewController._printHierarchy")

? Optional

- Some : , state: appearing, view: 

| , state: disappeared, view: not in the window

接下來看一下前面使用到的Expression命令

 

Expression命令很靈活,非常多,我們可以輸入help expression得到對應的幫助信息:Syntax: expression -- ,expression可以使用e或者expr代替。

 

1:expression命令可以幫助我們執行代碼,下面執行改變屬性name的值:

 

(lldb) p person

(LLDBDemo.Person) $R1 = 0x00007fd20a706be0 {

ObjectiveC.NSObject = {}

name = "Jack"

age = 24

}

(lldb) e person.name = "hua"

(lldb) p person

(LLDBDemo.Person) $R3 = 0x00007fd20a706be0 {

ObjectiveC.NSObject = {}

name = "hua"

age = 24

}

 

2:看一下格式化打印相關

 

(lldb) e -f bin -- person.age

(UInt32) $R4 = 0b00000000000000000000000000011000

(lldb) e -f oct -- person.age

(UInt32) $R5 = 030

(lldb) e -f hex -- person.age

(UInt32) $R6 = 0x00000018

上面是格式化打印二進制,八進制和十進制,命令的意思為:e是expression的縮寫,-f bin是格式化語法為:-f (format): -f ( --format ) Specify a format to be usedfor display.--分隔符,最后person.age是對需要的值進行格式化。

 其實格式化打印可以更簡單:

 

(lldb) p/x person.age

(UInt32) $R10 =0x00000018

 

看到這里,可能會想,p/x是怎么回事?怎樣查找格式化命令符號所對應的含義?

 

(lldb) type format

The following subcommands are supported:

 

add -- Add a new formatting style for a type.

clear -- Delete all existing format styles.

delete -- Delete an existing formatting style for a type.

info -- This command evaluates the provided expression and shows which

format is applied to the resulting value (if any). This

command takes 'raw' input (no need to quote stuff).

list -- Show a list of current formats.

 

For more help on any particular subcommand, type 'help

  '.

 

 

再輸入help format info,將看到所有格式化指令,下面是部分內容截圖:

 

/ 

上面劃線部分:d對應十進制,h對應十六進制,o對應八進制,再試試其他幾個:

 

(lldb) p/o person.age

(UInt32) $R2 = 030

(lldb) p/d person.age

(UInt32) $R3 = 24

 

3:打印Raw value,-R ( --raw-output ) Don't use formatting options.

(lldb) e -R -- person

(LLDBDemo.Person) $R7 = 0x00007fd20a706be0 {

ObjectiveC.NSObject = {}

name = {

_core = {

_baseAddress = {

_rawValue = 0x000000011321e4e0

}

_countAndFlags = {

_value = 3

}

_owner = None {

Some = {

instance_type = 0x0000000000000000

}

}

}

}

age = {

_value = 24

}

}

 

4:顯示變量類型, -T ( --show-types ) Show variable types when dumping values.

(lldb) e -T -- person

(LLDBDemo.Person) $R9 = 0x00007fd20a706be0 {

(NSObject) ObjectiveC.NSObject = {}

(String) name = "hua"

(UInt32) age = 24

}

 

5:顯示變量位置信息, -L ( --location ) Show variable location information.

(lldb) e -L -- person

scalar(0x00007fd20a706be0): (LLDBDemo.Person) $R10 = 0x00007fd20a706be0 {

scalar(0x00007fd20a706be0): ObjectiveC.NSObject = {}

0x00007fd20a706bf0: name = "hua"

0x00007fd20a706c08: age = 24

}

 

6:當然也可以組合多個部分一起查看,這里就是組合之前的R、T、L

(lldb) e -RTL -- person

scalar(0x00007fd20a706be0): (LLDBDemo.Person) $R11 = 0x00007fd20a706be0 {

scalar(0x00007fd20a706be0): (ObjectiveC.NSObject) ObjectiveC.NSObject = {}

0x00007fd20a706bf0: (Swift.String) name = {

0x00007fd20a706bf0: (Swift._StringCore) _core = {

0x00007fd20a706bf0: (Swift.COpaquePointer) _baseAddress = {

0x00007fd20a706bf0: (Builtin.RawPointer) _rawValue = 0x000000011321e4e0

}

0x00007fd20a706bf8: (Swift.UInt) _countAndFlags = {

0x00007fd20a706bf8: (Builtin.Int64) _value = 3

}

0x00007fd20a706c00: (Swift.Optional) _owner = None {

0x00007fd20a706c00: (AnyObject) Some = {

0x00007fd20a706c00: (Builtin.RawPointer) instance_type = 0x0000000000000000

}

}

}

}

0x00007fd20a706c08: (Swift.UInt32) age = {

0x00007fd20a706c08: (Builtin.Int32) _value = 24

}

}

 

7:多行表達式模式

 

(lldb) e

Enter expressions, then terminate with an empty line to evaluate:

1 struct Compass{var dirction = "N";var angle = 16.5}

2 var c = Compass()

3 print(c)

4

(Compass #1)(dirction: "N", angle: 16.5)

 

(lldb) e

Enter expressions, then terminate with an empty line to evaluate:

1 func add(a:Int,b:Int)->Int {return a+b }

2 let c = add(3,b:4)

3 print(c)

4

7

 

8:導入模塊框架

 

如果我們在調試的過程中,需要獲取某個框架的類,但是當前文件中并沒有導入,我們可以在console中調試過程中直接輸入import和框架名稱,好比如:我們需要MapKit中的類,直接:

 

(lldb) p import MapKit

 

9:LLDB變量

 

細心的朋友可能會發現輸出的信息中帶有$1、$2的字樣。實際上,我們每次查詢的結果會保存在一些持續變量中($[0-9]+),這樣你可以在后面的查詢中直接使用這些值。其實前面在使用layer的例子中已經提到了,在看個例子:

 

(lldb) e var $a = Person(name:"Jenny",age:24)

(lldb) p $a

(LLDBDemo.Person) $R12 = 0x00007fd20a512ba0 {

ObjectiveC.NSObject = {}

name = "Jenny"

age = 24

}

 

接下來看一下我們經常使用的斷點(breakpoint),斷點采用這個命令breakpoint,縮寫br,這里先列出文檔,看一下為我們提供了哪些功能:

 

 

(lldb) help breakpoint

The following subcommands are supported:

 

clear -- Clears a breakpoint or set of breakpoints in the executable.

command -- A set of commands for adding, removing and examining bits of

code to be executed when the breakpoint is hit (breakpoint

'commands').

delete -- Delete the specified breakpoint(s). If no breakpoints are

specified, delete them all.

disable -- Disable the specified breakpoint(s) without removing them. If

none are specified, disable all breakpoints.

enable -- Enable the specified disabled breakpoint(s). If no breakpoints

are specified, enable all of them.

list -- List some or all breakpoints at configurable levels of detail.

modify -- Modify the options on a breakpoint or set of breakpoints in

the executable. If no breakpoint is specified, acts on the

last created breakpoint. With the exception of -e, -d and -i,

passing an empty argument clears the modification.

name -- A set of commands to manage name tags for breakpoints

set -- Sets a breakpoint or set of breakpoints in the executable.

 

For more help on any particular subcommand, type 'help

  '.

 

基本的使用:

 

1:使用list顯示所有斷點信息

/

 

當前工程只有一個斷點,所以只打印了一個斷點信息,并且可以知道斷點的相關信息,在當前文件的29行,而且可以通過左邊斷點顯示區域來對比結果。

 

2:禁用斷點即disable命令

 

根據上面內容,現在我們來玩一玩,現在在原有的代碼上再添加2個斷點,如下圖:

/

 

1)首先使前面兩個斷點失效

 

(lldb) br disable 1.*

1 breakpoints disabled.

(lldb) br disable 2.*

1 breakpoints disabled.

 

 

2)點擊運行程序,會跳到第三個斷點,中間斷點不在暫停,并且斷點信息也會不一樣,多了斷點失效部分的內容,如下圖:

 

/

 

3:我們也可以使用 enable恢復斷點

(lldb) br enable 1.*

1 breakpoints enabled.

(lldb) br enable 2.*

1 breakpoints enabled.

4:刪除斷點,刪除第一個斷點

(lldb) br delete 1

1 breakpoints deleted; 0 breakpoint locations disabled.

(lldb) br list

Current breakpoints:

2: file = '/Users/longshihua/Desktop/LLDBDemo/LLDBDemo/ViewController.swift', line = 28, exact_match = 0, locations = 1, resolved = 1, hit count = 1

 

2.1: where = LLDBDemo`LLDBDemo.ViewController.testPerson () -> () + 12 at ViewController.swift:28, address = 0x000000010b4f3d5c, resolved, hit count = 1

 

3: file = '/Users/longshihua/Desktop/LLDBDemo/LLDBDemo/ViewController.swift', line = 30, exact_match = 0, locations = 1, resolved = 1, hit count = 1

 

3.1: where = LLDBDemo`LLDBDemo.ViewController.testPerson () -> () + 204 at ViewController.swift:30, address = 0x000000010b4f3e1c, resolved, hit count = 1

 

5:添加斷點

 

(lldb) br set -f ViewController.swift -l26

Breakpoint 4:where = LLDBDemo`LLDBDemo.ViewController.testPerson () -> () +12 at ViewController.swift:28, address =0x000000010b4f3d5c

 

命令中的-f ViewController.swift和-l26

-f ( --file ) 具體的文件

-l ( --line ) 文件的位置,即具體哪一行

 

6:為函數添加斷點,這里直接為我們的testPerson函數添加斷點,-F為函數名

 

(lldb) br set -F testPerson

Breakpoint 3:2 locations.

 

7:條件斷點

 

先添加一個函數,并加一個斷點,如下圖:當某種條件產生的時候觸發的斷點,現在這里實現停在1000次循環的第800次

/

 

當i為800時觸發斷點

(lldb) br modify -c i==800

(lldb) po i

800

 

指令說明:

-c ( --condition )

The breakpoint stops onlyifthis condition expression evaluates to

true.

 

記住一點,多利用help,查找命令和幫助信息,所以這里我們可以通過help br set來查看更多信息。

 

了解一下線程相關內容thread

 

1:threadreturn

 

Debug的時候,也許會因為各種原因,我們不想讓代碼執行某個方法,或者要直接返回一個想要的值。這時候就該thread return上場了。thread return可以接受一個表達式,調用命令之后直接從當前的堆棧中返回表達式的值。我們只需在方法的開始位置加一個斷點,當程序中斷的時候,輸入命令即可。

 

2:thread step-over單步執行,執行下一行代碼

thread step-in 進入函數體,單步執行

thread step-out 退出當前函數體

 

3:thread backtrace顯示堆棧信息

(lldb) thread backtrace

* thread #1: tid = 0x35a80, 0x0000000105b62d5c LLDBDemo`ViewController.testPerson(self=0x00007fab09d2bf00) -> () + 12 at ViewController.swift:28, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1

* frame #0: 0x0000000105b62d5c LLDBDemo`ViewController.testPerson(self=0x00007fab09d2bf00) -> () + 12 at ViewController.swift:28

............

............

Type類型查找

 

(lldb) help type

The following subcommands are supported:

 

category -- A set of commands for Operating on categories

filter -- A set of commands for operating on type filters

format -- A set of commands for editing variable value display options

lookup -- Lookup a type by name in the select target. This command

takes 'raw' input (no need to quote stuff).

summary -- A set of commands for editing variable summary display

options

synthetic -- A set of commands for operating on synthetic type

representations

 

For more help on any particular subcommand, type 'help

  '.

 

 

拋出一個異常,不知道是啥的時候怎么辦?我們可以使用lookup命令,查找我們的類型信息:

(lldb) type lookup Person

@objc class Person : ObjectiveC.NSObject {

@objc var name: Swift.String

@objc var age: Swift.UInt32

@objc init(name: Swift.String, age: Swift.UInt32)

@objc override var description: Swift.String {

@objc override get {}

}

@objc func personException() throws

@objc deinit

@objc @objc init()

}

 

frame(幀)首先看一下與frame(幀)相關解釋:

作用:frame -- A set of commandsfor operating on the current thread's frames.

 

(lldb) help frame

The following subcommands are supported:

 

info -- List information about the currently selected frame in the

current thread.

select -- Select a frame by index from within the current thread and

make it the current frame.

variable -- Show frame variables. All argument and local variables that

are in scope will be shown when no arguments are given. If

any arguments are specified, they can be names of argument,

local, file static and file global variables. Children of

aggregate variables can be specified such as 'var->child.x'.

 

For more help on any particular subcommand, type 'help

  '.

 

(lldb) frame variable person

(LLDBDemo.Person) person = 0x00007fab09e13790 {

ObjectiveC.NSObject = {}

name = "Jack"

age = 24

}

 

 

我們可以使用frame info查看當前frame的信息:

(lldb) frame info

frame #0:0x0000000105b62e1c LLDBDemo`ViewController.testPerson(self=0x00007fab09d2bf00) -> () +204 at ViewController.swift:30

 

target命令

對于target這個命令,我們用得最多的可能就是target modules lookup。由于LLDB給 target modules取了個別名image,所以這個命令我們又可以寫成image lookup.

1:當我們想查看一個類型的時候,可以使用image lookup --type,簡寫為image lookup -t,比如我們可以看看自己的Person類型信息:

 

(lldb) image lookup -t Person

2:當我們想查找一個方法或者符號的信息,比如所在文件位置等。我們可以使用image lookup --name,簡寫為 image lookup -n,這里我們就直接查找我們的testPerson函數,我們可以看到如下信息:

(lldb) image lookup -n testPerson

2 matches found in /Users/longshihua/Library/Developer/Xcode/DerivedData/LLDBDemo-fxvhyqfwhdszpwdegllmmmsjcohz/Build/Products/Debug-iphonesimulator/LLDBDemo.app/LLDBDemo:

Address: LLDBDemo[0x0000000100003d50] (LLDBDemo.__TEXT.__text + 9872)

Summary: LLDBDemo`LLDBDemo.ViewController.testPerson () -> () at ViewController.swift:26 Address: LLDBDemo[0x0000000100003e30] (LLDBDemo.__TEXT.__text + 10096)

Summary: LLDBDemo`@objc LLDBDemo.ViewController.testPerson () -> () at ViewController.swift

 

3:當我們有一個地址,想查找這個地址具體對應的文件位置,可以使用 image lookup --address,簡寫為image lookup -a.

 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线日本国产| 亚洲精品二三区| 久久国产精品久久国产精品| 亚洲一区二区中文| 91精品综合久久久久久五月天| 欧美在线观看视频| 国产一区二区三区精品久久久| 亚洲人成电影网站色xx| 国产精品极品在线| 日韩精品在线视频美女| 国产精品一区专区欧美日韩| 欧美日韩国产成人高清视频| 68精品国产免费久久久久久婷婷| 伊人久久久久久久久久久久久| 97热精品视频官网| 国产精品久久在线观看| 亚洲自拍中文字幕| 欧美精品九九久久| 欧美另类极品videosbest最新版本| 国产自产女人91一区在线观看| 久久久久久久久久国产精品| 日韩乱码在线视频| 精品日本美女福利在线观看| 国产91色在线播放| 欧美性猛交xxxx乱大交蜜桃| 久久视频国产精品免费视频在线| 亚洲视频在线免费观看| 亚洲天天在线日亚洲洲精| 欧美日韩福利在线观看| 亚洲精品一二区| 国产高清在线不卡| 久久久久久69| 亚洲国产精品va在线看黑人| 国产国产精品人在线视| 国产精品青草久久久久福利99| 国产精品偷伦一区二区| 午夜伦理精品一区| 中文字幕在线成人| 亚洲久久久久久久久久久| 日韩欧美中文字幕在线观看| 久久99精品久久久久久青青91| 国产做受高潮69| 一区二区三区视频观看| 中文字幕亚洲一区二区三区五十路| 亚洲欧洲国产一区| 欧美性xxxx极品高清hd直播| 精品国偷自产在线视频| 国产午夜精品久久久| 日韩美女在线看| 成人性生交大片免费看视频直播| 亚洲成人激情在线| 亚洲一区二区国产| 亚洲无亚洲人成网站77777| 岛国av在线不卡| 欧美中文字幕在线播放| 97在线视频免费观看| 高清亚洲成在人网站天堂| 色悠久久久久综合先锋影音下载| 韩国19禁主播vip福利视频| 国产精品一区二区三| 欧美性猛交丰臀xxxxx网站| 色噜噜狠狠狠综合曰曰曰88av| 欧美国产日韩视频| 久久久久中文字幕2018| 亚洲免费中文字幕| 欧美国产日产韩国视频| 97成人精品区在线播放| 精品亚洲一区二区三区在线观看| 97在线视频免费看| 国产精品久久久久久婷婷天堂| 欧美激情xxxx性bbbb| 亚洲高清免费观看高清完整版| 亚洲跨种族黑人xxx| 亚洲欧美成人网| 久久视频精品在线| 亚洲久久久久久久久久| 国产精品成人播放| 热久久免费国产视频| 欧美精品一二区| 欧美激情a∨在线视频播放| 亚洲精品国产免费| 欧美在线播放视频| 欧美日韩在线第一页| 日韩电影免费在线观看中文字幕| 97久久伊人激情网| 7m第一福利500精品视频| 日韩中文字幕视频在线观看| 国产精品扒开腿爽爽爽视频| 亚洲人成亚洲人成在线观看| 8x拔播拔播x8国产精品| 欧美性猛交视频| 欧美大片免费观看在线观看网站推荐| 成人淫片在线看| 黑人巨大精品欧美一区二区免费| 精品欧美激情精品一区| 亚洲视频在线观看网站| 91国偷自产一区二区三区的观看方式| 欧美精品在线看| 97精品欧美一区二区三区| 亚洲区一区二区| 久久精品免费播放| 日韩最新中文字幕电影免费看| 国产精品扒开腿做爽爽爽的视频| 亚洲精品国产拍免费91在线| 性欧美视频videos6一9| 亚洲天堂av在线免费观看| 国产精品69久久久久| 97色在线观看免费视频| 77777少妇光屁股久久一区| 精品中文视频在线| 国产91露脸中文字幕在线| 亚洲精品永久免费| 亚洲电影中文字幕| 中文欧美在线视频| 亚洲国产日韩欧美在线图片| 成人乱人伦精品视频在线观看| 少妇激情综合网| 国产精品中文在线| 日韩电影大全免费观看2023年上| 91在线观看免费高清完整版在线观看| 亚洲成年网站在线观看| 日韩av免费网站| 日韩在线播放av| 美女久久久久久久久久久| 国产成人精品国内自产拍免费看| 国产精品日韩在线| 亚洲精品久久久久久久久| 国产成人黄色av| 欧美国产精品va在线观看| 成年人精品视频| 国产成人精彩在线视频九色| 亚洲成人精品av| 中文字幕精品一区二区精品| 久久久精品美女| 2023亚洲男人天堂| 国产va免费精品高清在线| 日本高清视频一区| 欧美精品在线播放| 成人av.网址在线网站| 视频在线观看99| 麻豆成人在线看| 欧美大肥婆大肥bbbbb| 亚洲人午夜精品免费| 成人激情视频小说免费下载| 日日噜噜噜夜夜爽亚洲精品| 久久精品福利视频| 久久精品视频播放| 中文字幕久热精品在线视频| 欧美人在线视频| 中文字幕日韩精品有码视频| 国产欧亚日韩视频| 亚洲精品久久久久| 97碰碰碰免费色视频| 欧美巨猛xxxx猛交黑人97人| 4444欧美成人kkkk| 91成人国产在线观看| 97免费中文视频在线观看| 亚洲白拍色综合图区| 欧美性高潮床叫视频| 91av视频在线| 亚洲少妇激情视频| 国产精品视频一| 91在线视频九色| 97视频在线观看播放|