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

開發一個Linux調試器(四):Elves和dwarves

系統 Linux
到目前為止,你已經偶爾聽到了關于 dwarves、調試信息、一種無需解析就可以理解源碼方式。今天我們會詳細介紹源碼級的調試信息,作為本指南后面部分使用它的準備。

[[197930]]

到目前為止,你已經偶爾聽到了關于 dwarves、調試信息、一種無需解析就可以理解源碼方式。今天我們會詳細介紹源碼級的調試信息,作為本指南后面部分使用它的準備。

系列文章索引

隨著后面文章的發布,這些鏈接會逐漸生效。

  1. 準備環境
  2. 斷點
  3. 寄存器和內存
  4. Elves 和 dwarves
  5. 源碼和信號
  6. 源碼級逐步執行
  7. 源碼級斷點
  8. 調用棧展開
  9. 讀取變量
  10. 下一步

ELF 和 DWARF 簡介

ELF 和 DWARF 可能是兩個你沒有聽說過,但可能大部分時間都在使用的組件。ELF(Executable and Linkable Format,可執行和可鏈接格式)是 Linux 系統中使用最廣泛的目標文件格式;它指定了一種存儲二進制文件的所有不同部分的方式,例如代碼、靜態數據、調試信息以及字符串。它還告訴加載器如何加載二進制文件并準備執行,其中包括說明二進制文件不同部分在內存中應該放置的地點,哪些位需要根據其它組件的位置固定(重分配)以及其它。在這些博文中我不會用太多篇幅介紹 ELF,但是如果你感興趣的話,你可以查看這個很好的信息圖或該標準。

DWARF是通常和 ELF 一起使用的調試信息格式。它不一定要綁定到 ELF,但它們兩者是一起發展的,一起工作得很好。這種格式允許編譯器告訴調試器最初的源代碼如何和被執行的二進制文件相關聯。這些信息分散到不同的 ELF 部分,每個部分都銜接有一份它自己的信息。下面不同部分的定義,信息取自這個稍有過時但非常重要的 DWARF 調試格式簡介:

  • .debug_abbrev .debug_info 部分使用的縮略語
  • .debug_aranges 內存地址和編譯的映射
  • .debug_frame 調用幀信息
  • .debug_info 包括 DWARF 信息條目(DWARF Information Entries)(DIEs)的核心 DWARF 數據
  • .debug_line 行號程序
  • .debug_loc 位置描述
  • .debug_macinfo 宏描述
  • .debug_pubnames 全局對象和函數查找表
  • .debug_pubtypes 全局類型查找表
  • .debug_ranges DIEs 的引用地址范圍
  • .debug_str .debug_info 使用的字符串列表
  • .debug_types 類型描述

我們最關心的是 .debug_line 和 .debug_info 部分,讓我們來看一個簡單程序的 DWARF 信息。

  1. int main() { 
  2.     long a = 3; 
  3.     long b = 2; 
  4.     long c = a + b; 
  5.     a = 4; 

DWARF 行表

如果你用 -g 選項編譯這個程序,然后將結果傳遞給 dwarfdump 執行,在行號部分你應該可以看到類似這樣的東西:

  1. .debug_line: line number info for a single cu 
  2. Source lines (from CU-DIE at .debug_info offset 0x0000000b): 
  3.             NS new statement, BB new basic block, ET end of text sequence 
  4.             PE prologue end, EB epilogue begin 
  5.             IS=val ISA number, DI=val discriminator value 
  6. <pc>        [lno,col] NS BB ET PE EB IS= DI= uri: "filepath" 
  7. 0x00400670  [   1, 0] NS uri: "/home/simon/play/MiniDbg/examples/variable.cpp" 
  8. 0x00400676  [   2,10] NS PE 
  9. 0x0040067e  [   3,10] NS 
  10. 0x00400686  [   4,14] NS 
  11. 0x0040068a  [   4,16] 
  12. 0x0040068e  [   4,10] 
  13. 0x00400692  [   5, 7] NS 
  14. 0x0040069a  [   6, 1] NS 
  15. 0x0040069c  [   6, 1] NS ET 

前面幾行是一些如何理解 dump 的信息 - 主要的行號數據從以 0x00400670 開頭的行開始。實際上這是一個代碼內存地址到文件中行列號的映射。NS 表示地址標記一個新語句的開始,這通常用于設置斷點或逐步執行。PE 表示函數序言(LCTT 譯注:在匯編語言中,function prologue 是程序開始的幾行代碼,用于準備函數中用到的棧和寄存器)的結束,這對于設置函數斷點非常有幫助。ET 表示轉換單元的結束。信息實際上并不像這樣編碼;真正的編碼是一種非常節省空間的排序程序,可以通過執行它來建立這些行信息。

那么,假設我們想在 variable.cpp 的第 4 行設置斷點,我們該怎么做呢?我們查找和該文件對應的條目,然后查找對應的行條目,查找對應的地址,在那里設置一個斷點。在我們的例子中,條目是:

  1. 0x00400686  [   4,14] NS 

假設我們想在地址 0x00400686 處設置斷點。如果你想嘗試的話你可以在已經編寫好的調試器上手動實現。

反過來也是如此。如果我們已經有了一個內存地址 - 例如說,一個程序計數器值 - 想找到它在源碼中的位置,我們只需要從行表信息中查找最接近的映射地址并從中抓取行號。

DWARF 調試信息

.debug_info 部分是 DWARF 的核心。它給我們關于我們程序中存在的類型、函數、變量、希望和夢想的信息。這部分的基本單元是 DWARF 信息條目(DWARF Information Entry),我們親切地稱之為 DIEs。一個 DIE 包括能告訴你正在展現什么樣的源碼級實體的標簽,后面跟著一系列該實體的屬性。這是我上面展示的簡單事例程序的 .debug_info 部分:

  1. .debug_info 
  2. COMPILE_UNIT<header overall offset = 0x00000000>: 
  3. < 0><0x0000000b>  DW_TAG_compile_unit 
  4.                     DW_AT_producer              clang version 3.9.1 (tags/RELEASE_391/final) 
  5.                     DW_AT_language              DW_LANG_C_plus_plus 
  6.                     DW_AT_name                  /super/secret/path/MiniDbg/examples/variable.cpp 
  7.                     DW_AT_stmt_list             0x00000000 
  8.                     DW_AT_comp_dir              /super/secret/path/MiniDbg/build 
  9.                     DW_AT_low_pc                0x00400670 
  10.                     DW_AT_high_pc               0x0040069c 
  11. LOCAL_SYMBOLS: 
  12. < 1><0x0000002e>    DW_TAG_subprogram 
  13.                       DW_AT_low_pc                0x00400670 
  14.                       DW_AT_high_pc               0x0040069c 
  15.                       DW_AT_frame_base            DW_OP_reg6 
  16.                       DW_AT_name                  main 
  17.                       DW_AT_decl_file             0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp 
  18.                       DW_AT_decl_line             0x00000001 
  19.                       DW_AT_type                  <0x00000077> 
  20.                       DW_AT_external              yes(1) 
  21. < 2><0x0000004c>      DW_TAG_variable 
  22.                         DW_AT_location              DW_OP_fbreg -8 
  23.                         DW_AT_name                  a 
  24.                         DW_AT_decl_file             0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp 
  25.                         DW_AT_decl_line             0x00000002 
  26.                         DW_AT_type                  <0x0000007e> 
  27. < 2><0x0000005a>      DW_TAG_variable 
  28.                         DW_AT_location              DW_OP_fbreg -16 
  29.                         DW_AT_name                  b 
  30.                         DW_AT_decl_file             0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp 
  31.                         DW_AT_decl_line             0x00000003 
  32.                         DW_AT_type                  <0x0000007e> 
  33. < 2><0x00000068>      DW_TAG_variable 
  34.                         DW_AT_location              DW_OP_fbreg -24 
  35.                         DW_AT_name                  c 
  36.                         DW_AT_decl_file             0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp 
  37.                         DW_AT_decl_line             0x00000004 
  38.                         DW_AT_type                  <0x0000007e> 
  39. < 1><0x00000077>    DW_TAG_base_type 
  40.                       DW_AT_name                  int 
  41.                       DW_AT_encoding              DW_ATE_signed 
  42.                       DW_AT_byte_size             0x00000004 
  43. < 1><0x0000007e>    DW_TAG_base_type 
  44.                       DW_AT_name                  long int 
  45.                       DW_AT_encoding              DW_ATE_signed 
  46.                       DW_AT_byte_size             0x00000008 

***個 DIE 表示一個編譯單元(CU),實際上是一個包括了所有 #includes 和類似語句的源文件。下面是帶含義注釋的屬性:

  1. DW_AT_producer   clang version 3.9.1 (tags/RELEASE_391/final)    <-- 產生該二進制文件的編譯器 
  2. DW_AT_language   DW_LANG_C_plus_plus                             <-- 原編程語言 
  3. DW_AT_name       /super/secret/path/MiniDbg/examples/variable.cpp  <-- 該 CU 表示的文件名稱 
  4. DW_AT_stmt_list  0x00000000                                      <-- 跟蹤該 CU 的行表偏移 
  5. DW_AT_comp_dir   /super/secret/path/MiniDbg/build                  <-- 編譯目錄 
  6. DW_AT_low_pc     0x00400670                                      <-- 該 CU 的代碼起始 
  7. DW_AT_high_pc    0x0040069c                                      <-- 該 CU 的代碼結尾 

其它的 DIEs 遵循類似的模式,你也很可能推測出不同屬性的含義。

現在我們可以根據新學到的 DWARF 知識嘗試和解決一些實際問題。

當前我在哪個函數?

假設我們有一個程序計數器值然后想找到當前我們在哪一個函數。一個解決該問題的簡單算法:

  1. for each compile unit: 
  2.     if the pc is between DW_AT_low_pc and DW_AT_high_pc: 
  3.         for each function in the compile unit: 
  4.             if the pc is between DW_AT_low_pc and DW_AT_high_pc: 
  5.                 return function information 

這對于很多目的都有效,但如果有成員函數或者內聯(inline),就會變得更加復雜。假如有內聯,一旦我們找到其范圍包括我們的程序計數器(PC)的函數,我們需要遞歸遍歷該 DIE 的所有孩子檢查有沒有內聯函數能更好地匹配。在我的代碼中,我不會為該調試器處理內聯,但如果你想要的話你可以添加該功能。

如何在一個函數上設置斷點?

再次說明,這取決于你是否想要支持成員函數、命名空間以及類似的東西。對于簡單的函數你只需要迭代遍歷不同編譯單元中的函數直到你找到一個合適的名字。如果你的編譯器能夠填充 .debug_pubnames 部分,你可以更高效地做到這點。

一旦找到了函數,你可以在 DW_AT_low_pc 給定的內存地址設置一個斷點。不過那會在函數序言處中斷,但更合適的是在用戶代碼處中斷。由于行表信息可以指定序言的結束的內存地址,你只需要在行表中查找 DW_AT_low_pc 的值,然后一直讀取直到被標記為序言結束的條目。一些編譯器不會輸出這些信息,因此另一種方式是在該函數第二行條目指定的地址處設置斷點。

假如我們想在我們示例程序中的 main 函數設置斷點。我們查找名為 main 的函數,獲取到它的 DIE:

  1. < 1><0x0000002e>    DW_TAG_subprogram 
  2.                       DW_AT_low_pc                0x00400670 
  3.                       DW_AT_high_pc               0x0040069c 
  4.                       DW_AT_frame_base            DW_OP_reg6 
  5.                       DW_AT_name                  main 
  6.                       DW_AT_decl_file             0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp 
  7.                       DW_AT_decl_line             0x00000001 
  8.                       DW_AT_type                  <0x00000077> 
  9.                       DW_AT_external              yes(1) 

這告訴我們函數從 0x00400670 開始。如果我們在行表中查找這個,我們可以獲得條目:

  1. 0x00400670  [   1, 0] NS uri: "/super/secret/path/MiniDbg/examples/variable.cpp" 

我們希望跳過序言,因此我們再讀取一個條目:

  1. 0x00400676 [ 2,10] NS PE 

Clang 在這個條目中包括了序言結束標記,因此我們知道在這里停止,然后在地址 0x00400676 處設一個斷點。

我如何讀取一個變量的內容?

讀取變量可能非常復雜。它們是難以捉摸的東西,可能在整個函數中移動、保存在寄存器中、被放置于內存、被優化掉、隱藏在角落里,等等。幸運的是我們的簡單示例是真的很簡單。如果我們想讀取變量 a 的內容,我們需要看它的 DW_AT_location 屬性:

  1. DW_AT_location DW_OP_fbreg -8 

這告訴我們內容被保存在以棧幀基(base of the stack frame)偏移為 -8 的地方。為了找到棧幀基,我們查找所在函數的 DW_AT_frame_base 屬性。

  1. DW_AT_frame_base DW_OP_reg6 

從 System V x86_64 ABI 我們可以知道 reg6 在 x86 中是幀指針寄存器?,F在我們讀取幀指針的內容,從中減去 8,就找到了我們的變量。如果我們知道它具體是什么,我們還需要看它的類型:

  1. < 2><0x0000004c>      DW_TAG_variable 
  2.                         DW_AT_name                  a 
  3.                         DW_AT_type                  <0x0000007e> 

如果我們在調試信息中查找該類型,我們得到下面的 DIE:

  1. < 1><0x0000007e>    DW_TAG_base_type 
  2.                       DW_AT_name                  long int 
  3.                       DW_AT_encoding              DW_ATE_signed 
  4.                       DW_AT_byte_size             0x00000008 

這告訴我們該類型是 8 字節(64 位)有符號整型,因此我們可以繼續并把這些字節解析為 int64_t 并向用戶顯示。

當然,類型可能比那要復雜得多,因為它們要能夠表示類似 C++ 的類型,但是這能給你它們如何工作的基本認識。

再次回到幀基(frame base),Clang 可以通過幀指針寄存器跟蹤幀基。最近版本的 GCC 傾向于使用 DW_OP_call_frame_cfa,它包括解析 .eh_frame ELF 部分,那是一個我不會去寫的另外一篇完全不同的文章。如果你告訴 GCC 使用 DWARF 2 而不是最近的版本,它會傾向于輸出位置列表,這更便于閱讀:

  1. DW_AT_frame_base            <loclist at offset 0x00000000 with 4 entries follows> 
  2.  low-off : 0x00000000 addr  0x00400696 high-off  0x00000001 addr 0x00400697>DW_OP_breg7+8 
  3.  low-off : 0x00000001 addr  0x00400697 high-off  0x00000004 addr 0x0040069a>DW_OP_breg7+16 
  4.  low-off : 0x00000004 addr  0x0040069a high-off  0x00000031 addr 0x004006c7>DW_OP_breg6+16 
  5.  low-off : 0x00000031 addr  0x004006c7 high-off  0x00000032 addr 0x004006c8>DW_OP_breg7+8 

位置列表取決于程序計數器所處的位置給出不同的位置。這個例子告訴我們如果程序計數器是在 DW_AT_low_pc 偏移量為 0x0 的位置,那么幀基就在和寄存器 7 中保存的值偏移量為 8 的位置,如果它是在 0x1 和 0x4 之間,那么幀基就在和相同位置偏移量為 16 的位置,以此類推。

休息一會

這里有很多的信息需要你的大腦消化,但好消息是在后面的幾篇文章中我們會用一個庫替我們完成這些艱難的工作。理解概念仍然很有幫助,尤其是當出現錯誤或者你想支持一些你使用的 DWARF 庫所沒有實現的 DWARF 概念時。

如果你想了解更多關于 DWARF 的內容,那么你可以從這里獲取其標準。在寫這篇博客時,剛剛發布了 DWARF 5,但更普遍支持 DWARF 4。 

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

2017-06-28 14:21:22

Linux調試器斷點

2017-08-28 14:40:57

Linux調試器源碼和信號

2017-06-22 10:44:55

Linux調試器準備環境

2017-07-05 14:37:07

Linux調試器寄存器和內存

2017-10-09 10:26:01

Linux調試器堆棧展開

2017-10-09 10:56:49

Linux調試器處理變量

2017-10-12 18:20:44

Linux調試器高級主題

2017-09-25 08:04:31

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 調試器

2010-12-21 10:16:53

2020-03-16 10:05:13

EmacsGUDLinux

2009-12-14 10:57:34

Ruby調試器

2011-08-31 16:51:12

Lua調試器

2010-05-28 14:14:37

Linux開發工具

2019-12-06 14:30:41

GNU調試器GDB修復代碼

2023-02-28 11:39:55

CMake腳本項目

2024-03-13 08:00:00

Linux調試器應用程序
點贊
收藏

51CTO技術棧公眾號

草碰在线视频| 久久精品国产亚洲av高清色欲| 91精品产国品一二三产区| 国产亚洲精品久| 成人一区二区电影| 久久免费视频精品| 蜜臀91精品国产高清在线观看| 在线视频一区二区三| 欧美亚洲视频一区| 五月婷婷狠狠干| 美女精品一区二区| 欧美精品久久久久久久久| 久久久久亚洲av无码专区桃色| 日韩大陆av| 五月天激情综合| 亚洲国产一区二区三区在线播| 性生活黄色大片| 久久青草久久| 欧美激情在线播放| 狂野欧美性猛交| 欧美黑人巨大videos精品| 欧美日韩精品系列| 黄色成人在线看| 国产精品久久久久久福利| av电影天堂一区二区在线| 在线精品视频免费播放| 亚洲精品第一页| 日本阿v视频在线观看| 不卡在线视频| 97se亚洲国产综合自在线不卡 | 日韩免费av一区二区三区| 国产偷拍一区二区| 美腿丝袜亚洲一区| 51精品在线观看| 九九热只有精品| 欧洲激情综合| 亚洲欧洲av一区二区| 国产污在线观看| 国产亚洲字幕| 3atv在线一区二区三区| 黄色一级二级三级| 欧美日韩在线观看首页| 一区二区欧美在线观看| 中文字幕日韩精品久久| 高清av在线| 久久婷婷久久一区二区三区| 国产一区免费| 亚洲欧美强伦一区二区| 国产一区二区三区免费观看| 国产精品亚发布| www.com国产| 一区二区黄色| 欧美一级成年大片在线观看| 国产一级做a爱免费视频| 欧美区国产区| 欧美日韩999| 538精品在线观看| 91精品综合| 久久激情视频久久| 黄色精品视频在线观看| 98精品久久久久久久| 自拍偷拍亚洲精品| 蜜桃av免费在线观看| 日韩久久精品| 日韩中文在线视频| 黄色香蕉视频在线观看| 欧美在线日韩| 欧美激情高清视频| 精品肉丝脚一区二区三区| 欧美激情综合色综合啪啪| 毛片精品免费在线观看| 欧美色图亚洲天堂| 亚洲三级视频| 欧美有码在线观看视频| 一级特黄免费视频| 捆绑调教美女网站视频一区| 成人国产在线激情| 国产日韩在线观看一区| 福利一区福利二区| 精品国产综合区久久久久久| 青青操在线视频| 欧美激情中文不卡| 中文字幕色一区二区| 超碰porn在线| 午夜久久福利影院| 国产嫩草在线观看| 亚洲欧美久久精品| 欧美哺乳videos| 人妻丰满熟妇aⅴ无码| 国产成人ay| 久久久成人精品视频| 国产精品成人aaaa在线| 销魂美女一区二区三区视频在线| 国产精品久久久久久久久久久新郎 | 自拍日韩欧美| 久久伊人色综合| 国产精彩视频在线观看| 天堂va蜜桃一区二区三区漫画版| 国产成人av在线| 国产又大又黄的视频| 粉嫩av一区二区三区在线播放| 九九99玖玖| 国产高清视频在线| 亚洲自拍偷拍网站| 激情五月亚洲色图| 一区二区三区在线资源| 亚洲视频在线看| 欧美又粗又大又长| 久久字幕精品一区| 国产精品亚洲欧美| 欧美激情第99页| 这里只有久久精品视频| 国产成人av一区二区三区在线 | 九九综合在线| 欧美精品日韩三级| 国语对白做受69按摩| 国产成人av电影| 亚洲国产精品123| 91美女精品| 555www色欧美视频| 国产ts丝袜人妖系列视频| 欧美在线91| 国产免费亚洲高清| 色鬼7777久久| 一区二区三区资源| 天堂视频免费看| 欧美调教在线| 欧美高清视频免费观看| 一区二区三区亚洲视频| 国产亚洲综合性久久久影院| 日韩精品在线观看av| 国产资源一区| 亚洲片国产一区一级在线观看| 久草网在线观看| 黑人巨大精品欧美黑白配亚洲| 欧美亚洲免费在线| 嗯啊主人调教在线播放视频| 欧美丰满高潮xxxx喷水动漫| 天天摸日日摸狠狠添| 国产日韩一区二区三区在线| www日韩av| 好吊日视频在线观看| 欧美色大人视频| 久久精品无码一区| 麻豆9191精品国产| 精品无人区一区二区三区竹菊| 欧洲性视频在线播放| 91精品国产福利| 麻豆天美蜜桃91| 激情综合网最新| 在线免费一区| 亚洲伦理一区二区| 久久久国产精品亚洲一区| 国产又黄又粗又硬| 亚洲欧洲日韩一区二区三区| 91 在线视频观看| 亚洲激情中文| 亚洲一区免费网站| 91亚洲天堂| 欧美v日韩v国产v| 九九九国产视频| 99精品欧美一区二区三区小说| 日韩国产一级片| 亚欧洲精品视频在线观看| 国产91精品高潮白浆喷水| 日韩精品一二| 欧美在线观看视频在线| 精品一区二区6| 精品一区二区三区在线播放视频 | 亚洲欧美一区二区三| 婷婷久久综合九色综合伊人色| 人妻精品久久久久中文字幕| 老鸭窝91久久精品色噜噜导演| 神马欧美一区二区| 日韩免费大片| 色综合男人天堂| 亚洲av激情无码专区在线播放| 在线观看视频一区| 久久嫩草捆绑紧缚| 国产成人精品午夜视频免费| 欧美三级在线观看视频| 欧美日韩爱爱| 91沈先生在线观看| 欧美人动性xxxxz0oz| 日韩成人在线播放| 中文字幕在线观看国产| 一区二区三区色| www.久久av| 久久国产精品99精品国产| 欧美交换配乱吟粗大25p| 你懂的在线观看一区二区| 国产z一区二区三区| 免费黄色在线网站| 亚洲国产精品va| 亚洲天堂777| 亚洲成人免费电影| 国产黄色大片免费看| 国产高清一区日本| 免费黄色日本网站| 91精品一区二区三区综合在线爱| 精品乱码一区二区三区| 成人a在线观看高清电影| 欧美激情小视频| 91av资源在线| 亚洲国产精品国自产拍av秋霞| 成人黄色片在线观看| 亚洲午夜三级在线| 国产精品一区在线播放| 国产又粗又猛又爽又黄的视频一| 亚洲国产综合人成综合网站| 国产黄色片在线| 99精品视频一区二区三区| 亚洲国产日韩在线一区| 久久综合图片| 全黄性性激高免费视频| 国产精品88久久久久久| 久久精品日产第一区二区三区乱码 | 91福利在线免费| 亚洲人成啪啪网站| 亚洲精品一区二区三区蜜桃| 欧美午夜一区二区三区免费大片| 日本特黄一级片| 亚洲女性喷水在线观看一区| 亚洲日本精品视频| 99九九99九九九视频精品| 色噜噜狠狠一区二区三区狼国成人 | 日韩精品影音先锋| 亚洲精品无码久久久久| 精品美女久久久久久免费| 成年人网站在线观看视频| 国产网红主播福利一区二区| 成年人小视频在线观看| 国产在线观看一区二区| 国产精品久久久毛片| 亚洲欧美日本视频在线观看| 日本a在线免费观看| 亚洲视频狠狠| 国产欧美精品aaaaaa片| 亚洲情侣在线| 亚洲一区三区电影在线观看| 精品盗摄女厕tp美女嘘嘘| 欧美午夜欧美| 欧美猛男同性videos| 久久资源亚洲| 特黄特色欧美大片| 久久国产精品高清| 色天天色综合| 看高清中日韩色视频| 日本三级久久| 欧美日韩精品一区| 伊人久久大香线蕉无限次| 蜜桃传媒视频第一区入口在线看| 色吊丝一区二区| 麻豆精品传媒视频| 国产欧美日韩精品一区二区免费| 欧美亚洲精品日韩| 日韩成人精品一区二区| 一区二区精品视频| 国产精品久久占久久| 黄色免费高清视频| 欧美精品播放| av在线播放亚洲| 国产毛片一区| 三级a在线观看| 激情欧美一区二区三区在线观看| 不用播放器的免费av| 国产一区二区按摩在线观看| 国模大尺度视频| 成人免费视频caoporn| 免费在线观看成年人视频| 久久精品日韩一区二区三区| 日本精品久久久久中文| 亚洲人123区| 国产精品111| 在线视频国内一区二区| 国产精品无码久久av| 精品欧美一区二区在线观看| 天堂av在线7| 一本久久综合亚洲鲁鲁| 成人欧美在线| 97成人在线视频| 成人在线免费av| 高清国产在线一区| 久久爱www成人| 中国一级大黄大黄大色毛片| 亚洲美女啪啪| 天堂av在线网站| 国产很黄免费观看久久| 黄色aaa视频| 亚洲精品欧美在线| 欧美亚洲精品天堂| 911精品国产一区二区在线| 色哟哟国产精品色哟哟| 国产亚洲欧美视频| 色呦呦在线观看视频| 国产精品成人免费电影| 亚洲精品a区| 色噜噜色狠狠狠狠狠综合色一| 国产精品videossex久久发布| 久久精品免费一区二区| 国产精品亚洲成人| 久久久久久久有限公司| 精品视频亚洲| 免费高清一区二区三区| 麻豆中文一区二区| 先锋资源av在线| 亚洲欧洲av另类| 中文字幕在线看人| 日韩欧美在线综合网| 二人午夜免费观看在线视频| 久久久久久久久久久免费| 欧美成人免费全部网站| 国产一区喷水| 欧美激情综合| 一起操在线视频| 久久久久久久精| 日本三级午夜理伦三级三| 欧美高清dvd| av资源网站在线观看| 国产91精品青草社区| aaa国产精品视频| 在线视频中文字幕一区二区| 午夜免费激情视频| 欧美性色aⅴ视频一区日韩精品| 涩涩视频免费看| 欧美肥婆姓交大片| 在线免费观看亚洲| 视频一区视频二区视频| 亚洲在线国产日韩欧美| 黑森林av导航| 亚洲人成网站精品片在线观看| 在线视频 中文字幕| 国产一区二区三区在线视频 | 妞干网在线免费视频| bt7086福利一区国产| 精品无码人妻一区二区三| 欧美一级片在线| 高清全集视频免费在线| 国产一区二区在线免费视频| 成人写真视频| 新呦u视频一区二区| 免费在线亚洲欧美| 这里只有精品在线观看视频| 亚洲国产综合在线| 蜜桃视频污在线观看| 欧美高清视频在线播放| 亚洲一级大片| 国产日韩欧美精品在线观看| 成人午夜私人影院| 国产亚洲欧美精品久久久久久| 精品国产一区二区三区久久影院| 日本三级韩国三级欧美三级| 99porn视频在线| 激情六月综合| 免费黄色三级网站| 欧美网站在线观看| 国模吧精品人体gogo| 国产精品久久久久7777婷婷| av亚洲在线观看| 性欧美在线视频| 一区二区三区四区视频精品免费 | 日韩精品免费在线观看| 午夜不卡影院| 日韩国产美国| 极品美女销魂一区二区三区| 日本青青草视频| 精品999在线播放| 亚洲私拍视频| 天天综合狠狠精品| 国产一区 二区 三区一级| 青娱乐在线视频免费观看| 亚洲国产精品va在线| 色尼玛亚洲综合影院| 亚洲高清视频一区| 国产精品 日产精品 欧美精品| 国产乡下妇女做爰| 亚洲人成网7777777国产| 日本在线一区二区| 国产一二三在线视频| 国产亚洲婷婷免费| 国产伦理一区二区| 9.1国产丝袜在线观看| 青青草97国产精品麻豆| 免费欧美一级片| 一本大道久久a久久精品综合| 色哟哟免费在线观看| 99电影网电视剧在线观看| 午夜一区在线| caoporn91| 亚洲精品一区二三区不卡| 在线播放成人| 免费成人在线视频网站| 国产精品高潮呻吟久久| 欧美熟妇另类久久久久久不卡| 国产成人精品电影久久久| 一级欧洲+日本+国产 | 亚洲欧美在线视频观看| 日韩在线观看视频网站| 国产美女久久精品| 夜夜嗨一区二区三区|