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

開發一個Linux調試器(九):處理變量

系統 Linux
變量是偷偷摸摸的。有時,它們會很高興地呆在寄存器中,但是一轉頭就會跑到堆棧中。為了優化,編譯器可能會完全將它們從窗口中拋出。無論變量在內存中的如何移動,我們都需要一些方法在調試器中跟蹤和操作它們。這篇文章將會教你如何處理調試器中的變量,并使用 libelfin 演示一個簡單的實現。

[[205557]]

變量是偷偷摸摸的。有時,它們會很高興地呆在寄存器中,但是一轉頭就會跑到堆棧中。為了優化,編譯器可能會完全將它們從窗口中拋出。無論變量在內存中的如何移動,我們都需要一些方法在調試器中跟蹤和操作它們。這篇文章將會教你如何處理調試器中的變量,并使用 libelfin 演示一個簡單的實現。

系列文章索引

  1. 準備環境
  2. 斷點
  3. 寄存器和內存
  4. ELF 和 DWARF
  5. 源碼和信號
  6. 源碼級逐步執行
  7. 源碼級斷點
  8. 堆棧展開
  9. 處理變量
  10. 高級話題

在開始之前,請確保你使用的 libelfin 版本是我分支上的 fbreg。這包含了一些 hack 來支持獲取當前堆棧幀的基址并評估位置列表,這些都不是由原生的 libelfin 提供的。你可能需要給 GCC 傳遞 -gdwarf-2 參數使其生成兼容的 DWARF 信息。但是在實現之前,我將詳細說明 DWARF 5 ***規范中的位置編碼方式。如果你想要了解更多信息,那么你可以從這里獲取該標準。

DWARF 位置

某一給定時刻的內存中變量的位置使用 DW_AT_location 屬性編碼在 DWARF 信息中。位置描述可以是單個位置描述、復合位置描述或位置列表。

  • 簡單位置描述:描述了對象的一個連續的部分(通常是所有部分)的位置。簡單位置描述可以描述可尋址存儲器或寄存器中的位置,或缺少位置(具有或不具有已知值)。比如,DW_OP_fbreg -32: 一個整個存儲的變量 - 從堆棧幀基址開始的32個字節。
  • 復合位置描述:根據片段描述對象,每個對象可以包含在寄存器的一部分中或存儲在與其他片段無關的存儲器位置中。比如, DW_OP_reg3 DW_OP_piece 4 DW_OP_reg10 DW_OP_piece 2:前四個字節位于寄存器 3 中,后兩個字節位于寄存器 10 中的一個變量。
  • 位置列表:描述了具有有限生存期或在生存期內更改位置的對象。比如:
    • <loclist with 3 entries follows>
      • [ 0]<lowpc=0x2e00><highpc=0x2e19>DW_OP_reg0
      • [ 1]<lowpc=0x2e19><highpc=0x2e3f>DW_OP_reg3
      • [ 2]<lowpc=0x2ec4><highpc=0x2ec7>DW_OP_reg2
    • 根據程序計數器的當前值,位置在寄存器之間移動的變量。

根據位置描述的種類,DW_AT_location 以三種不同的方式進行編碼。exprloc 編碼簡單和復合的位置描述。它們由一個字節長度組成,后跟一個 DWARF 表達式或位置描述。loclist 和 loclistptr 的編碼位置列表,它們在 .debug_loclists 部分中提供索引或偏移量,該部分描述了實際的位置列表。

DWARF 表達式

使用 DWARF 表達式計算變量的實際位置。這包括操作堆棧值的一系列操作。有很多 DWARF 操作可用,所以我不會詳細解釋它們。相反,我會從每一個表達式中給出一些例子,給你一個可用的東西。另外,不要害怕這些;libelfin 將為我們處理所有這些復雜性。

  • 字面編碼
    • DW_OP_lit0、DW_OP_lit1……DW_OP_lit31
      • 將字面量壓入堆棧
    • DW_OP_addr <addr>
      • 將地址操作數壓入堆棧
    • DW_OP_constu <unsigned>
      • 將無符號值壓入堆棧
  • 寄存器值
    • DW_OP_fbreg <offset>
      • 壓入在堆棧幀基址找到的值,偏移給定值
    • DW_OP_breg0、DW_OP_breg1…… DW_OP_breg31 <offset>
      • 將給定寄存器的內容加上給定的偏移量壓入堆棧
  • 堆棧操作
    • DW_OP_dup
      • 復制堆棧頂部的值
    • DW_OP_deref
      • 將堆棧頂部視為內存地址,并將其替換為該地址的內容
  • 算術和邏輯運算
    • DW_OP_and
      • 彈出堆棧頂部的兩個值,并壓回它們的邏輯 AND
    • DW_OP_plus
      • 與 DW_OP_and 相同,但是會添加值
  • 控制流操作
    • DW_OP_le、DW_OP_eq、DW_OP_gt 等
      • 彈出前兩個值,比較它們,并且如果條件為真,則壓入 1,否則為 0
    • DW_OP_bra <offset>
      • 條件分支:如果堆棧的頂部不是 0,則通過 offset 在表達式中向后或向后跳過
  • 輸入轉化
    • DW_OP_convert <DIE offset>
      • 將堆棧頂部的值轉換為不同的類型,它由給定偏移量的 DWARF 信息條目描述
  • 特殊操作
    • DW_OP_nop
      • 什么都不做!

DWARF 類型

DWARF 類型的表示需要足夠強大來為調試器用戶提供有用的變量表示。用戶經常希望能夠在應用程序級別進行調試,而不是在機器級別進行調試,并且他們需要了解他們的變量正在做什么。

DWARF 類型與大多數其他調試信息一起編碼在 DIE 中。它們可以具有指示其名稱、編碼、大小、字節等的屬性。無數的類型標簽可用于表示指針、數組、結構體、typedef 以及 C 或 C++ 程序中可以看到的任何其他內容。

以這個簡單的結構體為例:

  1. struct test{ 
  2.     int i; 
  3.     float j; 
  4.     int k[42]; 
  5.     test* next
  6. }; 

這個結構體的父 DIE 是這樣的:

  1. < 1><0x0000002a>    DW_TAG_structure_type 
  2.                       DW_AT_name                  "test" 
  3.                       DW_AT_byte_size             0x000000b8 
  4.                       DW_AT_decl_file             0x00000001 test.cpp 
  5.                       DW_AT_decl_line             0x00000001 

上面說的是我們有一個叫做 test 的結構體,大小為 0xb8,在 test.cpp 的第 1 行聲明。接下來有許多描述成員的子 DIE。

  1. < 2><0x00000032>      DW_TAG_member 
  2.                         DW_AT_name                  "i" 
  3.                         DW_AT_type                  <0x00000063> 
  4.                         DW_AT_decl_file             0x00000001 test.cpp 
  5.                         DW_AT_decl_line             0x00000002 
  6.                         DW_AT_data_member_location  0 
  7. < 2><0x0000003e>      DW_TAG_member 
  8.                         DW_AT_name                  "j" 
  9.                         DW_AT_type                  <0x0000006a> 
  10.                         DW_AT_decl_file             0x00000001 test.cpp 
  11.                         DW_AT_decl_line             0x00000003 
  12.                         DW_AT_data_member_location  4 
  13. < 2><0x0000004a>      DW_TAG_member 
  14.                         DW_AT_name                  "k" 
  15.                         DW_AT_type                  <0x00000071> 
  16.                         DW_AT_decl_file             0x00000001 test.cpp 
  17.                         DW_AT_decl_line             0x00000004 
  18.                         DW_AT_data_member_location  8 
  19. < 2><0x00000056>      DW_TAG_member 
  20.                         DW_AT_name                  "next" 
  21.                         DW_AT_type                  <0x00000084> 
  22.                         DW_AT_decl_file             0x00000001 test.cpp 
  23.                         DW_AT_decl_line             0x00000005 
  24.                         DW_AT_data_member_location  176(as signed = -80) 

每個成員都有一個名稱、一個類型(它是一個 DIE 偏移量)、一個聲明文件和行,以及一個指向其成員所在的結構體的字節偏移。其類型指向如下。

  1. < 1><0x00000063>    DW_TAG_base_type 
  2.                       DW_AT_name                  "int" 
  3.                       DW_AT_encoding              DW_ATE_signed 
  4.                       DW_AT_byte_size             0x00000004 
  5. < 1><0x0000006a>    DW_TAG_base_type 
  6.                       DW_AT_name                  "float" 
  7.                       DW_AT_encoding              DW_ATE_float 
  8.                       DW_AT_byte_size             0x00000004 
  9. < 1><0x00000071>    DW_TAG_array_type 
  10.                       DW_AT_type                  <0x00000063> 
  11. < 2><0x00000076>      DW_TAG_subrange_type 
  12.                         DW_AT_type                  <0x0000007d> 
  13.                         DW_AT_count                 0x0000002a 
  14. < 1><0x0000007d>    DW_TAG_base_type 
  15.                       DW_AT_name                  "sizetype" 
  16.                       DW_AT_byte_size             0x00000008 
  17.                       DW_AT_encoding              DW_ATE_unsigned 
  18. < 1><0x00000084>    DW_TAG_pointer_type 
  19.                       DW_AT_type                  <0x0000002a> 

如你所見,我筆記本電腦上的 int 是一個 4 字節的有符號整數類型,float是一個 4 字節的浮點數。整數數組類型通過指向 int 類型作為其元素類型,sizetype(可以認為是 size_t)作為索引類型,它具有 2a 個元素。 test * 類型是 DW_TAG_pointer_type,它引用 test DIE。

實現簡單的變量讀取器

如上所述,libelfin 將為我們處理大部分復雜性。但是,它并沒有實現用于表示可變位置的所有方法,并且在我們的代碼中處理這些將變得非常復雜。因此,我現在選擇只支持 exprloc。請根據需要添加對更多類型表達式的支持。如果你真的有勇氣,請提交補丁到 libelfin 中來幫助完成必要的支持!

處理變量主要是將不同部分定位在存儲器或寄存器中,讀取或寫入與之前一樣。為了簡單起見,我只會告訴你如何實現讀取。

首先我們需要告訴 libelfin 如何從我們的進程中讀取寄存器。我們創建一個繼承自 expr_context 的類并使用 ptrace 來處理所有內容:

  1. class ptrace_expr_context : public dwarf::expr_context { 
  2. public
  3.     ptrace_expr_context (pid_t pid) : m_pid{pid} {} 
  4.     dwarf::taddr reg (unsigned regnum) override { 
  5.         return get_register_value_from_dwarf_register(m_pid, regnum); 
  6.     } 
  7.     dwarf::taddr pc() override { 
  8.         struct user_regs_struct regs; 
  9.         ptrace(PTRACE_GETREGS, m_pid, nullptr, &regs); 
  10.         return regs.rip; 
  11.     } 
  12.     dwarf::taddr deref_size (dwarf::taddr address, unsigned size) override { 
  13.         //TODO take into account size 
  14.         return ptrace(PTRACE_PEEKDATA, m_pid, address, nullptr); 
  15.     } 
  16. private: 
  17.     pid_t m_pid; 
  18. }; 

讀取將由我們 debugger 類中的 read_variables 函數處理:

  1. void debugger::read_variables() { 
  2.     using namespace dwarf; 
  3.     auto func = get_function_from_pc(get_pc()); 
  4.     //... 

我們上面做的***件事是找到我們目前進入的函數,然后我們需要循環訪問該函數中的條目來尋找變量:

  1. for (const auto& die : func) { 
  2.     if (die.tag == DW_TAG::variable) { 
  3.         //... 
  4.     } 

我們通過查找 DIE 中的 DW_AT_location 條目獲取位置信息:

  1. auto loc_val = die[DW_AT::location]; 

接著我們確保它是一個 exprloc,并請求 libelfin 來評估我們的表達式:

  1. if (loc_val.get_type() == value::type::exprloc) { 
  2.     ptrace_expr_context context {m_pid}; 
  3.     auto result = loc_val.as_exprloc().evaluate(&context); 

現在我們已經評估了表達式,我們需要讀取變量的內容。它可以在內存或寄存器中,因此我們將處理這兩種情況:

  1. switch (result.location_type) { 
  2.                 case expr_result::type::address: 
  3.                 { 
  4.                     auto value = read_memory(result.value); 
  5.                     std::cout << at_name(die) << " (0x" << std::hex << result.value << ") = " 
  6.                               << value << std::endl; 
  7.                     break; 
  8.                 } 
  9.                 case expr_result::type::reg: 
  10.                 { 
  11.                     auto value = get_register_value_from_dwarf_register(m_pid, result.value); 
  12.                     std::cout << at_name(die) << " (reg " << result.value << ") = " 
  13.                               << value << std::endl; 
  14.                     break; 
  15.                 } 
  16.                 default
  17.                     throw std::runtime_error{"Unhandled variable location"}; 
  18.                 } 

你可以看到,我根據變量的類型,打印輸出了值而沒有解釋。希望通過這個代碼,你可以看到如何支持編寫變量,或者用給定的名字搜索變量。

***我們可以將它添加到我們的命令解析器中:

  1. else if(is_prefix(command, "variables")) { 
  2.     read_variables(); 

測試一下

編寫一些具有一些變量的小功能,不用優化并帶有調試信息編譯它,然后查看是否可以讀取變量的值。嘗試寫入存儲變量的內存地址,并查看程序改變的行為。

已經有九篇文章了,還剩***一篇!下一次我會討論一些你可能會感興趣的更高級的概念。現在你可以在這里找到這個帖子的代碼。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2017-06-28 14:21:22

Linux調試器斷點

2017-06-22 10:44:55

Linux調試器準備環境

2017-10-09 10:26:01

Linux調試器堆棧展開

2017-10-12 18:20:44

Linux調試器高級主題

2017-09-25 08:04:31

Linux調試器源碼級斷點

2017-08-28 14:40:57

Linux調試器源碼和信號

2017-07-25 10:30:32

Linux調試器Elves和dwarv

2017-07-05 14:37:07

Linux調試器寄存器和內存

2017-08-28 15:29:19

Linux調試器源碼級逐步執行

2017-04-19 21:35:38

Linux調試器工作原理

2011-08-25 16:34:27

Lua調試器

2010-03-01 11:06:52

Python 調試器

2020-03-16 10:05:13

EmacsGUDLinux

2009-12-14 10:57:34

Ruby調試器

2011-08-31 16:51:12

Lua調試器

2019-12-06 14:30:41

GNU調試器GDB修復代碼

2023-02-28 11:39:55

CMake腳本項目

2024-03-13 08:00:00

Linux調試器應用程序

2009-06-23 11:05:05

Mircosoft C

2011-08-31 16:47:07

Lua調試器
點贊
收藏

51CTO技術棧公眾號

久久久中文字幕| 午夜影院在线观看欧美| 国产精品一区二区久久| 永久免费看片直接| 高h调教冰块play男男双性文| 欧美精品国产一区| 亚洲精品720p| 婷婷激情四射五月天| 免费大片在线观看www| 国产精品1区2区3区| 国产一区二区三区日韩欧美| 久热精品在线观看视频| 超碰在线网站| 中文字幕av一区 二区| 成人自拍视频网站| 天天爱天天做天天爽| 久久夜色电影| 在线观看成人小视频| 小说区视频区图片区| 五月婷婷狠狠干| 国产一区二三区好的| 日本高清久久天堂| 久久精品第一页| 欧美色图在线播放| 色妞www精品视频| 国产伦精品一区二区三区| 波多野结衣视频网址| 欧美日韩三级电影在线| 中文字幕亚洲二区| 自拍视频一区二区| 日本精品在线播放| 亚洲精品免费在线| 视频一区国产精品| 姝姝窝人体www聚色窝| 久久91精品国产91久久小草| 欧美综合在线第二页| 欧美另类视频在线观看| 97精品国产| 国产一区二区三区在线视频 | 日韩视频免费观看高清在线视频| 欧美一级片中文字幕| 成年人视频免费在线播放| 亚洲三级在线免费观看| 亚洲va久久久噜噜噜久久狠狠| 日韩在线视频观看免费| 国产福利不卡视频| 91九色单男在线观看| 国产成人精品亚洲| 水野朝阳av一区二区三区| 97免费视频在线| 久久黄色免费网站| 欧美精品一卡| 欧美日韩国产va另类| 性生交大片免费全黄| 成人在线免费观看网站| 一区二区欧美日韩视频| 久久国产柳州莫菁门| 国产一区二区三区探花| 亚洲欧洲在线观看| 永久免费看mv网站入口78| 自拍亚洲一区| 国产亚洲精品高潮| 一二三四国产精品| 91成人精品观看| 欧美日韩精品三区| 亚洲美女性囗交| 高清久久精品| 欧美一级日韩免费不卡| 欧美狂野另类xxxxoooo| 中文字幕在线亚洲三区| 午夜视频在线观看网站| 亚洲国产精品高清| 在线一区亚洲| 91三级在线| 一卡二卡欧美日韩| 黄色一级片在线看| 亚洲欧洲自拍| 欧美性色综合网| 99精品999| 女人让男人操自己视频在线观看| 国产欧美日韩久久| 亚洲人成网站在线观看播放| 精品人妻一区二区三区麻豆91 | 精品国产不卡一区二区| 日韩一区二区三区观看| 又大又长粗又爽又黄少妇视频| 亚洲超碰在线观看| 精品调教chinesegay| 男人的天堂官网| 91精品福利| 欧美国产日产韩国视频| 99久在线精品99re8热| 日韩精品乱码av一区二区| 91精品视频在线| 天堂中文在线观看视频| 国产偷国产偷精品高清尤物| 欧美 日韩 国产 在线观看| 国产三线在线| 欧美自拍偷拍一区| 成年人性生活视频| 久久不见久久见中文字幕免费 | 91超碰这里只有精品国产| 成人免费性视频| 久久电影tv| 欧美精品免费视频| 一级国产黄色片| 久久裸体网站| 欧美一区二粉嫩精品国产一线天| 一级片在线观看视频| 日韩国产欧美视频| 国产成人精品一区二区三区福利 | 成年人网站国产| 日韩欧美一区二区三区在线观看| 欧美一级片免费看| 精品人妻中文无码av在线 | 欧美日韩福利电影| a片在线免费观看| 成人国产在线观看| 最新欧美日韩亚洲| 亚洲人免费短视频| 欧美精品一区二区三区久久久| 日本高清黄色片| 亚洲毛片av| 亚洲在线视频观看| 国产女同91疯狂高潮互磨| 91免费看视频| 亚洲国产一二三精品无码| av成人在线观看| 国产视频久久久久久久| 久久久精品国产sm调教网站| 六月丁香综合在线视频| 欧美日韩国产精品一卡| 成人爽a毛片免费啪啪动漫| 欧美人体做爰大胆视频| 欧美福利第一页| 久久精品首页| 久久精品99| 免费毛片b在线观看| 精品国产自在久精品国产| 国产精品精品软件男同| 久久精品免费观看| 亚洲精品乱码久久久久久蜜桃91| 精品国产免费人成网站| 国产视频亚洲视频| 日本中文字幕网| 久久看片网站| 欧美极品视频一区二区三区| 川上优av中文字幕一区二区| 欧美成va人片在线观看| 清纯粉嫩极品夜夜嗨av| 国产精品18久久久| 中文字幕色呦呦| 免费观看亚洲天堂| 欧美高清电影在线看| 国产男男gay网站| 亚洲久本草在线中文字幕| 一级片免费在线观看视频| 在线观看你懂的网站| 涩涩网在线视频| 欧美精品在线一区二区| 欧美性生给视频| 久久91精品国产91久久小草| 色呦呦网站入口| 国产精品亚洲一区二区在线观看| 久久精品国产亚洲精品| 国产美女裸体无遮挡免费视频| 亚洲欧洲性图库| 日韩不卡的av| 亚洲欧洲综合| 人偷久久久久久久偷女厕| 日本成人片在线| 久久精品在线视频| www.五月激情| 天天av天天翘天天综合网| 精品无码在线视频| 日韩电影一二三区| 中文字幕日韩一区二区三区不卡| 激情视频亚洲| 久久久综合av| 国产一区精品| 亚洲欧美偷拍卡通变态| 欧美高清精品一区二区| 亚洲福利久久| 水蜜桃一区二区| 成人网av.com/| 97精品国产97久久久久久春色| 免费福利在线视频| 亚洲自拍偷拍网站| 亚洲精品第二页| 日韩国产欧美在线观看| 日本xxxxx18| 日韩高清在线免费观看| 国产精品中文在线| 91九色在线播放| 一区二区三区精品99久久| 国产美女精品视频国产| 欧美日韩亚洲精品内裤| 四虎永久免费地址| 99久久免费国产| 免费看涩涩视频| 亚洲区欧美区| 日本女人高潮视频| 宅男在线一区| 国产传媒欧美日韩| 欧美国产日韩电影| 久久久亚洲国产| 日本网站在线免费观看视频| 亚洲国产精品视频在线观看| 91在线视频免费播放| 樱花草国产18久久久久| 国产一二三四区在线| 成人综合婷婷国产精品久久蜜臀| 韩国日本美国免费毛片| 亚洲青涩在线| 国产911在线观看| 日韩成人精品一区| 久久艹中文字幕| 日韩免费高清视频网站| 国产精品三级在线| 久久久男人天堂| 欧美插天视频在线播放| 阿v免费在线观看| 欧美亚洲国产怡红院影院| 国产极品美女高潮无套嗷嗷叫酒店| 国产清纯美女被跳蛋高潮一区二区久久w | 午夜日韩在线观看| 欧美做爰爽爽爽爽爽爽| 日本一区二区三区免费乱视频| 天天插天天射天天干| 国产成人精品影视| 捷克做爰xxxⅹ性视频| 免费成人在线网站| 日韩精品资源| 色先锋久久影院av| 国产另类自拍| 国产96在线亚洲| 欧洲亚洲妇女av| 日本乱理伦在线| 亚洲精品电影网站| 亚洲国产剧情在线观看| 欧美精品九九99久久| 波多野结衣人妻| 色综合一个色综合亚洲| 91香蕉在线视频| 亚洲不卡一区二区三区| 欧美激情精品久久| 一个色在线综合| 欧美成人国产精品高潮| 1024亚洲合集| 三上悠亚在线观看视频| 国产精品久久久久久久久久免费看 | 国产精品成人网站| 亚洲国产成人av好男人在线观看| www欧美com| 一区二区三区在线视频免费| 国产精品久久久久久久精| 亚洲精品伦理在线| 国产极品在线播放| 狠狠做深爱婷婷久久综合一区| 久久久久久久久久久影院| 色综合色综合色综合 | 在线观看的网站你懂的| 九九精品视频在线| 国产一线二线在线观看 | 国产精品日韩在线| 成人国产一区| 亚洲jizzjizz日本少妇| 午夜视频在线观看精品中文| 国产v亚洲v天堂无码| 欧美挤奶吃奶水xxxxx| 欧美大香线蕉线伊人久久| 色棕色天天综合网| 一区二区视频在线观看| 中文字幕午夜精品一区二区三区| 国产一区二区三区播放| 一本久道综合久久精品| 日本成年人网址| 蜜臀a∨国产成人精品| 男女视频在线观看网站| 99久久精品一区二区| 国产精品国产三级国产专业不| 国产精品久久久久永久免费观看| 五月天婷婷色综合| 亚洲大片免费看| 国产乱码77777777| 91精品久久久久久蜜臀| 日日躁夜夜躁白天躁晚上躁91| 亚洲人在线视频| 成人av福利| 欧美中文字幕在线播放| 欧美成人xxxx| 国内精品中文字幕| 成人影院入口| 成人在线激情视频| 亚洲人成网亚洲欧洲无码| 中文字幕在线中文字幕日亚韩一区| 亚洲一级二级| 在线免费视频一区| 成人一区二区在线观看| 特级西西www444人体聚色| 亚洲综合一区二区| 午夜视频网站在线观看| 精品久久久久香蕉网| 国产在线超碰| 国内精品久久久久久中文字幕| av成人在线看| 久久综合一区二区三区| 亚欧美无遮挡hd高清在线视频 | segui88久久综合| 国产精品入口福利| 亚洲黄页网站| 2018中文字幕第一页| 理论片日本一区| 亚洲一级中文字幕| 亚洲一区二区三区精品在线| 在线观看视频中文字幕| 在线亚洲欧美专区二区| 午夜精品久久久久久久91蜜桃| 亚洲人高潮女人毛茸茸| av在线理伦电影| 91亚洲va在线va天堂va国| 国产成人一区二区三区影院| 国产欧美日韩小视频| 国产一区二区三区久久久| 国产99在线 | 亚洲| 精品久久久中文| 亚洲av无码一区二区三区性色| 最近日韩中文字幕中文| 亚洲性色av| 国产精品区一区二区三含羞草| 亚洲精品网址| 粉色视频免费看| 国产欧美日韩亚州综合| av网站中文字幕| 日韩精品中文字幕久久臀| 国产精品—色呦呦| 福利视频一区二区三区| 欧美一区二区三区另类| 日本www在线视频| 国产成人一区二区精品非洲| 久久精品亚洲a| 欧美日韩在线直播| 国内老熟妇对白xxxxhd| 亚洲成年人在线播放| 国产黄色在线免费观看| 国产日韩视频在线观看| 久久裸体网站| 欧美视频亚洲图片| 亚洲少妇中出一区| 国产精品天天操| 欧美成年人视频网站欧美| vam成人资源在线观看| dy888午夜| 丁香啪啪综合成人亚洲小说 | 欧美久色视频| 国产精品成人免费一区久久羞羞| 一区二区三区在线高清| www.综合色| 91精品成人久久| 国产精品免费99久久久| 国产一二三区av| 国产精品久99| 国产剧情久久久| 欧美高清在线观看| 嫩草国产精品入口| 久久综合久久色| 国产精品伦一区二区三级视频| 亚洲天堂aaa| 欧美黑人一级爽快片淫片高清| 国产精东传媒成人av电影| 精品这里只有精品| 国产清纯白嫩初高生在线观看91| 在线观看免费观看在线| 欧美成人一区在线| 国产精品玖玖玖在线资源| 国产中文字幕免费观看| 国产女人水真多18毛片18精品视频 | 91久久国产婷婷一区二区| 欧美精品99| jizz欧美性20| 欧美日韩精品系列| 福利在线导航136| 免费影院在线观看一区| 麻豆视频一区二区| 久草福利资源在线观看| 日韩毛片在线看| 日本在线一区二区| 国产高清av在线播放| 中文字幕欧美激情| 亚洲男女视频在线观看| 国产精品福利小视频| 欧美人与禽猛交乱配视频| 日本黄色网址大全| 欧美肥胖老妇做爰| 亚洲第一在线播放| 小嫩嫩精品导航| 99久久免费看精品国产一区| 欧美午夜影院一区| 成人黄色动漫| 中文有码久久|