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

Linux下c++程序內存泄漏檢測代碼范例

開發 后端
Linux下對于程序內存泄漏檢測的方法很多,最常用的的莫過于使用valgrind工具。但是valgrind相當于讓程序在虛擬機中運行,會帶 來較大的系統資源開銷,還會對程序的運行效率產生較大影響,對于那種資源占用大的程序,如果需要長時間運行才能暴露的泄漏問題,它就顯得不太好用。
Linux下對于程序內存泄漏檢測的方法很多,最常用的的莫過于使用valgrind工具。但是valgrind相當于讓程序在虛擬機中運行,會帶 來較大的系統資源開銷,還會對程序的運行效率產生較大影響,對于那種資源占用大的程序,如果需要長時間運行才能暴露的泄漏問題,它就顯得不太好用。

linux下的c++程序中自己實現一個輕量級的泄漏檢測代碼其實是比較方便的,下面我就給出一個簡單的范例,并作簡單的說明。當然,我們還是應該提倡使用共享指針,用共享指針自動管理內存可以避免內存泄漏這樣的不必要的麻煩。

 Linux下c++程序內存泄漏檢測代碼范例

基本原理:
  • 利用glibc提供的__malloc_hook, __free_hook系列函數對內存分配是否做監控;(詳見glibc的官方文檔)
  • 利用backtrace函數獲取函數調用棧,并記錄;
  • 利用backtrace_symbols對調用棧對應的函數做解析;

進一步處理:

  •  使用abi::__cxa_demangle把函數名解析為源代碼風格;
  •  使用addr2line解析出函數調用棧對應的代碼行;
  •  對于動態庫(.so)中的地址解析,需要先在/proc/<pid>/maps文件中找到動態庫映射的基地址,才能做解析。

注意:

編譯連接參數中使用-g -rdynamic

以上每步具體實現的代碼可能都沒有達到***,甚至可能是笨辦法,如果有更好的實現方案請直接替換,也歡迎賜教。

示例代碼:

 

leakmom.cpp

 

  1. /* Prototypes for __malloc_hook, __free_hook */ 
  2. #include <malloc.h> 
  3. #include <map> 
  4. #include <utility> 
  5. #include <execinfo.h> 
  6. #include <errno.h> 
  7. #include  <assert.h> 
  8. #include <cxxabi.h> 
  9. #include <sys/types.h> 
  10. #include <unistd.h> 
  11. #include <stdlib.h> 
  12. #include "leakmon.h" 
  13.  
  14. CMutexLock gLock ; 
  15. std::map <void*, _PtrInfo> gPtrInfo ; 
  16. std::map <const LmCallStack*, _AllocInfo ,  __comp> gLeakInfo; 
  17.  
  18.  
  19. const int LmCallStack:: MAX_STACK_LAYERS = 32; 
  20.  
  21. /* Prototypes for our hooks. */ 
  22. static void my_init_hook ( void); 
  23. static void *my_malloc_hook ( size_tconst void *); 
  24. static void my_free_hook ( void*, const void *); 
  25.  
  26. void *(*__MALLOC_HOOK_VOLATILE old_malloc_hook)( size_t __size , const void *) ; 
  27. void (*__MALLOC_HOOK_VOLATILE old_free_hook) ( void *__ptr , const void *); 
  28. /* Override initializing hook from the C library. */ 
  29. void (*__MALLOC_HOOK_VOLATILE __malloc_initialize_hook) ( void) = my_init_hook; 
  30.  
  31. void my_init_hook (void
  32.     old_malloc_hook = __malloc_hook ; 
  33.     old_free_hook = __free_hook ; 
  34.     __malloc_hook = my_malloc_hook ; 
  35.     __free_hook = my_free_hook ; 
  36.  
  37. static void *my_malloc_hook ( size_t size , const void *caller ) 
  38.     void *result ; 
  39.        gLock.lock (); 
  40.     /* Restore all old hooks */ 
  41.     __malloc_hook = old_malloc_hook ; 
  42.     __free_hook = old_free_hook ; 
  43.     /* Call recursively */ 
  44.     result = malloc (size); 
  45.     /* Save underlying hooks */ 
  46.     old_malloc_hook = __malloc_hook ; 
  47.     old_free_hook = __free_hook ; 
  48.     /* printf might call malloc, so protect it too. */ 
  49.     //printf ("malloc (%u) returns %p\n", (unsigned int) size, result); 
  50.        RecordPtr( result , size); 
  51.  
  52.     /* Restore our own hooks */ 
  53.     __malloc_hook = my_malloc_hook ; 
  54.     __free_hook = my_free_hook ; 
  55.        gLock.unlock (); 
  56.     return result ; 
  57.  
  58. static void my_free_hook ( void *ptr , const void *caller ) 
  59.        gLock.lock (); 
  60.     /* Restore all old hooks */ 
  61.     __malloc_hook = old_malloc_hook ; 
  62.     __free_hook = old_free_hook ; 
  63.     /* Call recursively */ 
  64.     free (ptr ); 
  65.     /* Save underlying hooks */ 
  66.     old_malloc_hook = __malloc_hook ; 
  67.     old_free_hook = __free_hook ; 
  68.     /* printf might call free, so protect it too. */ 
  69.     //printf ("freed pointer %p\n", ptr); 
  70.  
  71.        RemovePtr( ptr ); 
  72.  
  73.     /* Restore our own hooks */ 
  74.     __malloc_hook = my_malloc_hook ; 
  75.     __free_hook = my_free_hook ; 
  76.        gLock.unlock (); 
  77.  
  78. void RecordPtr ( void* ptr, size_t size) 
  79.        // 獲取調用棧 
  80.        void *array [LmCallStack:: MAX_STACK_LAYERS]; 
  81.        int cstSize = backtrace( array, LmCallStack ::MAX_STACK_LAYERS); 
  82.  
  83.        // 保存指針 調用棧 
  84.        LmCallStack* callstack = new LmCallStack(array , cstSize); 
  85.  
  86.        gLock.lock (); 
  87.  
  88.        std::map <const LmCallStack*, _AllocInfo ,  __comp>:: iterator it = gLeakInfo.find (callstack); 
  89.        if (it != gLeakInfo. end()) 
  90.       { 
  91.              it->second .size += size; 
  92.              it->second .alloc++; 
  93.  
  94.              _PtrInfo pi (it-> first, size ); 
  95.              gPtrInfo[ptr ] = pi; 
  96.       } 
  97.        else 
  98.       { 
  99.              _AllocInfo aif (size, 1, 0); 
  100.              std::pair <std:: map<const LmCallStack*, _AllocInfo,  __comp>::iterator , bool> ret = gLeakInfo .insert( std::pair <const LmCallStack*, _AllocInfo >(callstack, aif)); 
  101.              
  102.              if (ret .second) 
  103.             { 
  104.                    _PtrInfo pi (ret. first->first , size); 
  105.                    gPtrInfo[ptr ] = pi; 
  106.             } 
  107.              else 
  108.             { 
  109.                    // failed 
  110.             } 
  111.       } 
  112.  
  113.        gLock.unlock (); 
  114.  
  115. void RemovePtr ( void* ptr ) 
  116.        gLock.lock (); 
  117.  
  118.        std::map <void*, _PtrInfo>::iterator it = gPtrInfo.find (ptr); 
  119.        if (it != gPtrInfo. end()) 
  120.       { 
  121.              std::map <const LmCallStack*, _AllocInfo ,  __comp>:: iterator itc = gLeakInfo .find( it->second .csk); 
  122.              if (itc != gLeakInfo. end()) 
  123.             { 
  124.                    itc->second .size -= it->second .size; 
  125.                    itc->second .free++; 
  126.  
  127.                    if (0 == (itc ->second. alloc - itc ->second. free)) 
  128.                   { 
  129.                          assert(0 == itc ->second. size); 
  130.                          delete itc ->first; 
  131.                          gLeakInfo.erase (itc); 
  132.                   } 
  133.             } 
  134.  
  135.              gPtrInfo.erase (it); 
  136.       } 
  137.  
  138.        gLock.unlock (); 
  139.  
  140. void Report () 
  141.        char **strings = NULL; 
  142.        gLock.lock (); 
  143.  
  144.        __malloc_hook = old_malloc_hook ; 
  145.     __free_hook = old_free_hook ; 
  146.  
  147.        for (std ::map< const LmCallStack *, _AllocInfo,  __comp>::iterator it = gLeakInfo .begin(); 
  148.              it != gLeakInfo .end(); 
  149.              it++) 
  150.       { 
  151.              printf("\n" ); 
  152.              printf("====>  size: %ld,  allocs: %d,  frees: %d, a-f: %d\n", it-> second.size , it-> second.alloc , it-> second.free , it->second .alloc- it->second .free ); 
  153.              printf("====>  stacks back trace:\n" ); 
  154.              strings = backtrace_symbols ((void**) it->first ->callstack, it->first ->size); 
  155.              if (strings ) 
  156.             { 
  157.                    for(int i = 2; i < it ->first-> size; i ++) 
  158.                   { //printf("     %s\n", strings[i]); 
  159.                          char output [1024] = {0}; 
  160.                          memset(output , 0, 1024); 
  161.                          char temp [1024] = {0}; 
  162.                          memset(temp , 0, 1024); 
  163.                          //// 
  164.                          ////    get real function name 
  165.                          //// 
  166.                          if (1 == sscanf (strings[ i], "%*[^(]%*[^_]%[^)+]" , temp)) 
  167.                         { 
  168.                                      int status ; 
  169.                                      char* realname = abi::__cxa_demangle (temp, 0, 0, & status); 
  170.                                      if (0 == status ) 
  171.                                     { 
  172.                                            char* p = strchr( strings[i ], '('); 
  173.                                            memcpy(output , strings[ i], p-strings [i]); 
  174.                                            sprintf(output +(p- strings[i ]), "(%s+%p) " , realname, (( void**)it ->first-> callstack)[i ]); //printf("     -%s\n", realname); 
  175.                                            free(realname ); 
  176.                                     } 
  177.                                      else 
  178.                                     { 
  179.                                            char* p = strchr( strings[i ], ')'); 
  180.                                            memcpy(output , strings[ i], p-strings [i]+2); 
  181.                                     } 
  182.                         } 
  183.                          else 
  184.                         { 
  185.                                char* p = strchr( strings[i ], ')'); 
  186.                                memcpy(output , strings[ i], p-strings [i]+2); 
  187.                         } 
  188.  
  189.                          FILE * fp ; 
  190.                          char module [1024] = {0}; 
  191.                          memset(module , 0, 1024); 
  192.                          char* pm = strchr( strings[i ], '('); 
  193.                          memcpy(module , strings[ i], pm -strings[ i]); 
  194.  
  195.                          if (strstr (module, ".so")) 
  196.                         { 
  197.                                __pid_t pid = getpid(); 
  198.                                sprintf(temp , "grep %s /proc/%d/maps", module, pid ); 
  199.                                /// 
  200.                                ///         get library base-map-address 
  201.                                /// 
  202.                                fp = popen (temp, "r"); 
  203.                                if (fp ) 
  204.                               { 
  205.                                      char baseaddr [64]; 
  206.                                      unsigned long long base; 
  207.                                      
  208.                                      fgets(temp , sizeof( temp)-1, fp );  //printf("memmap: %s\n", temp); 
  209.                                      sscanf(temp , "%[^-]", baseaddr); 
  210.                                      base = strtoll (baseaddr, NULL, 16); //printf("baseaddr:%s\n", baseaddr); //printf(" base:0x%llx\n", base); 
  211.  
  212.                                      sprintf(temp , "addr2line -e %s %p", module, (void *)((unsigned long long)((void **)it-> first->callstack )[i]- base)); 
  213.                               } 
  214.                         } 
  215.                          else 
  216.                         { 
  217.                                sprintf(temp , "addr2line -e %s %p", module, ((void **)it-> first->callstack )[i]); 
  218.                         } 
  219.                          //// 
  220.                          ////    get source file name and line number 
  221.                          //// 
  222.                          fp = popen (temp, "r");  //printf("cmdline: %s\n", temp); 
  223.                          if (fp ) 
  224.                         { 
  225.                                fgets(temp , sizeof( temp)-1, fp ); //printf("     -%s\n", temp); 
  226.  
  227.                                strcat(output , temp); 
  228.                                printf("   ->  %s" , output); 
  229.                                pclose(fp ); 
  230.                         } 
  231.                          else 
  232.                         { 
  233.                                printf("   ->  %s\n" , output); 
  234.                         } 
  235.                   } 
  236.  
  237.                    free(strings ); 
  238.                    strings = NULL ; 
  239.             } 
  240.       } 
  241.  
  242.        __malloc_hook = my_malloc_hook ; 
  243.     __free_hook = my_free_hook ; 
  244.  
  245.        gLock.unlock (); 
  246.  
  247.  
  248. ////////////////////////////////////////////////////////////////////////// 
  249.  
  250. CMutexLock::CMutexLock () 
  251.        pthread_mutexattr_t  m_attr ; 
  252.        pthread_mutexattr_init(&m_attr ); 
  253.        pthread_mutexattr_settype(&m_attr , PTHREAD_MUTEX_RECURSIVE); 
  254.  
  255.        if (0 != pthread_mutex_init (&m_mutex , & m_attr)) 
  256.       { 
  257.              printf("c_lock::c_lock pthread_mutex_init error<%d>.\n" , errno); 
  258.              assert(0); 
  259.       } 
  260.  
  261.        pthread_mutexattr_destroy(&m_attr ); 
  262.  
  263. CMutexLock::~CMutexLock () 
  264.        if(0 != pthread_mutex_destroy (&m_mutex)) 
  265.       { 
  266.              printf("c_lock::~c_lock pthread_mutex_destroy error<%d>.\n" , errno); 
  267.              assert(0); 
  268.       } 
  269.  
  270. void 
  271. CMutexLock::lock () 
  272.  
  273.        if(0 != pthread_mutex_lock (&m_mutex)) 
  274.       { 
  275.              assert("c_lock::lock pthread_mutex_lock " && 0); 
  276.       } 
  277.  
  278. void 
  279. CMutexLock::unlock () 
  280.        int iRet = 0; 
  281.  
  282.        if(0 != (iRet = pthread_mutex_unlock(& m_mutex))) 
  283.       { 
  284.              printf("c_lock::unlock pthread_mutex_unlock ret<%d> error<%d>.\n", iRet, errno ); 
  285.              assert(0); 
  286.       } 
  287.  
  288. 示例代碼: 
  289. leakmom.h 
  290.  
  291. //////////////////////////////////////////////////////////////////////// 
  292. // 
  293. //    The Executable file MUST be linked with parameter '-rdynamic' !!! 
  294. // 
  295. //////////////////////////////////////////////////////////////////////// 
  296.  
  297. #pragma once 
  298. #include <string.h> 
  299. #include <pthread.h> 
  300.                          
  301. // 
  302. class LmCallStack 
  303. public
  304.        char* callstack ; // pointer to buffer recording callstack addresses 
  305.        int size ; // count of call stacks 
  306.        static const int MAX_STACK_LAYERS; 
  307. public
  308.        LmCallStack(void * csk= NULL, int s=0) 
  309.       { 
  310.              if (csk ) 
  311.             { 
  312.                    callstack = new char[ s*sizeof (void*)]; 
  313.                    memcpy(callstack , csk, s*sizeof (void*)); 
  314.             } 
  315.              else 
  316.             { 
  317.                    callstack = (char *)csk; 
  318.             } 
  319.              size = s ; 
  320.       } 
  321.  
  322.       ~ LmCallStack() 
  323.       { 
  324.              if (callstack ) 
  325.             { 
  326.                    delete[] callstack ; 
  327.             } 
  328.              callstack = NULL ; 
  329.              size = 0; 
  330.       } 
  331. }; 
  332.  
  333. class __comp 
  334. public
  335.        __comp(){}; 
  336.        bool operator () (const LmCallStack* first , const LmCallStack* second) 
  337.       { 
  338.              return ((first ->size < second->size ) || 
  339.                         ( first->size == second-> size && 
  340.                                      memcmp(first ->callstack, second->callstack , sizeofvoid*)*first ->size) < 0) 
  341.                         ); 
  342.       } 
  343. }; 
  344.  
  345. struct _PtrInfo 
  346.        _PtrInfo(const LmCallStack* c=NULL , long s=0) 
  347.       { 
  348.              csk = c ; 
  349.              size = s ; 
  350.       } 
  351.        const LmCallStack * csk; 
  352.        long size ; 
  353. }; 
  354.  
  355. struct _AllocInfo 
  356.        _AllocInfo(long s=0, int a =0, int f=0) 
  357.       { 
  358.              size=s ; 
  359.              alloc=a ; 
  360.              free=f ; 
  361.       } 
  362.        // 
  363.        long size ; 
  364.        int alloc ; 
  365.        int free ; 
  366. }; 
  367.  
  368. class CMutexLock 
  369. public
  370.        CMutexLock(); 
  371.       ~ CMutexLock(); 
  372.  
  373. public
  374.        void lock (); 
  375.        void unlock (); 
  376.  
  377. private
  378.        pthread_mutex_t m_mutex ; 
  379. }; 
  380.  
  381.  
  382. // 
  383. void RecordPtr ( void* ptr, size_t size); 
  384. void RemovePtr (void* ptr); 
  385. void Report (); 
 
 
 
責任編輯:王雪燕 來源: yichigo的博客
相關推薦

2011-06-16 09:28:02

C++內存泄漏

2024-07-03 11:28:15

2025-10-27 01:33:00

2025-11-17 09:27:09

2025-03-03 00:00:00

2011-08-15 10:16:55

內存泄露

2019-09-29 00:25:11

CC++內存泄漏

2013-08-02 09:52:14

AndroidApp內存泄漏

2010-02-04 10:19:39

C++多線程

2024-04-19 08:00:00

2017-09-07 16:52:23

2025-05-26 04:00:00

2021-03-26 05:59:10

內存檢測工具

2010-02-01 14:26:50

C++讀寫文本文件

2024-12-19 14:42:15

C++內存泄漏內存管理

2023-10-31 16:40:38

LeakCanary內存泄漏

2015-07-10 09:15:47

LeakCanary內存泄漏

2018-12-07 10:52:08

內存泄漏方法

2010-09-25 11:07:45

Java內存泄漏

2020-11-02 09:48:35

C++泄漏代碼
點贊
收藏

51CTO技術棧公眾號

久久久精品中文字幕麻豆发布| 国产欧美日韩精品一区二区三区| 一区二区三区日韩欧美| 国产精品av一区| 精品欧美一区二区三区免费观看| 国产影视一区| 日韩一级片在线播放| 日韩av高清在线看片| 国产粉嫩一区二区三区在线观看| 久久99九九99精品| 午夜精品美女自拍福到在线| 亚洲精品国产一区黑色丝袜| 亚洲视频精选| 欧美午夜精品免费| 蜜桃传媒一区二区三区| 午夜伦理在线| 91蝌蚪porny| 91丨九色丨国产在线| 日韩在线视频不卡| 国内一区二区三区| 亚洲香蕉成视频在线观看| 成人一区二区三区仙踪林| 台湾成人免费视频| 欧美日韩精品中文字幕| 300部国产真实乱| av资源在线观看免费高清| eeuss影院一区二区三区| 91精品视频专区| 国产精品免费无遮挡无码永久视频| 欧美国产日本| www亚洲欧美| 欧美人与性囗牲恔配| 欧美成人基地| 欧美成人a视频| 91欧美一区二区三区| 少妇精品视频一区二区免费看| 偷拍亚洲欧洲综合| 国内少妇毛片视频| aaa日本高清在线播放免费观看| 成年人网站91| 国产富婆一区二区三区 | 日本久久一区二区| 日本午夜激情视频| 麻豆蜜桃在线| 一区二区三区在线视频观看| 中文字幕乱码一区二区三区| caoporn国产精品免费视频| 久久天堂av综合合色蜜桃网| 久久久久se| 三级在线观看| 久久综合色婷婷| 狠狠久久综合婷婷不卡| 日韩一级免费视频| 不卡视频在线看| 国产免费一区| 国产成人无码www免费视频播放| 国产精选一区二区三区| 91精品视频在线播放| 99精品国产99久久久久久97| 国产一区91精品张津瑜| 91美女片黄在线观看游戏| 国产精品一级视频| 国内欧美视频一区二区| 亚洲一区二区三区777| 国产日韩一级片| 国产另类ts人妖一区二区| 亚洲xxx自由成熟| www香蕉视频| 成人免费高清视频在线观看| 国产欧美日韩一区二区三区| 全国男人的天堂网| 99riav久久精品riav| 欧美日韩一区二 | 国产乱人乱偷精品视频| 国产一区二三区好的| 91久久偷偷做嫩草影院| 成人乱码一区二区三区| 91丨porny丨中文| 日产精品一线二线三线芒果| 在线视频91p| 一区二区三区国产精品| 欧美三级在线观看视频| 婷婷六月国产精品久久不卡| 欧美日韩国产123区| 2025中文字幕| 亚洲老女人视频免费| 最近中文字幕日韩精品 | 欧美草逼视频| 欧美性猛交xxxxx免费看| 杨幂毛片午夜性生毛片| 日韩中文字幕一区二区高清99| 亚洲精品乱码久久久久久金桔影视| 国产精品揄拍100视频| 91综合久久一区二区| 欧美激情在线播放| 懂色av蜜臀av粉嫩av分享吧最新章节| 久久99精品国产.久久久久久| 91久久极品少妇xxxxⅹ软件| 人成免费电影一二三区在线观看| 国产精品久久99| 精品人妻少妇一区二区| 国产极品嫩模在线观看91精品| 欧美成人一区二区三区片免费| 一级性生活毛片| 亚洲成av人片乱码色午夜| 2019中文字幕在线免费观看| 国产精品久久久久久久久久久久久久久久久久 | 国产精品国产一区二区三区四区| 99久久精品国产一区| 亚洲砖区区免费| 精品国产第一福利网站| 欧美美女视频在线观看| 大地资源二中文在线影视观看 | 欧美丰满少妇xxxxx| 国产suv精品一区二区33| 国产成人免费视频| 亚洲 国产 日韩 综合一区| 变态调教一区二区三区| 欧美欧美午夜aⅴ在线观看| 日韩aaaaa| 欧美日本国产| 国产综合香蕉五月婷在线| 亚洲色图欧美视频| 一区二区三区蜜桃网| 天堂一区在线观看| 亚洲日本三级| 97在线视频免费看| 精品国产九九九| 亚洲欧美怡红院| 在线观看国产中文字幕| 国产日韩欧美一区二区三区| 91精品国产91久久久久久吃药 | 伊人av综合网| 国产区一区二区三| 成人v精品蜜桃久久一区| 中文字幕一区二区三区四区五区人| 色老太综合网| 亚洲免费精彩视频| 国产精品久久久久久久久久久久久久久久久 | 奇米狠狠一区二区三区| 97超级碰碰人国产在线观看| 丰满人妻熟女aⅴ一区| 亚洲美女在线国产| 国产又粗又长又爽又黄的视频| 日韩精品一区二区三区免费观看| 国产精品女人久久久久久| 精品影院一区| 色久优优欧美色久优优| 色哟哟精品观看| 日韩av不卡一区二区| 日韩激情视频| 成人午夜sm精品久久久久久久| 一二美女精品欧洲| 伊人亚洲综合网| 国产精品高潮呻吟| 天天干天天色天天干| 久久久久久久久久久久久久| 91九色在线视频| 黄色网址免费在线观看| 欧美一级一级性生活免费录像| 男人的天堂久久久| 顶级嫩模精品视频在线看| 国产69精品久久久久999小说| 久久久亚洲欧洲日产| 日本久久久久久| 成人高清在线| 欧美精品日日鲁夜夜添| 久久精品视频免费在线观看| 成人性生交大片| 国产精品后入内射日本在线观看| 久久成人高清| 国产九九精品视频| 污网站在线免费看| 亚洲精品videossex少妇| 99精品人妻国产毛片| 亚洲国产精品二十页| 免费人成视频在线播放| 99精品国产在热久久| 欧美精品一区二区视频| 日本精品久久| 国内自拍欧美激情| 国产日韩精品在线看| 欧美一区二区视频免费观看| 日本中文字幕免费| 久久婷婷色综合| 久久出品必属精品| 国产视频一区免费看| 在线国产99| 色综合久久中文| 成人黄色免费片| 91九色porn在线资源| 一本色道久久88综合亚洲精品ⅰ| 国产成人精品a视频| 一本大道久久精品懂色aⅴ | 午夜精品电影| 蜜桃传媒一区二区| 国产精区一区二区| 欧洲午夜精品久久久| 黄色免费在线网站| 日韩成人激情视频| 国产xxxxxx| 在线免费观看成人短视频| 妺妺窝人体色www聚色窝仙踪 | 国产一区二区伦理| 91精品91久久久中77777老牛| 99国产精品免费视频观看| 国产精品一区二区a| 国产第一精品| 欧美专区日韩视频| 手机av在线播放| 中文日韩电影网站| 香蕉视频911| 日韩视频在线一区二区| japanese国产在线观看| 亚洲高清久久久| 182在线观看视频| 国产日韩欧美电影| 中文字幕av观看| 岛国av在线一区| 男插女视频网站| 久久国产精品99精品国产| 337p粉嫩大胆噜噜噜鲁| 欧美午夜免费影院| 欧美日韩一区二区三区电影| 狠狠操综合网| 欧美日韩精品中文字幕一区二区| 亚洲精品黑牛一区二区三区| 成人欧美一区二区三区在线 | 国产高清自拍一区| 精品伊人久久| 成人免费看吃奶视频网站| 岛国一区二区| 国产精品爽爽爽爽爽爽在线观看| 欧美gay视频| 538国产精品一区二区免费视频| 色黄网站在线观看| 蜜臀久久99精品久久久无需会员| 又爽又大又黄a级毛片在线视频| 国产一区二区三区在线| 日韩偷拍自拍| 亚洲免费精彩视频| 蜜桃免费在线| 国产亚洲精品日韩| 成av人电影在线观看| 在线播放国产一区中文字幕剧情欧美 | 亚洲女人天堂成人av在线| 神马午夜在线观看| 日韩av在线免费| 少妇无码一区二区三区| 亚洲国产精品推荐| 性xxxx视频| 国产丝袜高跟一区| 国产私拍精品| 中文字幕av一区二区| h视频在线免费| yw.139尤物在线精品视频| 老司机午夜在线| 欧美国产日韩一区二区在线观看| 羞羞网站在线免费观看| 国内精品久久久久伊人av| 美女91在线看| 国产精品成人一区二区三区吃奶| 亚洲成人一区在线观看| 国产精品自产拍在线观看| 国产专区精品| 成人自拍爱视频| 日韩高清成人在线| 日本中文不卡| 亚洲在线久久| 成人网站免费观看入口| 先锋a资源在线看亚洲| 亚洲中文字幕久久精品无码喷水| 久久国产精品72免费观看| 在线观看av免费观看| 成人av午夜电影| 蜜桃精品一区二区| 亚洲日本一区二区三区| 国产精品suv一区二区69| 色综合天天综合网天天看片| 亚洲天堂avav| 精品国产乱码久久久久久久| 人成免费电影一二三区在线观看| 日韩视频免费大全中文字幕| 日本精品600av| 日韩免费在线看| 韩国三级大全久久网站| 精品在线观看一区二区| 日韩久久综合| 国产3p露脸普通话对白| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品九色蝌蚪自拍| 免费无码毛片一区二区app| 欧美日韩另类字幕中文| 91黄色在线视频| 精品一区二区亚洲| av在线免费观看网址| 欧美一级大片视频| 视频一区视频二区欧美| 日本一区二区在线视频观看| 欧美精品一区二区三区久久久竹菊| 国产综合免费视频| 国产高清一区日本| 国产三级黄色片| 亚洲h在线观看| 国产精品系列视频| 在线视频精品一| 免费成人在线电影| 高清视频在线观看一区| 久久综合88| 男女曰b免费视频| 成人小视频免费观看| 美女av免费看| 欧美视频免费在线| 亚洲AV无码成人片在线观看 | 91九色porn在线资源| 成人国产亚洲精品a区天堂华泰| 嫩草影视亚洲| 国产黄色片免费在线观看| 韩日av一区二区| 久久视频精品在线观看| 精品美女国产在线| 亚洲国产成人一区二区| 久久精品成人动漫| 国产成人福利夜色影视| 少妇免费毛片久久久久久久久| 一区二区动漫| 国产精品嫩草av| 亚洲国产欧美在线| 99视频在线观看免费| 久久精品中文字幕电影| 欧美美女被草| 亚洲欧洲精品一区二区三区波多野1战4| 国产精品嫩草99av在线| 黄色免费视频网站| 亚洲电影在线播放| 亚洲国产999| 久久男人的天堂| 成人看片爽爽爽| 人妻av中文系列| thepron国产精品| 亚洲免费激情视频| 日韩高清不卡av| 亚洲国产欧美日本视频| 蜜桃臀一区二区三区| 久久九九国产| 日韩中文字幕有码| 欧美性生活久久| 亚洲s色大片| 亚洲永久免费观看| 欧美日本一区| 国产69视频在线观看| 精品久久久免费| 欧美精品少妇| 国产精品久久久久不卡| 日韩精品一区二区三区免费观看| 日本人69视频| 亚洲欧美经典视频| 亚洲精品免费在线观看视频| 国产亚洲成av人在线观看导航| 国产欧美日韩一区| 欧美日韩精品| 欧美做受高潮中文字幕 | 99久久99久久精品免费看小说.| 色综合久久精品| 国产超级av在线| av在线不卡电影| 在线永久看片免费的视频| 伊人男人综合视频网| 99视频这里有精品| 欧美中文字幕在线观看视频 | 香蕉网在线播放| 在线观看亚洲精品视频| 黄色动漫在线| 国产视频一区二区三区四区| 性8sex亚洲区入口| 国产传媒在线看| 日韩美女一区二区三区| 小h片在线观看| 亚洲高清不卡一区| 国产凹凸在线观看一区二区| 91视频免费网址| 北条麻妃99精品青青久久| 久久1电影院| 杨幂毛片午夜性生毛片| 亚洲一区二区欧美| 高清毛片在线看| 成人午夜电影免费在线观看| 午夜亚洲性色视频| 一区二区三区影视| 日韩精品www| 激情综合五月| 日日碰狠狠躁久久躁婷婷| 亚洲人成人一区二区在线观看| 污视频在线免费观看| 国产欧美在线播放| 一区二区三区成人精品| 中文字幕五月天| 亚洲女人被黑人巨大进入| 亚洲超碰在线观看| 天天综合网久久|