久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Android Native Crash 收集

瀏覽:35日期:2022-09-05 13:15:22

本篇核心講解了自己實現一個 Android Native Crash 收集的方案步驟,重點問題解決辦法。

對本文有任何問題,可加我的個人微信:kymjs123

在 Android 平臺上,Native Crash 一直是比較麻煩的問題,因為捕獲麻煩,獲取到了內容又不全,內容全了信息又不對,信息對了又不好處理。比 Java Crash 不知道麻煩多少倍。

今天跟大家講一下,我最近掉了幾百根頭發寫出來的一個 Native Crash 收集的功能(脫發已經越來越嚴重了)。

一個 Native Crash 的 log 信息如下圖:

Android Native Crash 收集

這張圖是我在網上找的(由于沒有寫 demo,項目中的截圖不方便直接拿出來,就偷了個懶)。

在上圖里,堆棧信息中 pc 后面跟的內存地址,就是當前函數的棧地址,我們可以通過命令行 arm-linux-androideabi-addr2line -e 內存地址 得出出錯的代碼行數了。

要實現 Native Crash 的收集,主要有四個重點:知道 Crash 的發生;捕獲到 Crash 的位置;獲取 Crash 發生位置的函數調用棧;數據能回傳到服務器。

知道 Crash 的發生

與 Java 平臺不同,C/C++ 沒有一個通用的異常處理接口,在 C 層,CPU 通過異常中斷的方式,觸發異常處理流程。不同的處理器,有不同的異常中斷類型和中斷處理方式,linux 把這些中斷處理,統一為信號量,每一種異常都有一個對應的信號,可以注冊回調函數進行處理需要關注的信號量。

所有的信號量都定義在<signal.h>文件中,這里我將幾乎全部的信號量以及所代表的含義都標注出來了:

#define SIGHUP 1 // 終端連接結束時發出(不管正常或非正常)#define SIGINT 2 // 程序終止(例如Ctrl-C)#define SIGQUIT 3 // 程序退出(Ctrl-)#define SIGILL 4 // 執行了非法指令,或者試圖執行數據段,堆棧溢出#define SIGTRAP 5 // 斷點時產生,由debugger使用#define SIGABRT 6 // 調用abort函數生成的信號,表示程序異常#define SIGIOT 6 // 同上,更全,IO異常也會發出#define SIGBUS 7 // 非法地址,包括內存地址對齊出錯,比如訪問一個4字節的整數, 但其地址不是4的倍數#define SIGFPE 8 // 計算錯誤,比如除0、溢出#define SIGKILL 9 // 強制結束程序,具有最高優先級,本信號不能被阻塞、處理和忽略#define SIGUSR1 10 // 未使用,保留#define SIGSEGV 11 // 非法內存操作,與SIGBUS不同,他是對合法地址的非法訪問,比如訪問沒有讀權限的內存,向沒有寫權限的地址寫數據#define SIGUSR2 12 // 未使用,保留#define SIGPIPE 13 // 管道破裂,通常在進程間通信產生#define SIGALRM 14 // 定時信號,#define SIGTERM 15 // 結束程序,類似溫和的SIGKILL,可被阻塞和處理。通常程序如果終止不了,才會嘗試SIGKILL#define SIGSTKFLT 16 // 協處理器堆棧錯誤#define SIGCHLD 17 // 子進程結束時, 父進程會收到這個信號。#define SIGCONT 18 // 讓一個停止的進程繼續執行#define SIGSTOP 19 // 停止進程,本信號不能被阻塞,處理或忽略#define SIGTSTP 20 // 停止進程,但該信號可以被處理和忽略#define SIGTTIN 21 // 當后臺作業要從用戶終端讀數據時, 該作業中的所有進程會收到SIGTTIN信號#define SIGTTOU 22 // 類似于SIGTTIN, 但在寫終端時收到#define SIGURG 23 // 有緊急數據或out-of-band數據到達socket時產生#define SIGXCPU 24 // 超過CPU時間資源限制時發出#define SIGXFSZ 25 // 當進程企圖擴大文件以至于超過文件大小資源限制#define SIGVTALRM 26 // 虛擬時鐘信號. 類似于SIGALRM, 但是計算的是該進程占用的CPU時間.#define SIGPROF 27 // 類似于SIGALRM/SIGVTALRM, 但包括該進程用的CPU時間以及系統調用的時間#define SIGWINCH 28 // 窗口大小改變時發出#define SIGIO 29 // 文件描述符準備就緒, 可以開始進行輸入/輸出操作#define SIGPOLL SIGIO // 同上,別稱#define SIGPWR 30 // 電源異常#define SIGSYS 31 // 非法的系統調用

通常我們在做 crash 收集的時候,主要關注這幾個信號量:

const int signal_array[] = {SIGILL, SIGABRT, SIGBUS, SIGFPE, SIGSEGV, SIGSTKFLT, SIGSYS};

對應的含義可以參考上文,

extern int sigaction(int, const struct sigaction*, struct sigaction*);

第一個參數 int 類型,表示需要關注的信號量

第二個參數 sigaction 結構體指針,用于聲明當某個特定信號發生的時候,應該如何處理。

第三個參數也是 sigaction 結構體指針,他表示的是默認處理方式,當我們自定義了信號量處理的時候,用他存儲之前默認的處理方式。

這也是指針與引用的區別,指針操作操作的都是變量本身,所以給新指針賦值了以后,需要另一個指針來記錄封裝了默認處理方式的變量在內存中的位置。

所以,要訂閱異常發生的信號,最簡單的做法就是直接用一個循環遍歷所有要訂閱的信號,對每個信號調用 sigaction()

void init() { struct sigaction handler; struct sigaction old_signal_handlers[SIGNALS_LEN]; for (int i = 0; i < SIGNALS_LEN; ++i) {sigaction(signal_array[i], &handler, & old_signal_handlers[i]); }} 捕獲到 Crash 的位置

sigaction 結構體有一個 sa_sigaction 變量,他是個函數指針,原型為: void (*)(int siginfo_t *, void *) 因此,我們可以聲明一個函數,直接將函數的地址賦值給 sa_sigaction

void signal_handle(int code, siginfo_t *si, void *context) {}void init() {struct sigaction old_signal_handlers[SIGNALS_LEN];struct sigaction handler;handler.sa_sigaction = signal_handle;handler.sa_flags = SA_SIGINFO;for (int i = 0; i < SIGNALS_LEN; ++i) { sigaction(signal_array[i], &handler, & old_signal_handlers[i]);}}

這樣當發生 Crash 的時候就會回調我們傳入的 signal_handle() 函數了。在 signal_handle() 函數中,我們得要想辦法拿到當前執行的代碼信息。

設置緊急棧空間

如果當前函數發生了無限遞歸造成堆棧溢出,在統計的時候需要考慮到這種情況而新開堆棧否則本來就滿了的堆棧又在當前堆棧處理溢出信號,處理肯定是會失敗的。所以我們需要設置一個用于緊急處理的新棧,可以使用 sigaltstack() 在任意線程注冊一個可選的棧,保留一下在緊急情況下使用的空間。(系統會在危險情況下把棧指針指向這個地方,使得可以在一個新的棧上運行信號處理函數)

void signal_handle(int sig) { write(2, 'stack overflown', 15); _exit(1);}unsigned infinite_recursion(unsigned x) { return infinite_recursion(x)+1;}int main() { static char stack[SIGSTKSZ]; stack_t ss = {.ss_size = SIGSTKSZ,.ss_sp = stack, }; struct sigaction sa = {.sa_handler = signal_handle,.sa_flags = SA_ONSTACK }; sigaltstack(&ss, 0); sigfillset(&sa.sa_mask); sigaction(SIGSEGV, &sa, 0); infinite_recursion(0);}

捕獲出問題的代碼

signal_handle() 函數中的第三個參數 context 是 uc_mcontext 的結構體指針,它封裝了 cpu 相關的上下文,包括當前線程的寄存器信息和奔潰時的 pc 值,能夠知道崩潰時的pc,就能知道崩潰時執行的是那條指令,同樣的,在本文頂部的那張圖中寄存器快照就可以用如下代碼獲得。

char *head_cpu = nullptr;asprintf(&head_cpu, 'r0 %08lx r1 %08lx r2 %08lx r3 %08lxn' 'r4 %08lx r5 %08lx r6 %08lx r7 %08lxn' 'r8 %08lx r9 %08lx sl %08lx fp %08lxn' 'ip %08lx sp %08lx lr %08lx pc %08lx cpsr %08lxn', t->uc_mcontext.arm_r0, t->uc_mcontext.arm_r1, t->uc_mcontext.arm_r2, t->uc_mcontext.arm_r3, t->uc_mcontext.arm_r4, t->uc_mcontext.arm_r5, t->uc_mcontext.arm_r6, t->uc_mcontext.arm_r7, t->uc_mcontext.arm_r8, t->uc_mcontext.arm_r9, t->uc_mcontext.arm_r10, t->uc_mcontext.arm_fp, t->uc_mcontext.arm_ip, t->uc_mcontext.arm_sp, t->uc_mcontext.arm_lr, t->uc_mcontext.arm_pc, t->uc_mcontext.arm_cpsr);

不過 uc_mcontext 結構體的定義是平臺相關的,比如我們熟知的 arm 、 x86 這種都不是同一個結構體定義,上面的代碼只列出了 arm 架構的寄存器信息,要兼容其他架構的 cpu 在處理的時候,就得要寄出宏編譯大法,不同的架構使用不同的定義。

uintptr_t pc_from_ucontext(const ucontext_t *uc) {#if (defined(__arm__)) return uc->uc_mcontext.arm_pc;#elif defined(__aarch64__) return uc->uc_mcontext.pc;#elif (defined(__x86_64__)) return uc->uc_mcontext.gregs[REG_RIP];#elif (defined(__i386)) return uc->uc_mcontext.gregs[REG_EIP];#elif (defined (__ppc__)) || (defined (__powerpc__)) return uc->uc_mcontext.regs->nip;#elif (defined(__hppa__)) return uc->uc_mcontext.sc_iaoq[0] & ~0x3UL;#elif (defined(__sparc__) && defined (__arch64__)) return uc->uc_mcontext.mc_gregs[MC_PC];#elif (defined(__sparc__) && !defined (__arch64__)) return uc->uc_mcontext.gregs[REG_PC];#else#error 'Architecture is unknown, please report me!'#endif}

pc值轉內存地址

pc值是程序加載到內存中的絕對地址,絕對地址不能直接使用,因為每次程序運行創建的內存肯定都不是固定區域的內存,所以絕對地址肯定每次運行都不一致。我們需要拿到崩潰代碼相對于當前庫的相對偏移地址,這樣才能使用 addr2line 分析出是哪一行代碼。通過 dladdr() 可以獲得共享庫加載到內存的起始地址,和 pc 值相減就可以獲得相對偏移地址,并且可以獲得共享庫的名字。

Dl_info info; if (dladdr(addr, &info) && info.dli_fname) { void * const nearest = info.dli_saddr; uintptr_t addr_relative = addr - info.dli_fbase; } 獲取 Crash 發生時的函數調用棧

獲取函數調用棧是最麻煩的,至今沒有一個好用的,全都要做一些大改動。常見的做法有四種:

第一種:直接使用系統的 <unwind.h> 庫,可以獲取到出錯文件與函數名。只不過需要自己解析函數符號,同時經常會捕獲到系統錯誤,需要手動過濾。 第二種:在 4.1.1 以上, 5.0 以下,使用系統自帶的 libcorkscrew.so ,5.0開始,系統中沒有了 libcorkscrew.so ,可以自己編譯系統源碼中的 libunwind 。 libunwind 是一個開源庫,事實上高版本的安卓源碼中就使用了他的優化版替換 libcorkscrew 。 第三種:使用開源庫 coffeecatch ,但是這種方案也不能百分之百兼容所有機型。 第四種:使用 Google 的 breakpad ,這是所有 C/C++堆棧獲取的權威方案,基本上業界都是基于這個庫來做的。只不過這個庫是全平臺的 android、iOS、Windows、Linux、MacOS 全都有,所以非常大,在使用的時候得把無關的平臺剝離掉減小體積。

下面以第一種為例講一下實現:

核心方法是使用 <unwind.h> 庫提供的一個方法 _Unwind_Backtrace() 這個函數可以傳入一個函數指針作為回調,指針指向的函數有一個重要的參數是 _Unwind_Context 類型的結構體指針。

可以使用 _Unwind_GetIP() 函數將當前函數調用棧中每個函數的絕對內存地址(也就是上文中提到的 pc 值),寫入到 _Unwind_Context 結構體中,最終返回的是當前調用棧的全部函數地址了, _Unwind_Word 實際上就是一個 unsigned int 。

而 capture_backtrace() 返回的就是當前我們獲取到調用棧中內容的數量。

/** * callback used when using <unwind.h> to get the trace for the current context */_Unwind_Reason_Code unwind_callback(struct _Unwind_Context *context, void *arg) { backtrace_state_t *state = (backtrace_state_t *) arg; _Unwind_Word pc = _Unwind_GetIP(context); if (pc) {if (state->current == state->end) { return _URC_END_OF_STACK;} else { *state->current++ = (void *) pc;} } return _URC_NO_REASON;}/** * uses built in <unwind.h> to get the trace for the current context */size_t capture_backtrace(void **buffer, size_t max) { backtrace_state_t state = {buffer, buffer + max}; _Unwind_Backtrace(unwind_callback, &state); return state.current - buffer;}

當所有的函數的絕對內存地址(pc 值)都獲取到了,就可以用上文講的辦法將 pc 值轉換為相對偏移量,獲取到真正的函數信息和相對內存地址了。

void *buffer[max_line];int frames_size = capture_backtrace(buffer, max_line);for (int i = 0; i < frames_size; i++) {Dl_info info; const void *addr = buffer[i];if (dladdr(addr, &info) && info.dli_fname) { void * const nearest = info.dli_saddr; uintptr_t addr_relative = addr - info.dli_fbase; }

Dl_info 是一個結構體,內部封裝了函數所在文件、函數名、當前庫的基地址等信息

typedef struct { const char *dli_fname; /* Pathname of shared object that contains address */ void *dli_fbase; /* Address at which shared object is loaded */ const char *dli_sname; /* Name of nearest symbol with address lower than addr */ void *dli_saddr; /* Exact address of symbol named in dli_sname */} Dl_info;

有了這個對象,我們就能獲取到全部想要的信息了。雖然獲取到全部想要的信息,但 <unwind.h> 有個麻煩的就是不想要的信息也給你了,所以需要手動過濾掉各種系統錯誤,最終得到的數據,就可以上報到自己的服務器了。

數據回傳到服務器

數據回傳有兩種方式,一種是直接將信息寫入文件,下次啟動的時候直接由 Java 上報;另一種就是回調 Java 代碼,讓 Java 去處理。用 Java 處理的好處是 Java 層可以繼續在當前上下文上加上 Java 層的各種狀態信息,寫入到同一個文件中,使得開發在解決 bug 的時候能更方便。

這里就簡單將數據寫入文件了。

void save(const char *name, char *content) { FILE *file = fopen(name, 'w+'); fputs(content, file); fflush(file); fclose(file); //可以在寫入文件以后,再通知 Java 層,直接將文件名傳給 Java 層更簡單。 report();}

如果你按照本文講的,應該是可以創建一個可以工作的 Native Crash 收集庫了,但是還有很多細節上的問題,比如數據的丟失問題,寫文件的時候使用 w+ 可能造成上次存儲的文件丟失;如果當前函數發生了無限遞歸造成堆棧溢出,在統計的時候需要考慮到這種情況而新開堆棧否則本來就滿了的堆棧又在當前堆棧處理溢出信號,處理肯定是會失敗的;再比方說多進程多線程在 C 上的各種問題,真的是很復雜。

來自:https://www.kymjs.com/code/2018/08/22/01/

標簽: Android
相關文章:
主站蜘蛛池模板: 色婷婷综合久久久中文字幕 | 国产精品视频一二三区 | 国产91在线观看 | 日韩精品久久 | 亚洲激情在线 | 一级在线播放 | 日日操av | 久久99国产精品 | 久草视频在线资源站 | 日韩特级| 黄色毛片在线看 | 国产精品美女久久久久久免费 | 久久精品国产一区二区三区不卡 | 国产午夜手机精彩视频 | 午夜视频网站 | 欧洲尺码日本国产精品 | 国产精品a久久 | 精品在线播放 | 久久综合久久久 | 色婷婷久久久久swag精品 | 在线视频中文字幕 | 日韩一级免费在线观看 | 精产国产伦理一二三区 | 日韩av电影观看 | 一级一级一级一级毛片 | 欧美一区二区在线观看 | 美女黄视频网站 | 精品日韩欧美一区二区三区在线播放 | 69av.com | 久久国产精品99久久久久久牛牛 | 亚洲欧美国产毛片在线 | av福利在线观看 | 狠狠爱综合| m豆传媒在线链接观看 | 亚洲一区二区三区高清 | 中文字幕在线视频第一页 | 在线看一区| 97国产在线 | 99久久久国产精品美女 | 国产精品美女在线观看 | 精品日韩av | 成人久久精品 | 香蕉av777xxx色综合一区 | 色综合天天综合网国产成人网 | 男人的天堂一级片 | 欧美人牲 | 成人亚洲视频 | www中文字幕在线观看 | 日韩精品一区在线 | 97精品超碰一区二区三区 | 久久蜜桃精品一区二区三区综合网 | 国产伦精品一区二区三区在线 | 欧美一级艳片视频免费观看 | 图片区 国产 欧美 另类 在线 | 在线免费国产视频 | 国产一区999 | 国产在线视频一区 | 夜夜骚 | 亚洲精品乱码久久久久久蜜桃不卡 | 日韩福利 | 一区二区三区日韩在线 | 亚洲精品美女在线观看 | av成人在线观看 | 色综合色综合网色综合 | 日韩一区二区三区精品 | 中文字幕在线视频免费播放 | 青草视频网站 | 五月激情综合网 | 久久精品六 | 日韩在线不卡 | 亚洲毛片网站 | 在线看片网站 | 国产在线中文字幕 | 色橹橹欧美在线观看视频高清 | 一区二区三区影院 | 午夜亚洲福利 | 日本三级一区二区 | 日本免费在线视频 | 国产精品久久久麻豆 | 日韩欧美一二三区 | 在线你懂得 | 午夜免费视频网站 | 色婷婷国产精品免费网站 | 成人在线一区二区三区 | 国产羞羞视频 | 一本久久a久久精品亚洲 | 99热播在线 | 日韩国产中文字幕 | 久久久久国产一区二区三区四区 | 91久久 | 97久久久| 久草青青 | 欧美日韩在线一区 | 欧美一区二区三区国产精品 | 日本激情视频在线播放 | 欧美精品一区在线观看 | www.一区 | 国产精品视频免费观看 | 欧美日韩免费看 | 亚洲视频中文字幕 | 亚洲瑟瑟 | 精品一区国产 | 人操人人人 | 午夜视频在线观看网址 | 91.com在线| 欧美天堂 | 日韩精品一区二区三区中文在线 | 国产高清免费视频 | 成年人黄色免费视频 | 7799精品视频天天看 | 懂色av一区二区三区在线播放 | 国产高清中文字幕 | 一区二区亚洲 | 81精品国产乱码久久久久久 | 91精品一区二区 | 欧美9999 | 久操成人| 欧美激情在线观看 | 九九在线精品 | 中国大陆高清aⅴ毛片 | 欧美精品久久久久久久久久丰满 | av网站免费观看 | aⅴ色国产 欧美 | 色综合一区 | 99re视频 | 天天干天天爱天天 | 日韩精品在线网站 | 久色视频在线观看 | 在线欧美日韩 | 国内自拍视频在线观看 | 久久久麻豆 | 91日日 | 亚洲欧美日韩另类精品一区二区三区 | 国产精品一区二区久久久久 | 97碰碰碰 | 国产精品欧美久久久久一区二区 | 久色 | 国产精品免费一区 | 97国产一区二区精品久久呦 | 国产精品毛片在线 | ww8888免费视频 | 午夜精品一区二区三区在线播放 | 粉嫩高清一区二区三区精品视频 | 99在线视频精品 | 欧美精品国产精品 | 天天色av | 99久热精品| 情侣av| 日本在线视频观看 | 日韩国产一区二区三区 | 青青草免费在线 | 国产一区a | 国产xvideos免费视频播放 | 精品视频一区二区三区在线观看 | 日日摸夜夜添夜夜添高潮视频 | 中文字幕高清一区 | 亚洲 成人 av | 亚洲一区二区三区免费视频 | 天堂一区 | 欧美日韩综合视频 | 亚洲免费在线视频 | 日韩精品一区二 | 亚洲人视频 | 亚洲精品国产片 | av网址在线播放 | 欧美一级一 | 在线碰| 韩日精品 | 亚洲视频精品一区 | 6080亚洲精品一区二区 | 一级大片一级一大片 | 欧美黑人巨大xxx极品 | 啊v在线| 久久久一区二区三区 | 欧美日韩一区二区在线 | 久久69精品久久久久久久电影好 | 久久久久久久久一区 | 国产精品久久久久久久竹霞 | 狠狠干欧美 | 欧美一级免费观看 | 成人免费在线电影 | 亚洲一区视频在线 | 天天插天天操天天干 | 91视频一区二区三区 | 国产精品网址 | 成人免费视频网 | 成人亚洲精品久久久久 | 日韩手机电影 | 亚洲av毛片一级二级在线 | 日韩成人短视频 | 色婷婷一区二区三区 | 亚洲视频在线看 | 一区二区日韩精品 | 欧美日韩成人免费 | 午夜私人视频 | 久久99国产精品久久99果冻传媒 | 欧美亚洲视频 | 色综合久久天天综合网 | 国产午夜精品一区二区三区视频 | 综合网视频 | 波多野结衣先锋影音 | 精品视频一区二区 | 精品亚洲永久免费精品 | 亚洲一区视频 | 91电影在线 | 日韩一区二区三区在线观看 | 久久久成人精品 | 国产精品美女久久久久久久久久久 | 欧美日韩国产不卡 | 国内自拍视频在线观看 | 综合精品 | 99久久婷婷国产综合精品电影 | 久久久精品综合 | 久久一| 伊人网址 | 6080亚洲精品一区二区 | 欧美不卡视频一区发布 | 色约约精品免费看视频 | 中文字幕在线免费 | 天天操天天插 | 精品国产一区二区三区久久影院 | 搜索黄色毛片 | 日本在线不卡视频 | 国产欧美精品一区二区色综合 | 久久综合一区二区三区 | 91在线中文字幕 | 亚洲午夜一区 | 91麻豆精品国产91久久久资源速度 | 欧美日韩国产精品一区二区亚洲 | 手机在线观看av | 播放一级黄色片 | 欧美一区二区三区爽大粗免费 | 天天摸夜夜摸爽爽狠狠婷婷97 | 国产精品久久久久久福利一牛影视 | 99动漫 | 亚洲一二三区在线观看 | 亚洲电影一区二区 | 国产精品第一区 | 久久久久久亚洲 | 手机看片在线 | 视频一区二区三区在线播放 | 国产高清自拍 | 亚洲三级免费观看 | 欧美精品片 | 黄色成人在线 | 午夜av毛片 | 91激情视频 | 欧美精品久久久 | 国产欧美精品 | 久久久久久久久久久久久久久久久久久 | 欧美成人精品在线观看 | 久久男人天堂 | 一道本一二三区 | 日本久久精品电影 | 亚洲精品一 | 欧美日韩在线一区二区 | 成人在线免费 | 国产麻豆乱码精品一区二区三区 | 国产图区 | 久久久久久久久国产成人免费 | av在线精品| 一区二区三区 在线 | 国产高清一二三区 | 日韩欧美综合 | 日本不卡免费新一二三区 | 亚洲xx视频 | 极品毛片| 日本在线播放 | 国产精品国产精品国产专区不片 | 国产精品视频网 | 操久在线 | 天天干天天去 | 四色永久| 成人中文字幕在线 | 亚洲视频在线观看 | 色婷婷av久久久久久久 | 欧美日韩一区二区在线 | 性色av一二三杏吧传媒 | 在线观看免费毛片视频 | 欧美日韩国产一区二区三区 | 成人中文网 | 在线免费观看毛片 | 国产69精品99久久久久久宅男 | 秋霞av电影 | 午夜在线影院 | 国产一区二区三区在线看 | www.久久久 | 欧美午夜一区二区三区免费大片 | 中文字幕一区在线观看视频 | 久色视频在线观看 | 午夜影院在线免费观看 | 亚洲91| av天天干| 天天色影视综合 | 国产一区二区av在线 | 色综合天天综合网国产成人网 | 二区在线观看 | 亚洲精品国产乱码在线看蜜月 | 久久艹久久 | 一级毛片网| 91九色视频| av手机在线播放 | 婷婷五月色综合香五月 | av资源中文在线 | 成人高清视频在线观看 | 神马久久久久久久 | 色综合一区二区三区 | 亚洲综合区 | 日本电影www | 国产免费一区二区三区 | 青青草一区二区三区 | 国产有码| 久久成人国产精品 | 黄色天堂在线观看 | 久色视频在线 | 中文字幕在线视频一区 | 国产亚洲一区二区三区在线 | 久久久久久久国产 | 国产精品s色 | 麻豆成人在线 | 黄色网在线 | 久色成人 | 国产精品天天干 | www.黄色片视频 | 成人在线免费视频 | 日韩第一区 | 欧美成人一区二区 | www狠狠操 | 国产中文字幕一区 | 久久久夜 | 日韩一区在线播放 | 国产不卡一区 | 女人夜夜春高潮爽a∨片传媒 | 91av国产视频| 亚洲欧洲一区二区 | 一级a性色生活片毛片 | 丁香五月亚洲综合在线 | 伊人久色| 久久婷婷麻豆国产91天堂 | 久久综合社区 | 91男女视频| 亚洲精品一区在线观看 | 国产精品久久久久免费a∨ 欧洲精品一区 | 亚洲激情视频 | 欧美亚洲一区 | 久久国产精品一区 | 黄色片视频免费 | 美女一级a毛片免费观看97 | 97精品久久 | 一区二区亚洲 | 在线观看成人小视频 | 久久久久久久一区二区三区 | 日韩av不卡在线 | 久久国内 | 欧美一区二区三区爽大粗免费 | 国产精品久久久久久久久久久久 | 一色视频 | 狠狠天天 | 综合色久 | 欧美日韩国产一区二区三区 | 中文字幕乱码一区二区三区 | 国产精品毛片久久久久久 | 欧美在线观看网站 | av网站免费观看 | 欧美国产精品一区 | 久久综合电影 | 在线精品国产 | 精品国产乱码久久久久久久软件 | 日韩在线一区二区 | 99热在线精品播放 | 麻豆久久久久久 | 黄色一级毛片 | 91色在线观看 | 久久久成人精品 | 日韩视频一区二区三区 | 国产美女www爽爽爽免费视频 | 97高清国语自产拍 | 国产在线拍揄自揄拍视频 | 97av在线 | 中文字幕国产视频 | 色接久久| 国产区视频在线观看 | 亚洲福利国产 | 亚洲www啪成人一区二区 | 嫩草精品 | 成人在线小视频 | 久久国产精品无码网站 | 极品久久 | 亚洲精选免费视频 | 97久久精品人人做人人爽50路 | 久久99精品视频 | 国产 高清 在线 | 国产欧美在线视频 | 亚洲精品www久久久久久广东 | 97久久精品午夜一区二区 | 欧美精品一区二区三区手机在线 | 91综合视频在线观看 | 999久久久国产999久久久 | 久久久国产精品视频 | 日韩中文字幕在线播放 | 欧美精品 在线观看 | 中文字幕在线资源 | 国产精品久久久久永久免费观看 | 亚洲一区二区三区中文字幕 | 在线日本中文字幕 | 欧美一级一区 | 国产精品久久久久久久久费观看 | 欧美激情精品久久久久 | 涩涩视频在线免费看 | 日本视频免费高清一本18 | 中文字幕在线观看一区二区三区 | 一级免费黄色免费片 | 久久精品综合 | 亚洲欧美在线观看 | 亚洲欧美中文日韩在线v日本 | 亚洲精品视频在线 | 亚洲精品视频免费 | 巨大黑人极品videos精品 | 羞羞视频在线播放 | 亚洲一区久久 | 精品一区二区在线观看 | 在线视频一二区 | 日本在线观看一区 | 日韩国产精品一区二区 | 成人精品一区二区三区 | 成人在线视频网站 | 日本在线一区二区 | 一区日韩 | 天天操,夜夜操 | 国产视频久久久久久 | 亚洲深深色噜噜狠狠网站 | 特a级片| 伊人网站 | 国产精品午夜在线观看 | 国产高清一区 | 国产91在线播放精品 | 一本大道综合伊人精品热热 | 日韩国产一区二区 | 国产日产欧美a级毛片 | a在线免费观看 | 亚洲理论电影在线观看 | 欧美激情精品久久久久久变态 | 91影库 | 成人一级片在线观看 | 国产精品一任线免费观看 | 国产精品久久久久久二区 | 亚洲一区精品视频 | 亚洲综合在线视频 | 国产欧美日韩成人 | 青娱乐av | 国产一二三区在线观看 | 久久久毛片 | 日韩精品中文字幕一区二区三区 | 色综合免费 | 福利片在线观看 | 成人欧美一区二区三区色青冈 | 精品亚洲视频在线观看 | 国产精品乱码人人做人人爱 | 亚洲精品一区二区在线观看 | aaaaaaa片毛片免费观看 | 91电影院 | 国产精品成人网 | 在线中文字幕日韩 | 国产极品视频在线观看 | 精品国产一区二区三区久久久蜜臀 | 精品在线一区 | h片在线 | 男女小网站| 亚洲成人精品在线观看 | 欧美日韩国产精品 | 午夜视频 | 欧美一级视频在线观看 | 欧美激情 在线 | 国产艳妇av视国产精选av一区 | 中国毛片基地 | 亚洲免费视频网 | 久久精品一 | 久久精品成人一区二区三区蜜臀 | 久久最新 | 2020天天操 | 99视频在线看 | 欧美激情网址 | 欧美日韩国产高清视频 | 日本一级中文字幕久久久久久 | 日韩精品专区 | 日韩精品在线免费观看 | a久久 | 成人精品一区二区 | 嫩草研究院在线观看入口 | av片免费看 | 国产成人91 | 国产成人免费视频网站高清观看视频 | 日韩欧美综合在线 | 日韩免费高清视频 | 日韩国产欧美视频 | 欧美二三区 | 日韩欧美在线视频 | 精久视频 | 日韩欧美一区二区三区视频 | 91精品久久 | 欧美精品一区三区 | 免费精品 | 欧美自拍网 | 亚洲视频在线观看 | 久久这里只有精品首页 | 国产一区二区三区视频 | www国产成人免费观看视频,深夜成人网 | 亚洲激情久久 | 亚洲不卡网站 | 欧美.com | 国产网站视频 | 99re视频精品 | 亚洲国产精品t66y | 亚洲一级在线观看 | 欧美视频精品 | 中文字幕高清av | 欧美二区三区视频 | 四虎最新网站 | 成人在线视频免费观看 | 久久久久久久影院 | 国产三级在线观看 | 国产日产精品一区二区三区四区 | 91精品国产综合久久久久久丝袜 | 国产精品色婷婷久久58 | 亚洲欧美日韩国产综合 | 中文字幕av一区 | 欧美日韩干 | 久久高清 | 中文字幕亚洲一区二区三区 | 91久久在线| 国产在线一区不卡 | 免费一区二区 | 午夜国产羞羞视频免费网站 | 日本在线观看一区二区 | 国产美女高潮 | 亚洲黄色在线视频 | 黄色毛片在线看 | 羞羞视频在线播放 | 激情视频在线观看免费 | 国产日韩视频 | 91欧美在线 | 日韩在线一区二区三区 | 亚洲一区二区视频在线播放 | 久久一| 亚洲欧美视频一区 | 国产精品成人网 | 四虎影院网站 | 黄色一级片免费播放 | 午夜精品久久久久久99热软件 | 视频一区在线观看 | 日韩av入口| 毛片网| 亚洲日韩中文字幕 | 免费av一区二区三区 | 国产精品久久国产精品 | 一区二区三区国产好 | 久久久久久久av | 午夜视频在线观看网站 | 中文字幕一区二区三区日韩精品 | 国产单男 | 日韩婷婷 | 全毛片 | 日本不卡免费新一二三区 | 亚洲福利片 | av在线播放网站 | 久久久婷 | 亚洲欧洲精品在线 | 久久久国产精品免费 | 国产精品一区二区三区av | 国产二区三区 | 精品国产乱码久久久久久久软件 | 欧美性猛交一区二区三区精品 | 手机看片国产精品 | 天天爽夜夜爽夜夜爽精品视频 | 欧美三级免费观看 | 亚洲精品一区久久久久久 | 久久伊| 精品欧美一区二区在线观看视频 | 亚洲欧洲一区二区 | 亚洲视频一区二区三区 | 欧美日韩免费一区二区三区 | 久草免费在线 | 欧美日韩国产在线观看 | 日韩一级在线免费观看 | 中文字幕日韩欧美一区二区三区 | 欧美日韩中文 | 一级黄色片子看看 | 欧美一区二区三区电影 | 国产精品视频一区二区三区不卡 | 波多野结衣先锋影音 | 国产精品成人国产乱一区 | 91精品国产色综合久久 | 欧美电影一区 | 91视频国产网站 | 欧美日韩国产免费一区二区三区 | 日韩视频免费在线 | www.99re| 国产精品网站在线观看 | 日本中文字幕一区二区 | 国产免费av网站 | 久久久久中文字幕 | 国产精品欧美一区二区三区 | 国产乱码精品一区二区三区五月婷 | 久久99这里只有精品 | 免费一区二区 | av中文在线| 99免费视频 | 午夜免费福利影院 | 91亚洲国产成人久久精品网站 | 国产中文视频 | 亚州av在线| 久久久久久久久免费视频 | 中文字幕乱码亚洲精品一区 | 久久久久久久久99精品 | 久久久在线视频 |