精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲国产123| 黑森林精品导航| 欧洲av在线播放| 香蕉视频成人在线观看| 亚洲视频精品在线| 亚洲娇小娇小娇小| 成年人国产在线观看| 久久老女人爱爱| 91视频8mav| 六月丁香婷婷综合| 久久久久久久久99精品大| 亚洲第一免费网站| 超碰在线公开97| 丰满大乳少妇在线观看网站| 欧美极品另类videosde| a级国产乱理论片在线观看99| 久久国产视频一区| 欧美国产综合| 最近2019年手机中文字幕| 成人欧美精品一区二区| 国产社区精品视频| 久久久无码精品亚洲日韩按摩| 91免费看片在线| 国产成人麻豆免费观看| 亚洲精品视频啊美女在线直播| 最近中文字幕mv在线一区二区三区四区| 蜜桃色一区二区三区| 成人四虎影院| 一本久道中文字幕精品亚洲嫩| 337p亚洲精品色噜噜狠狠p| 国产69久久| 91亚洲精品久久久蜜桃| 成人自拍爱视频| 国产一区二区在线视频观看| 日本成人中文字幕在线视频| 欧美伊久线香蕉线新在线| 久久久久久欧美精品se一二三四| 91日韩视频| 亚洲视频在线观看免费| 国产激情第一页| 精品视频在线观看网站| 欧美日韩国产另类不卡| 欧美三级理论片| 成人欧美大片| 色综合夜色一区| 69堂免费视频| 极品av在线| 亚洲一区二区三区精品在线| 日本久久久网站| av在线官网| 亚洲免费观看高清完整版在线观看 | 日本不卡高清视频| 国产97人人超碰caoprom| 日本一级淫片免费放| 国产主播一区| 欧美日韩国产成人| 久艹视频在线观看| 欧美三级特黄| 国内精品久久久久久中文字幕| 九九在线观看视频| 91久久午夜| 国产91精品黑色丝袜高跟鞋| 中文字幕视频网| 久久精品动漫| 国产成人av在线| 中文字字幕在线观看| 美女网站色91| 亚洲最大av在线| 亚洲免费不卡视频| 成人免费毛片片v| 久久99精品久久久久久三级| 国产最新视频在线| 中文字幕一区二区三区在线播放 | 国产97色在线| 91 中文字幕| 国产精选一区二区三区| 国产日韩精品推荐| 黄色在线观看网| 国产精品毛片无遮挡高清| 国产四区在线观看| 日本孕妇大胆孕交无码| 狠狠干狠狠久久| wwwwww.色| 国产精品va视频| 精品国产乱码久久久久久久久| 国产精品成人99一区无码| 九九综合在线| 不卡av电影院| 亚洲 欧美 成人| 九九精品视频在线看| 91视频网页| 天堂中文在线官网| 日本一区二区视频在线| 黄色网zhan| 两个人看的在线视频www| 欧美午夜影院一区| 俄罗斯黄色录像| heyzo久久| 欧美高清一级大片| 日批视频免费在线观看| 国产麻豆午夜三级精品| 免费成人深夜夜行视频| av网站在线免费看推荐| 色哟哟精品一区| 亚洲国产日韩在线一区| 国产一区不卡| 久久久亚洲影院| 中文字幕一区二区三区免费看| 成人动漫在线一区| 亚洲一二三区在线| 在线看片国产福利你懂的| 制服丝袜成人动漫| 88久久精品无码一区二区毛片| 国产污视频在线播放| 国产手机精品在线| 国产精品成人久久久| 国产精品18久久久久久久久久久久 | 亚洲欧美一二三| 亚洲a∨精品一区二区三区导航| 日韩美女一区二区三区四区| 91精品久久久久久久久久久久| 亚洲第一区色| 91久久久久久| av在线中文| 欧美天堂在线观看| 人妻 日韩 欧美 综合 制服| 久久精品国内一区二区三区水蜜桃| 日韩av电影院| 天天操天天干天天舔| 亚洲激情成人在线| 亚洲午夜精品一区| 精品国产精品久久一区免费式| 韩剧1988免费观看全集| www男人的天堂| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲国产天堂av| 午夜影院日韩| 精品国产乱码久久久久久久软件 | 欧美国产一级| 国产精品第1页| 国产中文字幕在线观看| 精品日韩视频在线观看| 国产艳妇疯狂做爰视频| 欧美特黄视频| 国产成人一区二区三区免费看| 性欧美高清come| 3atv一区二区三区| 日本一级特级毛片视频| 国产综合色精品一区二区三区| 亚洲制服欧美久久| 久久91超碰青草在哪里看| 在线观看成人黄色| 亚洲一区在线观| 日韩一区在线看| 又黄又爽又色的视频| 在线一区免费| 国产91精品一区二区绿帽| 男女视频在线| 亚洲国产精品va在看黑人| 国产乡下妇女做爰毛片| 丁香亚洲综合激情啪啪综合| www.av91| 香蕉久久夜色精品国产更新时间| 欧美一级高清免费| 国内精品在线视频| 欧美猛男超大videosgay| 亚洲少妇xxx| 国产精品中文字幕日韩精品| 无码日本精品xxxxxxxxx| 91成人福利| 日本成人免费在线| 第一视频专区在线| 欧美精品在线一区二区| 欧美激情精品久久| 国产91精品在线观看| 国产亚洲欧美在线视频| 欧美日一区二区| 91免费福利视频| h片在线观看| 亚洲四色影视在线观看| 国产一区二区小视频| 亚洲制服丝袜av| 最近中文字幕免费| 韩国av一区二区三区在线观看| 粉嫩av一区二区三区天美传媒| 成人性生交大片免费看中文视频| 日本高清视频一区| 毛片激情在线观看| 亚洲精品国精品久久99热| 亚洲欧美日韩一区二区三区四区| 亚洲日本一区二区| 少妇被狂c下部羞羞漫画| 免费在线观看不卡| 男人添女荫道口喷水视频| 国产欧美日韩免费观看| 91精品久久久久久| 免费高潮视频95在线观看网站| 中文字幕亚洲在线| 丰满熟妇乱又伦| 色婷婷精品大视频在线蜜桃视频| 粉嫩av性色av蜜臀av网站| 99精品热视频| 99re精彩视频| 免费视频久久| 91网站在线观看免费| 欧洲视频一区| 精品久久久久久乱码天堂| 日韩在线激情| 日本精品久久久久久久| 日本动漫同人动漫在线观看| 一区二区三区动漫| 乱精品一区字幕二区| 欧美剧情电影在线观看完整版免费励志电影 | 全部免费毛片在线播放一个| 欧美日韩视频一区二区| 精品国产免费观看| 亚洲精品亚洲人成人网| www..com.cn蕾丝视频在线观看免费版| 国产91富婆露脸刺激对白| 91极品视频在线观看| 国产日韩欧美一区| 99热这里只有精品免费| 欧美成人激情| 日韩av在线一区二区三区| 国产乱人伦丫前精品视频| 成人免费午夜电影| 99亚洲伊人久久精品影院| 57pao国产精品一区| 久操av在线| 欧美成年人视频网站欧美| 香港伦理在线| 尤物九九久久国产精品的特点 | 99精品美女视频在线观看热舞| 国产成人黄色av| 亚洲伊人av| 2019亚洲男人天堂| 日韩激情电影免费看| 久久久久久中文字幕| 中文字幕中文字幕在线中高清免费版| 精品国产拍在线观看| 五月婷婷在线观看| 中日韩美女免费视频网站在线观看| 邻居大乳一区二区三区| 亚洲精品一区久久久久久| 天天影院图片亚洲| 日韩大陆毛片av| 天天干天天做天天操| 亚洲第一免费播放区| 五月婷婷丁香花| 亚洲美女在线看| 欧美套图亚洲一区| 亚洲欧美成人精品| 欧美孕妇孕交xxⅹ孕妇交| 亚洲久久久久久久久久| 男人的天堂在线视频| 亚洲人成亚洲人成在线观看| 九色视频在线播放| 怡红院精品视频| 免费观看久久久久| 久热精品视频在线免费观看| 18加网站在线| 久久久久亚洲精品国产| 绿色成人影院| 日韩av片免费在线观看| julia一区二区三区中文字幕| 国产精品亚洲欧美导航| 国产欧美日韩电影| 成人国产1314www色视频| 激情小说一区| 欧美主播一区二区三区美女 久久精品人| 国产在线观看91一区二区三区| 亚洲精品一区二区三区樱花| 91精品精品| 久久国产精品网| 欧美亚洲在线| 五月天av在线播放| 成人午夜av影视| 欧美熟妇一区二区| 亚洲视频一区二区在线| 日韩高清精品免费观看| 91福利视频在线| 国产美女www爽爽爽视频| 精品国产区一区| 久久国产精品高清一区二区三区| 色偷偷9999www| 91桃色在线| 国产啪精品视频网站| 国产精品一区二区中文字幕| 天天人人精品| 欧美日韩精品一本二本三本| 精品久久久久久久免费人妻| 国产自产2019最新不卡| 在线观看av中文字幕| 国产精品国产三级国产aⅴ中文| 欧美日韩人妻精品一区二区三区| 欧美性xxxx极品hd满灌| 国产精品爽爽久久| 日韩激情在线视频| 国内精品久久久久国产| 欧美一性一乱一交一视频| 国产精品视频首页| 久久国产一区| 一区二区三区网站| 国产女女做受ⅹxx高潮| 国产乱人伦偷精品视频免下载| 亚洲午夜福利在线观看| 亚洲精品日日夜夜| 波多野结衣一二区| 欧美xfplay| 欧美成年黄网站色视频| 欧美一区二区三区图| 97精品久久| 中文字幕色一区二区| 久热精品在线| 美女黄色一级视频| 亚洲三级免费观看| 波多野结衣在线观看视频| 亚洲国产成人av在线| 在线观看电影av| 国产精品亚洲综合天堂夜夜| 天天躁日日躁狠狠躁欧美| 麻豆视频传媒入口| 蜜桃视频免费观看一区| 国产精品毛片一区二区| 婷婷国产在线综合| 国产91视频在线| 按摩亚洲人久久| 日本综合视频| 欧美精品一区二区三区在线四季| 国产精品二区影院| 午夜精品久久久久久久99热影院| 久久蜜桃av一区二区天堂| 久久国产精品波多野结衣| 91精选在线观看| 欧美极品另类| 国产精品香蕉在线观看| 精品国产91| 99久久国产宗和精品1上映| 99精品视频一区二区三区| 国产精品美女毛片真酒店| 欧美成人国产一区二区| 超碰免费公开在线| 亚洲精品免费网站| 999国产精品| 亚洲精品中文字幕乱码无线| 国产精品久久久久久妇女6080 | 欧美变态tickling挠脚心| av在线导航| 99在线免费观看视频| 亚洲一级淫片| 日本中文字幕精品| 亚洲一级二级在线| 日本精品999| 欧美亚洲日本网站| 日韩欧美在线精品| 国产高清精品在线观看| 久久精品人人做人人综合 | 天天色天天综合| 欧美一区二区视频在线观看| xvideos国产在线视频| 99se婷婷在线视频观看| 日韩五码在线| 欧美特级黄色录像| 欧美日本韩国一区| 国产在线69| 国产一区在线观| 爽爽淫人综合网网站| 黑人と日本人の交わりビデオ| 欧美日韩一区不卡| 99福利在线| 精品一区二区日本| 日韩国产精品久久| 国产高潮流白浆| 亚洲国产精品久久精品怡红院 | 色伊人久久综合中文字幕| 91网页在线观看| 97久久天天综合色天天综合色hd | 国产aⅴ精品一区二区三区久久| 久久婷婷综合色| 亚洲精品第一国产综合野| 天堂91在线| 亚洲va国产va天堂va久久| 一本综合精品| 成人午夜免费影院| 精品国产凹凸成av人导航| 经典三级一区二区| 成人毛片100部免费看| 91美女视频网站| 97人妻精品一区二区三区视频| 久久久人成影片一区二区三区| 国产欧美久久一区二区三区| 精品国产午夜福利在线观看| 一本色道久久综合亚洲aⅴ蜜桃| 麻豆视频在线观看免费网站| 久久99精品国产99久久| 国产乱子伦视频一区二区三区| 亚洲欧美一区二区三区在线观看| 久久福利网址导航| 国产区精品区| 久久免费精品国产|