青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 89  文章 - 118  trackbacks - 0
<2011年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

留言簿(16)

隨筆分類(lèi)(56)

隨筆檔案(89)

文章分類(lèi)

推薦博客

搜索

  •  

最新隨筆

最新評(píng)論

閱讀排行榜

轉(zhuǎn)自:

http://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/

Valgrind 概述

體系結(jié)構(gòu)

Valgrind是一套Linux下,開(kāi)放源代碼(GPL V2)的仿真調(diào)試工具的集合。Valgrind由內(nèi)核(core)以及基于內(nèi)核的其他調(diào)試工具組成。內(nèi)核類(lèi)似于一個(gè)框架(framework),它模擬了 一個(gè)CPU環(huán)境,并提供服務(wù)給其他工具;而其他工具則類(lèi)似于插件 (plug-in),利用內(nèi)核提供的服務(wù)完成各種特定的內(nèi)存調(diào)試任務(wù)。Valgrind的體系結(jié)構(gòu)如下圖所示:


圖 1 Valgrind 體系結(jié)構(gòu)
Valgrind 體系結(jié)構(gòu)

Valgrind包括如下一些工具:

  1. Memcheck。這是valgrind應(yīng)用最廣泛的工具,一個(gè)重量級(jí)的內(nèi)存檢查器,能夠發(fā)現(xiàn)開(kāi)發(fā)中絕大多數(shù)內(nèi)存錯(cuò)誤使用情況,比如:使用未初始化的內(nèi)存,使用已經(jīng)釋放了的內(nèi)存,內(nèi)存訪問(wèn)越界等。這也是本文將重點(diǎn)介紹的部分。
  2. Callgrind。它主要用來(lái)檢查程序中函數(shù)調(diào)用過(guò)程中出現(xiàn)的問(wèn)題。
  3. Cachegrind。它主要用來(lái)檢查程序中緩存使用出現(xiàn)的問(wèn)題。
  4. Helgrind。它主要用來(lái)檢查多線程程序中出現(xiàn)的競(jìng)爭(zhēng)問(wèn)題。
  5. Massif。它主要用來(lái)檢查程序中堆棧使用中出現(xiàn)的問(wèn)題。
  6. Extension。可以利用core提供的功能,自己編寫(xiě)特定的內(nèi)存調(diào)試工具。

Linux 程序內(nèi)存空間布局

要發(fā)現(xiàn)Linux下的內(nèi)存問(wèn)題,首先一定要知道在Linux下,內(nèi)存是如何被分配的?下圖展示了一個(gè)典型的Linux C程序內(nèi)存空間布局:


圖 2: 典型內(nèi)存空間布局
典型內(nèi)存空間布局

一個(gè)典型的Linux C程序內(nèi)存空間由如下幾部分組成:

  • 代碼段(.text)。這里存放的是CPU要執(zhí)行的指令。代碼段是可共享的,相同的代碼在內(nèi)存中只會(huì)有一個(gè)拷貝,同時(shí)這個(gè)段是只讀的,防止程序由于錯(cuò)誤而修改自身的指令。
  • 初始化數(shù)據(jù)段(.data)。這里存放的是程序中需要明確賦初始值的變量,例如位于所有函數(shù)之外的全局變量:int val=100。需要強(qiáng)調(diào)的是,以上兩段都是位于程序的可執(zhí)行文件中,內(nèi)核在調(diào)用exec函數(shù)啟動(dòng)該程序時(shí)從源程序文件中讀入。
  • 未初始化數(shù)據(jù)段(.bss)。位于這一段中的數(shù)據(jù),內(nèi)核在執(zhí)行該程序前,將其初始化為0或者null。例如出現(xiàn)在任何函數(shù)之外的全局變量:int sum;
  • 堆(Heap)。這個(gè)段用于在程序中進(jìn)行動(dòng)態(tài)內(nèi)存申請(qǐng),例如經(jīng)常用到的malloc,new系列函數(shù)就是從這個(gè)段中申請(qǐng)內(nèi)存。
  • 棧(Stack)。函數(shù)中的局部變量以及在函數(shù)調(diào)用過(guò)程中產(chǎn)生的臨時(shí)變量都保存在此段中。

內(nèi)存檢查原理

Memcheck檢測(cè)內(nèi)存問(wèn)題的原理如下圖所示:


圖 3 內(nèi)存檢查原理
內(nèi)存檢查原理

Memcheck 能夠檢測(cè)出內(nèi)存問(wèn)題,關(guān)鍵在于其建立了兩個(gè)全局表。

  1. Valid-Value 表:

對(duì)于進(jìn)程的整個(gè)地址空間中的每一個(gè)字節(jié)(byte),都有與之對(duì)應(yīng)的 8 個(gè) bits;對(duì)于 CPU 的每個(gè)寄存器,也有一個(gè)與之對(duì)應(yīng)的 bit 向量。這些 bits 負(fù)責(zé)記錄該字節(jié)或者寄存器值是否具有有效的、已初始化的值。

  1. Valid-Address

對(duì)于進(jìn)程整個(gè)地址空間中的每一個(gè)字節(jié)(byte),還有與之對(duì)應(yīng)的 1 個(gè) bit,負(fù)責(zé)記錄該地址是否能夠被讀寫(xiě)。

檢測(cè)原理:

  • 當(dāng)要讀寫(xiě)內(nèi)存中某個(gè)字節(jié)時(shí),首先檢查這個(gè)字節(jié)對(duì)應(yīng)的 A bit。如果該A bit顯示該位置是無(wú)效位置,memcheck 則報(bào)告讀寫(xiě)錯(cuò)誤。
  • 內(nèi)核(core)類(lèi)似于一個(gè)虛擬的 CPU 環(huán)境,這樣當(dāng)內(nèi)存中的某個(gè)字節(jié)被加載到真實(shí)的 CPU 中時(shí),該字節(jié)對(duì)應(yīng)的 V bit 也被加載到虛擬的 CPU 環(huán)境中。一旦寄存器中的值,被用來(lái)產(chǎn)生內(nèi)存地址,或者該值能夠影響程序輸出,則 memcheck 會(huì)檢查對(duì)應(yīng)的V bits,如果該值尚未初始化,則會(huì)報(bào)告使用未初始化內(nèi)存錯(cuò)誤。

回頁(yè)首

Valgrind 使用

第一步:準(zhǔn)備好程序

為了使valgrind發(fā)現(xiàn)的錯(cuò)誤更精確,如能夠定位到源代碼行,建議在編譯時(shí)加上-g參數(shù),編譯優(yōu)化選項(xiàng)請(qǐng)選擇O0,雖然這會(huì)降低程序的執(zhí)行效率。

這里用到的示例程序文件名為:sample.c(如下所示),選用的編譯器為gcc。

生成可執(zhí)行程序 gcc –g –O0 sample.c –o sample


清單 1
清單 1

第二步:在valgrind下,運(yùn)行可執(zhí)行程序。

利用valgrind調(diào)試內(nèi)存問(wèn)題,不需要重新編譯源程序,它的輸入就是二進(jìn)制的可執(zhí)行程序。調(diào)用Valgrind的通用格式是:valgrind [valgrind-options] your-prog [your-prog-options]

Valgrind 的參數(shù)分為兩類(lèi),一類(lèi)是 core 的參數(shù),它對(duì)所有的工具都適用;另外一類(lèi)就是具體某個(gè)工具如 memcheck 的參數(shù)。Valgrind 默認(rèn)的工具就是 memcheck,也可以通過(guò)“--tool=tool name”指定其他的工具。Valgrind 提供了大量的參數(shù)滿(mǎn)足你特定的調(diào)試需求,具體可參考其用戶(hù)手冊(cè)。

這個(gè)例子將使用 memcheck,于是可以輸入命令入下:valgrind <Path>/sample.

第三步:分析 valgrind 的輸出信息。

以下是運(yùn)行上述命令后的輸出。


清單 2
清單 2
  • 左邊顯示類(lèi)似行號(hào)的數(shù)字(32372)表示的是 Process ID。
  • 最上面的紅色方框表示的是 valgrind 的版本信息。
  • 中間的紅色方框表示 valgrind 通過(guò)運(yùn)行被測(cè)試程序,發(fā)現(xiàn)的內(nèi)存問(wèn)題。通過(guò)閱讀這些信息,可以發(fā)現(xiàn):
    1. 這是一個(gè)對(duì)內(nèi)存的非法寫(xiě)操作,非法寫(xiě)操作的內(nèi)存是4 bytes。
    2. 發(fā)生錯(cuò)誤時(shí)的函數(shù)堆棧,以及具體的源代碼行號(hào)。
    3. 非法寫(xiě)操作的具體地址空間。
  • 最下面的紅色方框是對(duì)發(fā)現(xiàn)的內(nèi)存問(wèn)題和內(nèi)存泄露問(wèn)題的總結(jié)。內(nèi)存泄露的大小(40 bytes)也能夠被檢測(cè)出來(lái)。

示例程序顯然有兩個(gè)問(wèn)題,一是fun函數(shù)中動(dòng)態(tài)申請(qǐng)的堆內(nèi)存沒(méi)有釋放;二是對(duì)堆內(nèi)存的訪問(wèn)越界。這兩個(gè)問(wèn)題均被valgrind發(fā)現(xiàn)。

回頁(yè)首

利用Memcheck發(fā)現(xiàn)常見(jiàn)的內(nèi)存問(wèn)題

在Linux平臺(tái)開(kāi)發(fā)應(yīng)用程序時(shí),最常遇見(jiàn)的問(wèn)題就是錯(cuò)誤的使用內(nèi)存,我們總結(jié)了常見(jiàn)了內(nèi)存錯(cuò)誤使用情況,并說(shuō)明了如何用valgrind將其檢測(cè)出來(lái)。

使用未初始化的內(nèi)存

問(wèn)題分析:

對(duì)于位于程序中不同段的變量,其初始值是不同的,全局變量和靜態(tài)變量初始值為0,而局部變量和動(dòng)態(tài)申請(qǐng)的變量,其初始值為隨機(jī)值。如果程序使用了為隨機(jī)值的變量,那么程序的行為就變得不可預(yù)期。

下面的程序就是一種常見(jiàn)的,使用了未初始化的變量的情況。數(shù)組a是局部變量,其初始值為隨機(jī)值,而在初始化時(shí)并沒(méi)有給其所有數(shù)組成員初始化,如此在接下來(lái)使用這個(gè)數(shù)組時(shí)就潛在有內(nèi)存問(wèn)題。


清單 3
清單 3

結(jié)果分析:

假設(shè)這個(gè)文件名為:badloop.c,生成的可執(zhí)行程序?yàn)?strong>badloop。用memcheck對(duì)其進(jìn)行測(cè)試,輸出如下。


清單 4
清單 4

輸出結(jié)果顯示,在該程序第11行中,程序的跳轉(zhuǎn)依賴(lài)于一個(gè)未初始化的變量。準(zhǔn)確的發(fā)現(xiàn)了上述程序中存在的問(wèn)題。

內(nèi)存讀寫(xiě)越界

問(wèn)題分析:

這種情況是指:訪問(wèn)了你不應(yīng)該/沒(méi)有權(quán)限訪問(wèn)的內(nèi)存地址空間,比如訪問(wèn)數(shù)組時(shí)越界;對(duì)動(dòng)態(tài)內(nèi)存訪問(wèn)時(shí)超出了申請(qǐng)的內(nèi)存大小范圍。下面的程序就是一個(gè) 典型的數(shù)組越界問(wèn)題。pt是一個(gè)局部數(shù)組變量,其大小為4,p初始指向pt數(shù)組的起始地址,但在對(duì)p循環(huán)疊加后,p超出了pt數(shù)組的范圍,如果此時(shí)再對(duì)p 進(jìn)行寫(xiě)操作,那么后果將不可預(yù)期。


清單 5
清單 5

結(jié)果分析:

假設(shè)這個(gè)文件名為badacc.cpp,生成的可執(zhí)行程序?yàn)閎adacc,用memcheck對(duì)其進(jìn)行測(cè)試,輸出如下。


清單 6
清單 6

輸出結(jié)果顯示,在該程序的第15行,進(jìn)行了非法的寫(xiě)操作;在第16行,進(jìn)行了非法讀操作。準(zhǔn)確地發(fā)現(xiàn)了上述問(wèn)題。

內(nèi)存覆蓋

問(wèn)題分析:

C 語(yǔ)言的強(qiáng)大和可怕之處在于其可以直接操作內(nèi)存,C 標(biāo)準(zhǔn)庫(kù)中提供了大量這樣的函數(shù),比如 strcpy, strncpy, memcpy, strcat 等,這些函數(shù)有一個(gè)共同的特點(diǎn)就是需要設(shè)置源地址 (src),和目標(biāo)地址(dst),src 和 dst 指向的地址不能發(fā)生重疊,否則結(jié)果將不可預(yù)期。

下面就是一個(gè) src 和 dst 發(fā)生重疊的例子。在 15 與 17 行中,src 和 dst 所指向的地址相差 20,但指定的拷貝長(zhǎng)度卻是 21,這樣就會(huì)把之前的拷貝值覆蓋。第 24 行程序類(lèi)似,src(x+20) 與 dst(x) 所指向的地址相差 20,但 dst 的長(zhǎng)度卻為 21,這樣也會(huì)發(fā)生內(nèi)存覆蓋。


清單 7
清單 7

結(jié)果分析:

假設(shè)這個(gè)文件名為 badlap.cpp,生成的可執(zhí)行程序?yàn)?badlap,用 memcheck 對(duì)其進(jìn)行測(cè)試,輸出如下。


清單 8
清單 8

輸出結(jié)果顯示上述程序中第15,17,24行,源地址和目標(biāo)地址設(shè)置出現(xiàn)重疊。準(zhǔn)確的發(fā)現(xiàn)了上述問(wèn)題。

動(dòng)態(tài)內(nèi)存管理錯(cuò)誤

問(wèn)題分析:

常見(jiàn)的內(nèi)存分配方式分三種:靜態(tài)存儲(chǔ),棧上分配,堆上分配。全局變量屬于靜態(tài)存儲(chǔ),它們是在編譯時(shí)就被分配了存儲(chǔ)空間,函數(shù)內(nèi)的局部變量屬于棧上分 配,而最靈活的內(nèi)存使用方式當(dāng)屬堆上分配,也叫做內(nèi)存動(dòng)態(tài)分配了。常用的內(nèi)存動(dòng)態(tài)分配函數(shù)包括:malloc, alloc, realloc, new等,動(dòng)態(tài)釋放函數(shù)包括free, delete。

一旦成功申請(qǐng)了動(dòng)態(tài)內(nèi)存,我們就需要自己對(duì)其進(jìn)行內(nèi)存管理,而這又是最容易犯錯(cuò)誤的。下面的一段程序,就包括了內(nèi)存動(dòng)態(tài)管理中常見(jiàn)的錯(cuò)誤。


清單 9
清單 9

常見(jiàn)的內(nèi)存動(dòng)態(tài)管理錯(cuò)誤包括:

    • 申請(qǐng)和釋放不一致

由于 C++ 兼容 C,而 C 與 C++ 的內(nèi)存申請(qǐng)和釋放函數(shù)是不同的,因此在 C++ 程序中,就有兩套動(dòng)態(tài)內(nèi)存管理函數(shù)。一條不變的規(guī)則就是采用 C 方式申請(qǐng)的內(nèi)存就用 C 方式釋放;用 C++ 方式申請(qǐng)的內(nèi)存,用 C++ 方式釋放。也就是用 malloc/alloc/realloc 方式申請(qǐng)的內(nèi)存,用 free 釋放;用 new 方式申請(qǐng)的內(nèi)存用 delete 釋放。在上述程序中,用 malloc 方式申請(qǐng)了內(nèi)存卻用 delete 來(lái)釋放,雖然這在很多情況下不會(huì)有問(wèn)題,但這絕對(duì)是潛在的問(wèn)題。

    • 申請(qǐng)和釋放不匹配

申請(qǐng)了多少內(nèi)存,在使用完成后就要釋放多少。如果沒(méi)有釋放,或者少釋放了就是內(nèi)存泄露;多釋放了也會(huì)產(chǎn)生問(wèn)題。上述程序中,指針p和pt指向的是同一塊內(nèi)存,卻被先后釋放兩次。

    • 釋放后仍然讀寫(xiě)

本質(zhì)上說(shuō),系統(tǒng)會(huì)在堆上維護(hù)一個(gè)動(dòng)態(tài)內(nèi)存鏈表,如果被釋放,就意味著該塊內(nèi)存可以繼續(xù)被分配給其他部分,如果內(nèi)存被釋放后再訪問(wèn),就可能覆蓋其他部分的信息,這是一種嚴(yán)重的錯(cuò)誤,上述程序第16行中就在釋放后仍然寫(xiě)這塊內(nèi)存。

結(jié)果分析:

假設(shè)這個(gè)文件名為badmac.cpp,生成的可執(zhí)行程序?yàn)閎admac,用memcheck對(duì)其進(jìn)行測(cè)試,輸出如下。


清單 10
清單 10

輸出結(jié)果顯示,第14行分配和釋放函數(shù)不一致;第16行發(fā)生非法寫(xiě)操作,也就是往釋放后的內(nèi)存地址寫(xiě)值;第17行釋放內(nèi)存函數(shù)無(wú)效。準(zhǔn)確地發(fā)現(xiàn)了上述三個(gè)問(wèn)題。

內(nèi)存泄露

問(wèn)題描述:

內(nèi)存泄露(Memory leak)指的是,在程序中動(dòng)態(tài)申請(qǐng)的內(nèi)存,在使用完后既沒(méi)有釋放,又無(wú)法被程序的其他部分訪問(wèn)。內(nèi)存泄露是在開(kāi)發(fā)大型程序中最令人頭疼的問(wèn)題,以至于有 人說(shuō),內(nèi)存泄露是無(wú)法避免的。其實(shí)不然,防止內(nèi)存泄露要從良好的編程習(xí)慣做起,另外重要的一點(diǎn)就是要加強(qiáng)單元測(cè)試(Unit Test),而memcheck就是這樣一款優(yōu)秀的工具。

下面是一個(gè)比較典型的內(nèi)存泄露案例。main函數(shù)調(diào)用了mk函數(shù)生成樹(shù)結(jié)點(diǎn),可是在調(diào)用完成之后,卻沒(méi)有相應(yīng)的函數(shù):nodefr釋放內(nèi)存,這樣內(nèi)存中的這個(gè)樹(shù)結(jié)構(gòu)就無(wú)法被其他部分訪問(wèn),造成了內(nèi)存泄露。

在一個(gè)單獨(dú)的函數(shù)中,每個(gè)人的內(nèi)存泄露意識(shí)都是比較強(qiáng)的。但很多情況下,我們都會(huì)對(duì)malloc/free 或new/delete做一些包裝,以符合我們特定的需要,無(wú)法做到在一個(gè)函數(shù)中既使用又釋放。這個(gè)例子也說(shuō)明了內(nèi)存泄露最容易發(fā)生的地方:即兩個(gè)部分的 接口部分,一個(gè)函數(shù)申請(qǐng)內(nèi)存,一個(gè)函數(shù)釋放內(nèi)存。并且這些函數(shù)由不同的人開(kāi)發(fā)、使用,這樣造成內(nèi)存泄露的可能性就比較大了。這需要養(yǎng)成良好的單元測(cè)試習(xí) 慣,將內(nèi)存泄露消滅在初始階段。


清單 11
清單 1

清單 11.2
清單 11.2

清單 11.3
清單 11.3

結(jié)果分析:

假設(shè)上述文件名位tree.h, tree.cpp, badleak.cpp,生成的可執(zhí)行程序?yàn)閎adleak,用memcheck對(duì)其進(jìn)行測(cè)試,輸出如下。


清單 12
清單 12

該示例程序是生成一棵樹(shù)的過(guò)程,每個(gè)樹(shù)節(jié)點(diǎn)的大小為12(考慮內(nèi)存對(duì)齊),共8個(gè)節(jié)點(diǎn)。從上述輸出可以看出,所有的內(nèi)存泄露都被發(fā)現(xiàn)。 Memcheck將內(nèi)存泄露分為兩種,一種是可能的內(nèi)存泄露(Possibly lost),另外一種是確定的內(nèi)存泄露(Definitely lost)。Possibly lost 是指仍然存在某個(gè)指針能夠訪問(wèn)某塊內(nèi)存,但該指針指向的已經(jīng)不是該內(nèi)存首地址。Definitely lost 是指已經(jīng)不能夠訪問(wèn)這塊內(nèi)存。而Definitely lost又分為兩種:直接的(direct)和間接的(indirect)。直接和間接的區(qū)別就是,直接是沒(méi)有任何指針指向該內(nèi)存,間接是指指向該內(nèi)存的 指針都位于內(nèi)存泄露處。在上述的例子中,根節(jié)點(diǎn)是directly lost,而其他節(jié)點(diǎn)是indirectly lost。

回頁(yè)首

總結(jié)

本文介紹了valgrind的體系結(jié)構(gòu),并重點(diǎn)介紹了其應(yīng)用最廣泛的工具:memcheck。闡述了memcheck發(fā)現(xiàn)內(nèi)存問(wèn)題的基本原理,基本 使用方法,以及利用memcheck如何發(fā)現(xiàn)目前開(kāi)發(fā)中最廣泛的五大類(lèi)內(nèi)存問(wèn)題。在項(xiàng)目中盡早的發(fā)現(xiàn)內(nèi)存問(wèn)題,能夠極大地提高開(kāi)發(fā)效率,valgrind 就是能夠幫助你實(shí)現(xiàn)這一目標(biāo)的出色工具。


參考資料

關(guān)于作者

楊經(jīng),他的技術(shù)興趣包括自動(dòng)化測(cè)試與linux系統(tǒng)管理。目前是IBM中國(guó)系統(tǒng)與技術(shù)實(shí)驗(yàn)室(CSTL)的軟件工程師,從事中小型企業(yè)(SME)服務(wù)器的測(cè)試工作,可以通過(guò)cdlyangj@cn.ibm.com與他聯(lián)系。


轉(zhuǎn)自:
http://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/
posted on 2011-12-30 14:24 胡滿(mǎn)超 閱讀(340) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            揄拍成人国产精品视频| 欧美亚洲一级| 亚洲午夜精品久久| 国产精品海角社区在线观看| 亚洲综合二区| 久久露脸国产精品| 亚洲激情视频| 国产精品高潮呻吟久久av无限| 亚洲欧洲av一区二区| 久久综合中文色婷婷| 亚洲精品久久久久| 欧美午夜久久久| 欧美在线免费视频| 亚洲国产精品美女| 亚洲免费影视| 在线成人中文字幕| 欧美精品亚洲精品| 亚洲欧美色婷婷| 亚洲电影欧美电影有声小说| 亚洲一区二区精品视频| 国产一区二区三区网站| 欧美激情一二区| 欧美一区二区三区日韩视频| 亚洲高清视频一区二区| 午夜伦欧美伦电影理论片| 在线观看中文字幕不卡| 国产精品久久久久9999| 美女视频黄 久久| 亚洲图片欧洲图片日韩av| 久久免费的精品国产v∧| 一区二区日韩| 亚洲国产精品福利| 国产精品一区二区视频| 欧美精品在线播放| 久久精品免费电影| 宅男噜噜噜66国产日韩在线观看| 欧美成人一区二免费视频软件| 欧美激情第一页xxx| 亚洲欧美在线免费观看| 亚洲麻豆视频| 欧美国产日本在线| 久久久欧美精品| 亚洲欧美日韩国产成人精品影院| 亚洲精品久久久久久久久久久久久| 国产欧美不卡| 欧美特黄a级高清免费大片a级| 免费观看一级特黄欧美大片| 香港成人在线视频| 一本色道久久88精品综合| 欧美国产日本| 欧美不卡一区| 久久久五月天| 国产精品久久久久av免费| 免费欧美在线视频| 久久久久高清| 久久精品视频播放| 亚洲欧美日韩精品久久奇米色影视| 亚洲精品免费在线播放| 欧美第十八页| 欧美成人情趣视频| 久久综合久久久| 久久久人成影片一区二区三区观看| 欧美亚洲视频在线看网址| 亚洲午夜精品一区二区| 在线中文字幕不卡| 一区二区福利| 国产精品99久久久久久人| 99精品热6080yy久久| 亚洲激情视频在线播放| 最新中文字幕亚洲| 亚洲欧洲在线视频| 亚洲人成绝费网站色www| 亚洲激情影院| 亚洲美洲欧洲综合国产一区| 日韩视频在线免费| 一本到高清视频免费精品| 一道本一区二区| 亚洲男女自偷自拍| 欧美一区二区三区免费大片| 久久激情综合网| 久久一区二区三区四区| 欧美第十八页| 亚洲黄色片网站| 亚洲日本在线观看| 一区二区成人精品| 亚洲一区三区电影在线观看| 亚洲欧美日韩视频二区| 欧美诱惑福利视频| 久久亚洲视频| 欧美日韩精品是欧美日韩精品| 国产精品啊啊啊| 国产人妖伪娘一区91| 伊人精品成人久久综合软件| 91久久精品美女| 一本一本久久a久久精品综合麻豆| 亚洲一区999| 久久都是精品| 亚洲国产成人在线| 夜色激情一区二区| 久久精品99国产精品| 男女视频一区二区| 国产精品jizz在线观看美国| 国产真实精品久久二三区| 91久久夜色精品国产九色| 亚洲午夜久久久久久尤物| 久久爱www久久做| 欧美激情精品久久久六区热门 | 亚洲二区在线| 一个人看的www久久| 久久精品亚洲一区二区| 欧美激情综合| 国产亚洲va综合人人澡精品| 亚洲日本一区二区三区| 午夜一级久久| 亚洲福利视频三区| 亚洲欧美日韩成人高清在线一区| 鲁大师成人一区二区三区| 欧美午夜电影网| 亚洲国产一区二区a毛片| 亚洲欧美激情诱惑| 欧美黄色大片网站| 亚洲欧美一区二区原创| 欧美激情一区二区三区在线| 国产一区久久久| 亚洲午夜高清视频| 欧美大片在线影院| 亚洲免费人成在线视频观看| 免费成人av在线看| 国产欧美三级| 亚洲永久免费视频| 日韩午夜av| 久热综合在线亚洲精品| 亚洲一区二区三区久久| 欧美黄色免费网站| 精品91视频| 欧美一区免费视频| 日韩亚洲欧美一区| 你懂的视频一区二区| 国内精品久久久久久久97牛牛| 亚洲一卡二卡三卡四卡五卡| 欧美高清在线一区二区| 久久成人免费网| 国产精品网站在线| 亚洲欧美日韩中文播放| 亚洲精品中文字幕女同| 嫩草成人www欧美| 在线观看一区| 你懂的一区二区| 久久久精品国产免费观看同学| 国产欧美日韩不卡| 香蕉久久a毛片| 亚洲欧美国产高清| 国产精品五区| 欧美一区二区三区另类 | 久久久999国产| 亚洲欧美另类在线| 国产精品久久久久久久久动漫| 亚洲素人一区二区| 一本大道久久a久久综合婷婷 | 亚洲欧洲综合另类| 欧美aa在线视频| 久久综合五月天婷婷伊人| 国产精品一卡| 欧美亚洲免费电影| 午夜精品福利视频| 国产视频一区三区| 久久精品视频在线看| 欧美中文字幕视频在线观看| 国内精品免费午夜毛片| 久热爱精品视频线路一| 榴莲视频成人在线观看| 亚洲精品美女在线观看| 亚洲精品久久视频| 欧美日韩激情小视频| 国产日韩欧美精品一区| 亚洲在线成人精品| 日韩天堂在线观看| 国产精品久久久一区二区| 亚洲国产精品日韩| 亚洲国产精品热久久| 欧美日韩www| 午夜一区不卡| 久久久久久欧美| 亚洲精品九九| 亚洲影院色在线观看免费| 国产在线精品自拍| 亚洲国产成人一区| 国产精品久久激情| 久久一区二区三区av| 欧美精品在线极品| 羞羞答答国产精品www一本| 久久激情视频久久| 亚洲精品影视在线观看| 艳妇臀荡乳欲伦亚洲一区| 国产一区 二区 三区一级| 欧美高清在线| 国产精品白丝jk黑袜喷水| 久久久另类综合| 欧美激情 亚洲a∨综合| 欧美亚洲视频在线观看|