日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Simpleperf介绍

發布時間:2024/4/11 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Simpleperf介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是simpleperf

Simpleperf是Android平臺的一個本地層性能分析工具。它的命令行界面支持與linux-tools perf大致相同的選項,但是它還支持許多Android特有的改進。

Simpleperf是Android開源項目(AOSP)的一部分。其源代碼 位于。其最新的文檔 位于。Bugs 和 功能需求可以提交到 githb上。

Simpleperf是如何工作的

現代的CPU具有一個硬件組件,稱為性能監控單元(PMU)。PMU具有一些硬件計數器,計數一些諸如 經歷了多少次CPU周期,執行了多少條指令,或發生了多少次緩存未命中 等的事件。

Linux內核將這些硬件計數器包裝到硬件perf事件 (hardware perf events)中。此外,Linux內核還提供了獨立于硬件的軟件事件和跟蹤點事件。Linux內核通過 perf_event_open 系統調用將這些都暴露給了用戶空間,這正是simpleperf所使用的機制。

Simpleperf具有三個主要的功能:stat,record 和 report。

Stat命令給出了在一個時間段內被分析的進程中發生了多少事件的摘要。以下是它的工作原理:

  • 給定用戶選項,simpleperf通過對linux內核進行系統調用來啟用分析。
  • Linux 內核在調度到被分析進程時啟用計數器。
  • 分析之后,simpleperf從內核讀取計數器,并報告計數器摘要。
  • Record 命令在一段時間內記錄剖析進程的樣本。它的工作原理如下:

  • 給定用戶選項,simpleperf通過對linux內核進行系統調用來啟用分析。
  • Simpleperf 在simpleperf 和 linux 內核之間創建映射緩沖區。
  • Linux 內核在調度到被分析進程時啟用計數器。
  • 每次給定數量的事件發生時,linux 內核將樣本轉儲到映射緩沖區。
  • Simpleperf 從映射緩沖區讀取樣本并生成 perf.data。
  • Report 命令讀取 “perf.data” 文件及所有被剖析進程用到的共享庫,并輸出一份報告,展示時間消耗在了哪里。

    主 simpleperf 命令

    Simpleperf 支持一些子命令,包括 list,stat,record,report。每個子命令支持不同的選項。這一節只描述最重要的子命令和選項。要了解所有的子命令和選項,請使用 --help。

    # List all subcommands. $simpleperf --help# Print help message for record subcommand. $simpleperf record --help

    simpleperf list

    simpleperf list 被用于列出設備上所有可用的事件。由于應該和內核的差異,不同的設備可以支持不同的事件。

    $simpleperf list List of hw-cache events:branch-loads... List of hardware events:cpu-cyclesinstructions... List of software events:cpu-clocktask-clock...

    simpleperf stat

    simpleperf stat 被用于獲取被剖析程序或系統范圍內的原始事件計數器信息。通過傳入選項,我們可以選擇使用哪些事件,監視哪個進程/線程,監視多長時間,以及打印的間隔。下面是一個例子。

    # Stat using default events (cpu-cycles,instructions,...), and monitor # process 7394 for 10 seconds. $simpleperf stat -p 7394 --duration 10 Performance counter statistics:1,320,496,145 cpu-cycles # 0.131736 GHz (100%)510,426,028 instructions # 2.587047 cycles per instruction (100%)4,692,338 branch-misses # 468.118 K/sec (100%) 886.008130(ms) task-clock # 0.088390 cpus used (100%)753 context-switches # 75.121 /sec (100%)870 page-faults # 86.793 /sec (100%)Total test time: 10.023829 seconds.

    選擇事件

    我們可以通過 -e 選項選擇使用哪個事件。下面是例子:

    # Stat event cpu-cycles. $simpleperf stat -e cpu-cycles -p 11904 --duration 10# Stat event cache-references and cache-misses. $simpleperf stat -e cache-references,cache-misses -p 11904 --duration 10

    當運行 stat 命令時,如果硬件事件的數量大于 PMU中可用的硬件計數器的數量,則內核在事件間共享硬件計數器,因此每個事件只在總時間中的一部分內被監視。在下面的例子中,每一行的最后都有一個百分比,展示了每個事件實際被監視的時間占總時間的百分比。

    # Stat using event cache-references, cache-references:u,.... $simpleperf stat -p 7394 -e cache-references,cache-references:u,cache-references:k,cache-misses,cache-misses:u,cache-misses:k,instructions --duration 1 Performance counter statistics:4,331,018 cache-references # 4.861 M/sec (87%) 3,064,089 cache-references:u # 3.439 M/sec (87%) 1,364,959 cache-references:k # 1.532 M/sec (87%)91,721 cache-misses # 102.918 K/sec (87%)45,735 cache-misses:u # 51.327 K/sec (87%)38,447 cache-misses:k # 43.131 K/sec (87%) 9,688,515 instructions # 10.561 M/sec (89%)Total test time: 1.026802 seconds.

    在上面的例子中,每個事件被監視的時間大概占總時間的 87%。但是,不保證任何一對事件總是在相同的時間被監視。如果我們想要讓一些事件在同一時間被監視,我們可以使用 --group 選項。下面是一個例子。

    # Stat using event cache-references, cache-references:u,.... $simpleperf stat -p 7394 --group cache-references,cache-misses --group cache-references:u,cache-misses:u --group cache-references:k,cache-misses:k -e instructions --duration 1 Performance counter statistics:3,638,900 cache-references # 4.786 M/sec (74%)65,171 cache-misses # 1.790953% miss rate (74%) 2,390,433 cache-references:u # 3.153 M/sec (74%)32,280 cache-misses:u # 1.350383% miss rate (74%)879,035 cache-references:k # 1.251 M/sec (68%)30,303 cache-misses:k # 3.447303% miss rate (68%) 8,921,161 instructions # 10.070 M/sec (86%)Total test time: 1.029843 seconds.

    選擇監視目標

    我們可以通過 -p 選項或 -t 選項選擇監視哪個進程或線程。監視一個進程如同監視進程中的所有線程。Simpleperf 也可以 fork 一個子進程來運行新命令,然后監視子進程。下面是例子。

    # Stat process 11904 and 11905. $simpleperf stat -p 11904,11905 --duration 10# Stat thread 11904 and 11905. $simpleperf stat -t 11904,11905 --duration 10# Start a child process running `ls`, and stat it. $simpleperf stat ls

    決定監視多長時間

    當監視已有線程時,我們可以使用 --duration 選項決定監視多長時間。當監視執行一個新命令的子進程時,simpleperf 將一直監視子進程直至其結束。在這種情況下,我們可以使用 Ctrl-C 在任何時間停止監視。例子如下。

    # Stat process 11904 for 10 seconds. $simpleperf stat -p 11904 --duration 10# Stat until the child process running `ls` finishes. $simpleperf stat ls# Stop monitoring using Ctrl-C. $simpleperf stat -p 11904 --duration 10 ^C

    決定打印的間隔

    當監視 perf 計數器時,我們還可以使用 --interval 選項決定打印的間隔。例子如下。

    # Print stat for process 11904 every 300ms. $simpleperf stat -p 11904 --duration 10 --interval 300# Print system wide stat at interval of 300ms for 10 seconds (rooted device only). # system wide profiling needs root privilege $su 0 simpleperf stat -a --duration 10 --interval 300

    在 systrace 中顯示計數器

    simpleperf 還可以與systrace一起工作來將計數器轉儲進收集的trace中。下面是一個執行系統范圍的 stat 的例子。

    # capture instructions (kernel only) and cache misses with interval of 300 milliseconds for 15 seconds $su 0 simpleperf stat -e instructions:k,cache-misses -a --interval 300 --duration 15 # on host launch systrace to collect trace for 10 seconds (HOST)$external/chromium-trace/systrace.py --time=10 -o new.html sched gfx view # open the collected new.html in browser and perf counters will be shown up

    simpleperf record

    simpleperf record用于轉儲被剖析程序的記錄。通過傳入選項,我們可以選擇使用哪個事件,監視哪個進程/線程,以什么頻率轉儲記錄,監視多長時間,以及將記錄存儲到哪里。

    # Record on process 7394 for 10 seconds, using default event (cpu-cycles), # using default sample frequency (4000 samples per second), writing records # to perf.data. $simpleperf record -p 7394 --duration 10 simpleperf I 07-11 21:44:11 17522 17522 cmd_record.cpp:316] Samples recorded: 21430. Samples lost: 0.

    選擇事件

    在大多數情況下,cpu-cycles 事件被用于評估消耗的CPU時間。作為一個硬件事件,它精確而高效。我們還可以通過 -e 選項使用其它事件。下面是一個例子。

    # Record using event instructions. $simpleperf record -e instructions -p 11904 --duration 10

    選擇監視目標

    record命令中選擇目標的方式與 stat 命令中的類似。例子如下。

    # Record process 11904 and 11905. $simpleperf record -p 11904,11905 --duration 10# Record thread 11904 and 11905. $simpleperf record -t 11904,11905 --duration 10# Record a child process running `ls`. $simpleperf record ls

    設置記錄的頻率

    我們可以通過 -f 或 -c 選項設置轉儲記錄的頻率。比如,-f 4000 意味著當監視的線程運行時每秒轉儲接近 4000 個記錄。如果監視的線程一秒鐘運行了 0.2 s(其它時間它可能被搶占或阻塞),simpleperf 每秒轉儲大約 4000 * 0.2 / 1.0 = 800 個記錄。另一種方式是使用 -c 選項。比如,-c 10000 意味著每發生 10000 次事件轉儲一個記錄。例子如下。

    # Record with sample frequency 1000: sample 1000 times every second running. $simpleperf record -f 1000 -p 11904,11905 --duration 10# Record with sample period 100000: sample 1 time every 100000 events. $simpleperf record -c 100000 -t 11904,11905 --duration 10

    決定監視多長時間

    record 命令中決定監視多長時間的方式與 stat 命令中的類似。例子如下。

    # Record process 11904 for 10 seconds. $simpleperf record -p 11904 --duration 10# Record until the child process running `ls` finishes. $simpleperf record ls# Stop monitoring using Ctrl-C. $simpleperf record -p 11904 --duration 10 ^C

    設置存儲記錄的路徑

    默認情況下,simpleperf 將記錄保存至當前文件夾下的 perf.data 文件中。我們可以使用 -o 選項設置存儲記錄的路徑。下面是一個例子。

    # Write records to data/perf2.data. $simpleperf record -p 11904 -o data/perf2.data --duration 10

    simpleperf report

    simpleperf report 被用來基于 simpleperf record 命令生成的 perf.data 產生報告。Report 命令將記錄分組為不同的樣本項,基于每個樣本項包含的事件的多少對樣本項排序,并打印每個樣本項。通過傳入選項,我們可以選擇到哪里尋找被監視的程序使用的 perf.data 和 可執行二進制文件,過濾不感興趣的記錄,并決定如何分組記錄。

    下面是一個例子。記錄被分為 4 個樣本項,每項一行。有一些列,每列展示了屬于一個樣本項的信息片段。第一列是 Overhead,它展示了當前樣本項中的事件占總事件的百分比。由于 perf 事件是 cpu-cycles,overhead 可被視為是每個函數占用的 cpu 的百分比。

    # Reports perf.data, using only records sampled in libsudo-game-jni.so, # grouping records using thread name(comm), process id(pid), thread id(tid), # function name(symbol), and showing sample count for each row. $simpleperf report --dsos /data/app/com.example.sudogame-2/lib/arm64/libsudo-game-jni.so --sort comm,pid,tid,symbol -n Cmdline: /data/data/com.example.sudogame/simpleperf record -p 7394 --duration 10 Arch: arm64 Event: cpu-cycles (type 0, config 0) Samples: 28235 Event count: 546356211Overhead Sample Command Pid Tid Symbol 59.25% 16680 sudogame 7394 7394 checkValid(Board const&, int, int) 20.42% 5620 sudogame 7394 7394 canFindSolution_r(Board&, int, int) 13.82% 4088 sudogame 7394 7394 randomBlock_r(Board&, int, int, int, int, int) 6.24% 1756 sudogame 7394 7394 @plt

    設置存儲記錄的路徑

    默認情況下,simpleperf 讀取當前目錄下的 perf.data。我們可以使用 -i 選項選擇從另一個文件讀取記錄。

    $simpleperf report -i data/perf2.data

    設置查找可執行二進制文件的路徑

    如果要生成函數符號報告,simpleperf 需要讀取被監視的進程使用的可執行二進制文件來獲取符號表和調試信息。默認情況下,路徑是記錄時被監視的進程使用的可執行二進制文件,然而,在生成報告時這些二進制文件可能不存在,或不包含符號表和調試信息。因此我們可以使用 --symfs 來重定向路徑。下面是一個例子。

    $simpleperf report # In this case, when simpleperf wants to read executable binary /A/b, # it reads file in /A/b.$simpleperf report --symfs /debug_dir # In this case, when simpleperf wants to read executable binary /A/b, # it prefers file in /debug_dir/A/b to file in /A/b.

    過濾記錄

    當生成報告時,可能不是對所有記錄都感興趣。Simpleperf 支持五鐘過濾器來選擇感興趣的記錄。下面是例子。

    # Report records in threads having name sudogame. $simpleperf report --comms sudogame# Report records in process 7394 or 7395 $simpleperf report --pids 7394,7395# Report records in thread 7394 or 7395. $simpleperf report --tids 7394,7395# Report records in libsudo-game-jni.so. $simpleperf report --dsos /data/app/com.example.sudogame-2/lib/arm64/libsudo-game-jni.so# Report records in function checkValid or canFindSolution_r. $simpleperf report --symbols "checkValid(Board const&, int, int);canFindSolution_r(Board&, int, int)"

    決定如何將記錄分組為樣本項

    Simpleperf 使用 --sort 選項決定如何分組樣本項。下面是例子。

    # Group records based on their process id: records having the same process # id are in the same sample entry. $simpleperf report --sort pid# Group records based on their thread id and thread comm: records having # the same thread id and thread name are in the same sample entry. $simpleperf report --sort tid,comm# Group records based on their binary and function: records in the same # binary and function are in the same sample entry. $simpleperf report --sort dso,symbol# Default option: --sort comm,pid,tid,dso,symbol. Group records in the same # thread, and belong to the same function in the same binary. $simpleperf report

    simpleperf 的特性

    Simpleperf 的工作方式與 linux-tools-perf 類似,但它有如下的提升:

  • Aware of Android environment. Simpleperf 在剖析時處理一些Android特有的情形。例如,它可以剖析 apk 中嵌入的共享庫,從 .gnu_debugdata 段讀取符號表和調試信息。如果可能,當出現錯誤時它會給出一些提示,如如何禁用perf_harden啟用分析。
  • 記錄時支持展開。如果我們想使用 -g 選項來記錄并報告一個程序的調用圖,我們需要轉儲每個記錄中的用戶棧和寄存器集合,然后展開棧來查找調用鏈。Simpleperf 支持在記錄時展開,因此它無需在 perf.data 中存儲用戶棧。因而我們可以在設備上有限的空間內剖析更長的時間。
  • 支持腳本使Android上的剖析更方便。
  • 編譯進靜態的二進制文件。Simpleperf 是一個靜態庫,因此它無需支持運行共享庫。這意味著對于 simpleperf 可以運行的的 Android 版本沒有限制,盡管有些設備不支持剖析。
  • ndk中的Simpleperf工具

    ndk 中的 simpleperf 工具包含三個部分:在 Android 設備上運行的 simpleperf 可執行文件,在主機上運行的 simpleperf 可執行文件,和 python 腳本。

    設備上的 simpleperf

    在設備上運行的 simpleperf 位于 bin/android 目錄下。它包含不同體系架構的 Android 上運行的靜態二進制文件。它們可被用于剖析運行在設備上的進程,并生成 perf.data。

    主機上的 simpleperf

    運行與主機上的 Simpleperfs 位于bin/darwin,bin/linux 和 bin/windows。它們可被用于在主機上解析 perf.data。

    腳本

    腳本被用于使得剖析和解析剖析結果更方便。app_profiler.py 被用于剖析一個 android 應用程序。它準備剖析環境,下載 simpleperf 到設備上,在主機上生成并拉出 perf.data。它由 app_profiler.config 配置。binary_cache_builder.py 被用于從設備拉出本地層二進制文件到主機上。它由 app_profiler.py 使用。annotate.py 被用于使用 perf.data 注解源文件。它由 annotate.config 配置。report.py 在一個 GUI 窗口中報告 perf.data。simpleperf_report_lib.py 被用于枚舉 perf.data 中的樣本。在內部它使用 libsimpleperf_report.so 來解析 perf.data。它可被用于將 perf.data 中的樣本翻譯為其它形式。使用 simpleperf_report_lib.py 的一個例子是 report_sample.py。

    使用 simpleperf 工具的例子

    這個部分展示了如何使用 simpleperf 工具來剖析一個 Android 應用。

    準備一個可調試(debuggable)的應用

    應用程序的包名是 com.example.sudogame。它包含 java 代碼和 c++ 代碼。我們需要運行一份在其 AndroidManifest.xml 元素中 android:debuggable=”true” 的app,因為我們不能為 non-debuggable apps 使用 run-as。應用應該已經安裝在設備上了,而且我們可以通過 adb 連接設備。

    使用命令行剖析

    為了記錄剖析數據,我們需要下載 simpleperf 和包含調試信息的本地庫到設備上,運行 simpleperf 產生剖析數據:perf.data,并運行 simpleperf 為 perf.data 生成報告。步驟如下。

    1. Enable profiling

    $adb shell setprop security.perf_harden 0

    2. 尋找運行 app 的進程

    在 app 的上下文運行 ps。在 >=O 的設備上,用 ps -e 來替代。

    $adb shell angler:/ $ run-as com.example.sudogame angler:/data/data/com.example.sudogame $ ps u0_a93 10324 570 1030480 58104 SyS_epoll_ 00f41b7528 S com.example.sudogame u0_a93 10447 10441 7716 1588 sigsuspend 753c515d34 S sh u0_a93 10453 10447 9112 1644 0 7ba07ff664 R ps

    因此是進程 10324 運行app。

    3. 將 simpleperf 下載到 app 的 data 目錄

    首先我們需要找出 app 使用的是哪個體系架構。有許多中方式,這里我們只檢查進程的映射。

    angler:/data/data/com.example.sudogame $cat /proc/10324/maps | grep boot.art 70f34000-7144e000 r--p 00000000 fd:00 1082 /system/framework/arm/boot.oat

    路徑顯示是它是 arm。因此我們將 simpleperf 下載到設備上的 arm 目錄下。

    $adb push bin/android/arm/simpleperf /data/local/tmp $adb shell angler:/ $ run-as com.example.sudogame angler:/data/data/com.example.sudogame $ cp /data/local/tmp/simpleperf .

    4. 記錄 perf.data

    angler:/data/data/com.example.sudogame $./simpleperf record -p 10324 --duration 30 simpleperf I 01-01 09:26:39 10598 10598 cmd_record.cpp:341] Samples recorded: 49471. Samples lost: 0. angler:/data/data/com.example.sudogame $ls -lh perf.data -rw-rw-rw- 1 u0_a93 u0_a93 2.6M 2017-01-01 09:26 perf.data

    在記錄時不要忘記運行 app。否則,我們可能無法獲得樣本,由于進程仍在休眠。

    5. 為 perf.data 生成報告

    有不同的方式來為 perf.data 生成報告。下面展示了一些例子。

    報告不同線程中的樣本。

    angler:/data/data/com.example.sudogame $./simpleperf report --sort pid,tid,comm Cmdline: /data/data/com.example.sudogame/simpleperf record -p 10324 --duration 30 Arch: arm64 Event: cpu-cycles (type 0, config 0) Samples: 49471 Event count: 16700769019Overhead Pid Tid Command 66.31% 10324 10324 xample.sudogame 30.97% 10324 10340 RenderThread ...

    報告主線程中不同二進制文件中的樣本。

    angler:/data/data/com.example.sudogame $./simpleperf report --tids 10324 --sort dso -n ... Overhead Sample Shared Object 37.71% 9970 /system/lib/libc.so 35.45% 9786 [kernel.kallsyms] 8.71% 3305 /system/lib/libart.so 6.44% 2405 /system/framework/arm/boot-framework.oat 5.64% 1480 /system/lib/libcutils.so 1.55% 426 /data/app/com.example.sudogame-1/lib/arm/libsudo-game-jni.so ...

    報告主線程中 libsudo-game-jni.so 中的不同函數的采樣。

    angler:/data/data/com.example.sudogame $./simpleperf report --tids 10324 --dsos /data/app/com.example.sudogame-1/lib/arm/libsudo-game-jni.so --sort symbol -n ... Overhead Sample Symbol 8.94% 35 libsudo-game-jni.so[+1d54] 5.71% 25 libsudo-game-jni.so[+1dae] 5.70% 23 @plt 5.09% 22 libsudo-game-jni.so[+1d88] 4.54% 19 libsudo-game-jni.so[+1d82] 3.61% 14 libsudo-game-jni.so[+1f3c] ...

    在上面的結果中,大多數符號是 二進制文件名[+virual_addr] 的形式呈現。那是由于設備上使用的 libsudo-game-jni.so 已經拋離了 .symbol 段。我們可以將帶有調試信息的 libsudo-game-jni.so 下載到設備上。在 android studio工程中,它位于 app/build/intermediates/binaries/debug/arm/obj/armeabi-v7a/libsudo-game-jni.so。我們不得不下載 libsudo-game-jni.so 到與 perf.data 中記錄的相同的相對路徑(否則,simpleperf無法找到它)。在這個例子中,是/data/app/com.example.sudogame-1/lib/arm/libsudo-game-jni.so。

    為包含了調試信息的庫使用的符號生成報告。

    $adb push app/build/intermediates/binaries/debug/arm/obj/armeabi-v7a/libsudo-game-jni.so /data/local/tmp $adb shell angler:/ $ run-as com.example.sudogame angler:/data/data/com.example.sudogame $ mkdir -p data/app/com.example.sudogame-1/lib/arm angler:/data/data/com.example.sudogame $cp /data/local/tmp/libsudo-game-jni.so data/app/com.example.sudogame-1/lib/arm angler:/data/data/com.example.sudogame $./simpleperf report --tids 10324 --dsos /data/app/com.example.sudogame-1/lib/arm/libsudo-game-jni.so --sort symbol -n --symfs . ... Overhead Sample Symbol 75.18% 317 checkValid(Board const&, int, int) 14.43% 60 canFindSolution_r(Board&, int, int) 5.70% 23 @plt 3.51% 20 randomBlock_r(Board&, int, int, int, int, int) ...

    報告一個函數中的采樣。

    angler:/data/data/com.example.sudogame $./simpleperf report --tids 10324 --dsos /data/app/com.example.sudogame-1/lib/arm/libsudo-game-jni.so --symbols “checkValid(Board const&, int, int)” --sort vaddr_in_file -n --symfs . ... Overhead Sample VaddrInFile 11.89% 35 0x1d54 7.59% 25 0x1dae 6.77% 22 0x1d88 6.03% 19 0x1d82 ...

    6. 記錄并報告調用圖

    調用圖是顯示了函數調用關系的樹。下面是一個例子。

    main() {FunctionOne();FunctionTwo(); } FunctionOne() {FunctionTwo();FunctionThree(); } callgraph:main-> FunctionOne| || |-> FunctionTwo| |-> FunctionThree||-> FunctionTwo

    基于調用圖記錄 dwarf

    為了生成調用圖,simpleperf 需要為每個記錄生成調用鏈。Simpleperf 需要內核為每個記錄轉儲用戶棧和用戶寄存器集,然后它追蹤用戶棧來查找函數調用鏈。為了解析調用鏈,它需要 dwarf 調用幀信息的支持,這些通常位于二進制文件的 .eh_frame 或 .debug_frame段。因此我們需要使用 --symfs 指出帶有調試信息的 libsudo-game-jni.so 位于哪里。

    angler:/data/data/com.example.sudogame $./simpleperf record -p 10324 -g --symfs . --duration 30 simpleperf I 01-01 09:59:42 11021 11021 cmd_record.cpp:341] Samples recorded: 60700. Samples lost: 1240.

    注意內核無法轉儲 >= 64K 的用戶棧,因此基于調用圖的 dwarf 不要包含消耗了 >= 64K 棧的調用鏈。此外,由于我們需要轉儲每個記錄的棧,則可能丟失一些記錄。通常,失去一些記錄沒關系。

    基于調用圖記錄棧幀

    另外一種生成調用圖的方式依賴內核為每個記錄解析調用鏈。為了使它成為可能,內核需要能夠識別每個函數調用的棧幀。這不總是可能的,因為編譯器可能優化掉棧幀,或內核無法識別使用的棧幀風格。因此它如何工作視情況而定(它在 arm64 上工作的很好,但在 arm 上不行)。

    angler:/data/data/com.example.sudogame $./simpleperf record -p 10324 --call-graph fp --symfs . --duration 30 simpleperf I 01-01 10:03:58 11267 11267 cmd_record.cpp:341] Samples recorded: 56736. Samples lost: 0.

    報告調用圖

    報告累積的周期。在下面的表中,第一列是 “Children”,它是函數及那個函數調用的函數所占的cpu 周期百分比。第二列是 “Self”,它只是一個函數的cpu 周期百分比。比如,checkValid() 自身消耗 1.28% 的 cpus,但通過運行它自身及調用其它函數,它消耗了 29.43%。

    angler:/data/data/com.example.sudogame $./simpleperf report --children --symfs . ... Children Self Command Pid Tid Shared Object Symbol 31.94% 0.00% xample.sudogame 10324 10324 [kernel.kallsyms] [kernel.kallsyms][+ffffffc000204268] 31.10% 0.92% xample.sudogame 10324 10324 /system/lib/libc.so writev 29.43% 1.28% xample.sudogame 10324 10324 /data/app/com.example.sudogame-1/lib/arm/libsudo-game-jni.so checkValid(Board const&, int, int) 28.43% 0.34% xample.sudogame 10324 10324 /system/lib/liblog.so __android_log_print 28.24% 0.00% xample.sudogame 10324 10324 /system/lib/libcutils.so libcutils.so[+107b7] 28.10% 0.27% xample.sudogame 10324 10324 /data/app/com.example.sudogame-1/lib/arm/libsudo-game-jni.so canFindSolution_r(Board&, int, int) ...

    報告調用圖。

    angler:/data/data/com.example.sudogame $./simpleperf report -g --symfs . >report angler:/data/data/com.example.sudogame $exit angler:/ $cp /data/data/com.example.sudogame/report /data/local/tmp angler:/ $exit $adb pull /data/local/tmp/report . $cat report ... 29.43% 1.28% xample.sudogame 10324 10324 /data/app/com.example.sudogame-1/lib/arm/libsudo-game-jni.so checkValid(Board const&, int, int)|-- checkValid(Board const&, int, int)||--95.50%-- __android_log_print| |--0.68%-- [hit in function]| || |--51.84%-- __android_log_buf_write| | |--2.07%-- [hit in function]| | || | |--30.74%-- libcutils.so[+c69d] ...

    以 callee 模式報告調用圖。我們還可以展示一個函數是如何被其它函數調用的。

    angler:/data/data/com.example.sudogame $./simpleperf report -g callee --symfs . >report $adb shell run-as com.example.sudogame cat report >report $cat report … 28.43% 0.34% xample.sudogame 10324 10324 /system/lib/liblog.so __android_log_print|-- __android_log_print||--97.82%-- checkValid(Board const&, int, int)| |--0.13%-- [hit in function]| || |--94.89%-- canFindSolution_r(Board&, int, int)| | |--0.01%-- [hit in function]| | | ...

    剖析 Java 代碼

    Simpleperf 只支持剖析 ELF 格式二進制文件中的本地指令。如果 java 代碼由解釋器執行,或使用 jit 緩存,則它不能由 simpleperf 剖析。由于 Android 支持提前編譯,它可以將 java 字節碼編譯為包含調試信息的本地層指令。在 Android 版本 <= M 的設備上,我們需要 root 權限來編譯包含調試信息的 java 字節碼。然而,在 Android 版本 >= N 的設備上,我們無需 root 權限就可以做這些。

    在Android N上

    1. 將 java 代碼完整編譯為本地層指令。

    $adb shell setprop debug.generate-debug-info true $adb shell cmd package compile -f -m speed com.example.sudogame // restart the app to take effect

    2. 記錄 perf.data

    angler:/data/data/com.example.sudogame $./simpleperf record -p 11826 -g --symfs . --duration 30 simpleperf I 01-01 10:31:40 11859 11859 cmd_record.cpp:341] Samples recorded: 50576. Samples lost: 2139.

    3. 為 perf.data 生成報告

    angler:/data/data/com.example.sudogame $./simpleperf report -g --symfs . >report angler:/data/data/com.example.sudogame $exit angler:/ $cp /data/data/com.example.sudogame/report /data/local/tmp angler:/ $exit $adb pull /data/local/tmp/report . $cat report ... 21.14% 0.00% xample.sudogame 11826 11826 /data/app/com.example.sudogame-1/oat/arm/base.odex boolean com.example.sudogame.MainActivity.onOptionsItemSelected(android.view.MenuItem)|-- boolean com.example.sudogame.MainActivity.onOptionsItemSelected(android.view.MenuItem)|--99.99%-- void com.example.sudogame.GameView.startNewGame()|--0.01%-- [hit in function]||--99.87%-- void com.example.sudogame.GameModel.reInit()| |--0.01%-- [hit in function]| || |--89.65%-- boolean com.example.sudogame.GameModel.canFindSolution(int[][])| | || | |--99.95%-- Java_com_example_sudogame_GameModel_canFindSolution| | | || | | |--99.49%-- canFindSolution(Board&)| | | | |--0.01%-- [hit in function]| | | | || | | | |--99.97%-- canFindSolution_r(Board&, int, int)| | | | | canFindSolution_r(Board&, int, int) ...

    在 Android M上

    在 M 設備上,我們需要 root 權限來強制 Android 將 java 代碼完全編譯為帶調試信息的 ELF 二進制文件中的本地層指令。我們還需要 root 權限來讀取編譯后的本地層二進制文件(由于 installd 將它們寫到了一個 uid/gid 是 system:install的目錄下)。因而剖析 java 代碼只能在 root 了的設備上完成。

    $adb root $adb shell setprop dalvik.vm.dex2oat-flags -g# Reinstall the app. $adb install -r app-debug.apk# Change to the app’s data directory. $ adb root && adb shell device# cd `run-as com.example.sudogame pwd`# Record as root as simpleperf needs to read the generated native binary. device#./simpleperf record -p 25636 -g --symfs . -f 1000 --duration 30 simpleperf I 01-02 07:18:20 27182 27182 cmd_record.cpp:323] Samples recorded: 23552. Samples lost: 39.

    在 Android L上

    在 L 設備上,我們也需要 root 權限來編譯帶調試信息的 app 并訪問本地層二進制文件。

    $adb root $adb shell setprop dalvik.vm.dex2oat-flags --include-debug-symbols# Reinstall the app. $adb install -r app-debug.apk

    使用腳本剖析

    盡管使用命令行很靈活,但它可能太復雜了。因而我們提供了 pthon 腳本來幫助運行命令。

    使用 app_profiler.py 記錄

    app_profiler.py 用于剖析 Android 應用程序。它設置剖析環境,下載 simpleperf 和帶有調試信息的本地層庫,運行 simpleperf 產生 perf.data,并從設備上將 perf.data 和二進制文件拉到主機上。它由 app_profiler.config 配置。下面是一個例子。

    app_profiler.config:

    app_package_name = “com.example.sudogame” android_studio_project_dir = “/AndroidStudioProjects/SudoGame” # absolute path of the project ... record_options = "-e cpu-cycles:u -f 4000 -g --dump-symbols --duration 30" ...

    運行 app_profiler.py:

    $python app_profiler.py ... INFO:root:profiling is finished.

    它將生成的 perf.data 拉到主機上,并從設備的 binary_cache 中收集二進制文件。

    使用 report.py 生成報告

    $python report.py -g

    它生成一個GUI接口來報告數據。

    使用 simpleperf_report_lib.py 處理樣本

    simpleperf_report_lib.py 提供了一個接口從 perf.data 讀取樣本。一個例子是 report_sample.py。

    展示流程圖

    $python report_sample.py >out.perf $stackcollapse-perf.pl out.perf >out.folded $./flamegraph.pl out.folded >a.svg

    注解源代碼

    annotate.py 讀取 perf.data 和 binary_cache 下的二進制文件。然后它知道每個樣本命中哪個 源文件:line。因此它可以注解源代碼。annotate.py 由 annotate.config 配置。下面是一個例子。

    annotate.config:

    ... source_dirs = [“/AndroidStudio/SudoGame”] # It is a directory containing source code. ...

    運行 annotate.py:

    $python annotate.py

    它生成 annotated_files 目錄。 annotated_files/summary 文件包含每個源文件的概要信息。例子如下。

    /AndroidStudioProjects/SudoGame/app/src/main/jni/sudo-game-jni.cpp: accumulated_period: 25.587937%, period: 1.250961%function (checkValid(Board const&, int, int)): line 99, accumulated_period: 23.564356%, period: 0.908457%function (canFindSolution_r(Board&, int, int)): line 135, accumulated_period: 22.260125%, period: 0.142359%function (canFindSolution(Board&)): line 166, accumulated_period: 22.233101%, period: 0.000000%function (Java_com_example_sudogame_GameModel_canFindSolution): line 470, accumulated_period: 21.983184%, period: 0.000000%function (Java_com_example_sudogame_GameModel_initRandomBoard): line 430, accumulated_period: 2.226896%, period: 0.000000%line 27: accumulated_period: 0.011729%, period: 0.000000%line 32: accumulated_period: 0.004362%, period: 0.000000%line 33: accumulated_period: 0.004427%, period: 0.000000%line 36: accumulated_period: 0.003303%, period: 0.000000%line 39: accumulated_period: 0.010367%, period: 0.004123%line 41: accumulated_period: 0.162219%, period: 0.000000%

    annotated_files/ 還包含由 annotate.py 找到的經過注解的源文件。比如, libsudo-game-jni.cpp 中的 checkValid() 函數的一部分注解后如下。

    /* [func] acc_p: 23.564356%, p: 0.908457% */static bool checkValid(const Board& board, int curR, int curC) { /* acc_p: 0.037933%, p: 0.037933% */ int digit = board.digits[curR][curC]; /* acc_p: 0.162355%, p: 0.162355% */ for (int r = 0; r < BOARD_ROWS; ++r) { /* acc_p: 0.020880%, p: 0.020880% */ if (r == curR) { /* acc_p: 0.034691%, p: 0.034691% */ continue;} /* acc_p: 0.176490%, p: 0.176490% */ if (board.digits[r][curC] == digit) { /* acc_p: 14.957673%, p: 0.059022% */ LOGI("conflict (%d, %d) (%d, %d)", curR, curC, r, curC); /* acc_p: 0.016296%, p: 0.016296% */ return false;}}

    原文地址

    總結

    以上是生活随笔為你收集整理的Simpleperf介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    天天操夜夜摸 | 国产精品成人久久久久久久 | 日本不卡一区二区三区在线观看 | 久久国产精品久久国产精品 | 国产精品久久久久久麻豆一区 | 日韩二区三区 | 久保带人 | 色在线免费视频 | 久久99热精品这里久久精品 | 国产亚洲精品成人av久久影院 | 99久久精品免费看国产四区 | 在线观看小视频 | 91女神的呻吟细腰翘臀美女 | 国产视频97 | 最新av免费 | 免费在线观看a v | 天天综合成人 | 久久久久免费精品国产小说色大师 | 亚洲最新视频在线播放 | 香蕉视频网站在线观看 | 五月婷婷在线观看视频 | 日韩亚洲欧美中文字幕 | 国产区欧美 | 午夜av片 | 四虎最新域名 | 国产精品久久久毛片 | 国产999视频 | 五月天天av | 日韩电影一区二区三区在线观看 | 国产亚洲视频在线观看 | 808电影免费观看三年 | 日韩欧美视频免费在线观看 | 亚洲人成综合 | 成人国产电影在线观看 | 国内精品久久久久影院男同志 | 色综合天天狠天天透天天伊人 | 国产中文| 天天激情站 | 免费看黄在线观看 | 久久久亚洲电影 | 美女免费视频一区 | 国产精品www| 97碰碰碰 | 国产美女精品人人做人人爽 | 天天拍天天草 | 亚洲精品大片www | 国产成a人亚洲精v品在线观看 | 国产在线91在线电影 | 国产精品久久久久久久久久了 | 久久久免费网站 | 中文字幕免费高清在线 | 国产传媒中文字幕 | 99精品久久久久 | 久久久久久久99精品免费观看 | 欧美一级特黄高清视频 | 国产精品a久久久久 | 又湿又紧又大又爽a视频国产 | 亚洲欧美视频在线观看 | 国产精品毛片久久蜜 | 日韩精品视频在线免费观看 | 国产成人在线观看免费 | 亚洲精品影院在线观看 | 欧美 亚洲 另类 激情 另类 | 中文字幕在线视频一区二区三区 | 亚洲小视频在线观看 | 亚洲天天看 | 欧美激情片在线观看 | 日韩久久片 | 亚洲免费在线观看视频 | 日韩精品一区二区在线观看 | 久久天天躁狠狠躁夜夜不卡公司 | 欧美日韩三级在线观看 | 久久99久久99精品免观看粉嫩 | 夜夜夜精品| 国产精品99久久久久久宅男 | 免费一级片在线 | 手机色在线 | 欧美日韩精品在线 | 精品一区在线看 | 一区精品在线 | 国产精品九九九九九 | 中文字幕一区在线观看视频 | 欧美激情综合色综合啪啪五月 | 字幕网av | 婷婷成人综合 | 国产成本人视频在线观看 | 中文字幕中文字幕在线中文字幕三区 | 天天草天天干天天 | 日韩三级视频 | 久久国产精品第一页 | 成人一级免费电影 | www.久久色.com| 亚洲成成品网站 | 久久伊人八月婷婷综合激情 | 国产精品国产三级国产aⅴ无密码 | 精品福利在线观看 | 国产精品第二十页 | 国产免费观看视频 | 久草青青在线观看 | 在线a人片免费观看视频 | 亚洲国产网站 | 久久久久亚洲最大xxxx | av大片网站 | 国产精品理论在线观看 | 高清不卡一区二区三区 | 操久久网| 久久综合国产伦精品免费 | 日本aaaa级毛片在线看 | 色婷婷久久 | 国产视频精品免费播放 | 在线小视频国产 | 伊人天天综合 | 天天草天天干天天射 | 91大神dom调教在线观看 | 精品久久综合 | 一区二区三区在线观看免费视频 | 美女黄视频免费看 | 亚洲一区二区观看 | 亚洲精品乱码久久久久久按摩 | av资源在线看 | 97免费| 国产午夜一级毛片 | 一区二区三区久久精品 | 亚洲精品成人 | 中文超碰字幕 | 黄色性av | 亚洲片在线观看 | 国产免费又黄又爽 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 丁香婷婷激情五月 | 天天操福利视频 | 成全免费观看视频 | 国产精品久久久久久模特 | 天天射综合网视频 | 日本二区三区在线 | 国产精品资源在线 | h网站免费在线观看 | 日日干夜夜爱 | 久草视频首页 | 精品国产区在线 | 激情视频综合网 | 久久成熟 | 一级免费片 | 亚洲精品一区二区三区高潮 | 亚洲国内精品 | 亚洲精品一区二区网址 | 天天操福利视频 | 久久99网 | av免费网站 | 男女激情麻豆 | 国产亚洲免费的视频看 | 久久久免费精品视频 | 欧美 日韩 国产 成人 在线 | 97超碰色 | 久久爱www.| 久久99久久精品 | 日本一区二区免费在线观看 | 91在线中文字幕 | 色婷婷在线视频 | 91免费观看国产 | 久久久蜜桃一区二区 | 久久国产视频网 | 国产999免费视频 | 欧美激情第八页 | 2019中文在线观看 | 最近中文字幕国语免费高清6 | www.婷婷色| 成人av在线播放网站 | av在线亚洲天堂 | 又黄又刺激的视频 | 久99久中文字幕在线 | 亚洲精品视频免费在线 | 黄色免费观看 | av无限看 | 久久国产精品二国产精品中国洋人 | 欧美色图视频一区 | 在线观看中文字幕一区二区 | 丁香导航 | av.com在线 | 精品视频在线免费观看 | 国产91精品一区二区 | 亚洲精品黄| 欧美一区二区免费在线观看 | 在线 视频 一区二区 | 激情影院在线观看 | 最近中文字幕高清字幕在线视频 | 在线观看国产一区二区 | 日本中文一区二区 | 中文字幕刺激在线 | av一级一片 | www最近高清中文国语在线观看 | av在线播放一区二区三区 | 欧美一级久久久久 | 毛片永久新网址首页 | 探花视频在线观看 | 亚洲色图色| 久久免费的视频 | 美女免费网视频 | 久久精品久久精品 | 激情图片久久 | sm免费xx网站 | 欧美日韩中文国产 | 精品国偷自产在线 | 在线观看av片 | 91视频a| 成人av免费在线播放 | 四虎在线免费观看 | 久久久久女人精品毛片 | 中文字幕日韩在线播放 | 中文字幕在线观看免费高清完整版 | 亚洲播播| 婷婷六月网 | 久久精品视频2 | www免费黄色 | 日韩在线高清视频 | 欧美日韩国产精品一区二区三区 | 亚洲污视频 | 婷婷福利影院 | 免费三级av | 91精品久久久久久久91蜜桃 | 久久激情婷婷 | 中文字幕在线观看视频一区 | 欧美日本三级 | 国产精品黑丝在线观看 | 久久艹艹| 国产日韩精品一区二区在线观看播放 | 黄色网址国产 | 国产91精品看黄网站在线观看动漫 | 久久综合久久久久88 | av网站免费看 | 色综合久久中文综合久久牛 | av千婊在线免费观看 | 在线观看91av | 欧美午夜性生活 | 视频在线精品 | 久久久午夜精品福利内容 | 午夜在线免费视频 | 伊人永久在线 | 亚洲天堂网在线视频观看 | 日日干综合 | 亚洲国产成人精品在线 | 丰满少妇对白在线偷拍 | 69视频永久免费观看 | 亚洲精品伦理在线 | 在线成人免费电影 | 国产专区精品 | 成人在线一区二区三区 | 男女激情免费网站 | 欧美日韩视频精品 | 日日夜夜噜噜噜 | 国产高清在线永久 | 国产精品久久久久久久午夜 | 国产一区二区在线观看免费 | 久久精品99国产精品亚洲最刺激 | 91在线观看视频 | 国产日韩欧美在线看 | 丁香婷婷基地 | 一级淫片在线观看 | 欧美夫妻性生活电影 | 99久久久国产精品 | 免费看污污视频的网站 | 片网址| 日韩a在线看 | 国产视频99 | 国产一区二区三区在线 | 亚洲我射av | 福利视频导航网址 | 日韩综合色 | 九热在线 | 亚洲免费观看在线视频 | 欧美精品久久久久 | 免费亚洲一区二区 | 97在线精品国自产拍中文 | 中文国产成人精品久久一 | 欧美伦理一区二区 | 在线观看视频国产一区 | 国产精品久久久久久久av大片 | 国产淫片| 91av资源网 | 中文字幕第一页在线播放 | 亚欧日韩成人h片 | 综合在线亚洲 | 亚洲女人天堂成人av在线 | 久草在线视频免赞 | 欧美大码xxxx | 四虎在线观看 | 久久国产精品久久久 | 一区二区三区中文字幕在线观看 | 天天干夜夜夜 | 911精品视频 | www.久久色 | 久久精品导航 | 久久国内精品视频 | 久久久久 免费视频 | 日韩精品不卡在线观看 | 久久免费视频6 | 国色天香永久免费 | 一级成人在线 | 日韩av二区| 500部大龄熟乱视频使用方法 | 综合在线观看色 | 亚洲经典中文字幕 | 久久国产色 | 久久免费国产精品1 | 久久人人爽视频 | 免费h漫在线观看 | 99热最新| 亚洲黄色在线观看 | 人人插人人看 | 操操操夜夜操 | 亚洲专区视频在线观看 | 在线视频在线观看 | 一区二区精品视频 | 天天插天天狠天天透 | 欧美日韩二区三区 | 在线观看成人av | 狠狠干在线 | 探花国产在线 | 欧美午夜性 | 成人动漫一区二区 | 欧美精品少妇xxxxx喷水 | 色永久免费视频 | 一区二区精品视频 | 国产免费亚洲高清 | 人人澡av | 国产视频一区在线 | 欧美日韩在线电影 | 日韩三级视频在线看 | 日韩区视频 | 在线免费观看成人 | 成年人在线视频观看 | 激情婷婷在线观看 | 美女久久久久久久久久 | 日韩一级网站 | 日韩av偷拍 | 成人禁用看黄a在线 | 成人免费观看在线视频 | 日本韩国中文字幕 | 久久久www免费电影网 | 99久久综合精品五月天 | 亚洲国产wwwccc36天堂 | 欧美日韩1区 | a午夜电影 | 久草在线视频在线观看 | 欧美激情精品久久久 | 国产精品久久久久一区 | www色av| 人人射av | 国产又黄又爽无遮挡 | 精品a在线 | 91热视频在线观看 | 一区二区欧美激情 | 免费观看mv大片高清 | 国产美腿白丝袜足在线av | 婷婷综合导航 | 日本在线视频一区二区三区 | 国产在线观看不卡 | 亚洲精品一区二区18漫画 | 99在线免费观看视频 | 高清国产午夜精品久久久久久 | 色综合久久久久综合 | 女人18毛片a级毛片一区二区 | 日韩国产精品久久久久久亚洲 | 婷久久 | 日日草天天草 | 久久久久亚洲精品中文字幕 | 欧美日韩国产综合网 | 综合婷婷 | 欧美性色黄大片在线观看 | 国产精品6999成人免费视频 | 亚洲九九爱| 99色视频在线 | 91传媒在线观看 | 精品福利视频在线观看 | 国产免费午夜 | 一级成人免费视频 | 日本少妇视频 | 国产精品亚州 | 超碰在线观看97 | 亚洲精品国偷拍自产在线观看蜜桃 | 天天干天天操天天做 | 国产网站在线免费观看 | 久久婷婷影视 | 丁香婷婷激情国产高清秒播 | 久久久久久国产精品免费 | 51久久成人国产精品麻豆 | 精品国产乱码久久久久久三级人 | 在线观看亚洲国产 | 日本中文在线播放 | 久久99国产精品自在自在app | 在线91视频 | 狠狠干网址| 成人一区二区三区中文字幕 | 在线天堂中文www视软件 | 精品视频在线免费 | 91成人精品国产刺激国语对白 | 国产精品欧美久久久久天天影视 | 黄网站色成年免费观看 | 久久久久久国产一区二区三区 | 东方av免费在线观看 | 热久久精品在线 | 六月丁香婷婷在线 | 久久国产免费 | 91香蕉视频污在线 | 中文字幕丝袜制服 | 超碰人人干人人 | 天天艹天天干天天 | 99久久精品免费看国产免费软件 | 国产一区二区三区 在线 | 国产91对白在线播 | 国产精品午夜在线 | 亚洲精品午夜视频 | 欧美少妇xx| 久久免费视频在线观看6 | 五月婷婷视频 | 91成人区 | 96久久欧美麻豆网站 | 最新av网址在线 | 992tv人人网tv亚洲精品 | 久久婷婷精品视频 | 91在线视频免费91 | 国产视频在线免费观看 | 99久久er热在这里只有精品66 | 欧美99热| 在线色亚洲 | 日韩欧美国产免费播放 | 久久综合九色综合97_ 久久久 | 韩国一区二区三区视频 | 奇米先锋 | 国产激情小视频在线观看 | 免费瑟瑟网站 | 黄免费在线观看 | 亚洲精品动漫在线 | 激情五月婷婷综合网 | 久久久久久久久久国产精品 | 国产视频精品在线 | www.久久色 | 成人在线超碰 | 国产一区二区三区网站 | 免费国产在线精品 | 香蕉一区 | 3d黄动漫免费看 | 国产精品成人久久久久久久 | 日韩免费看的电影 | 免费黄色av电影 | 久久久久麻豆v国产 | www.五月天色 | 国产乱老熟视频网88av | 国产精品久免费的黄网站 | 最近日本中文字幕a | 欧美一级日韩三级 | 国产精品s色 | 在线观影网站 | 日韩91在线 | 久久视频热| 人人干人人干人人干 | 色天天中文 | 午夜精品福利在线 | 精品国产日本 | 日夜夜精品视频 | 成人网色 | 91精品视频一区二区三区 | 91原创在线观看 | 国产在线观看免费av | 亚洲一区欧美激情 | 亚洲经典在线 | 成年人视频在线 | 成人国产精品一区 | 成人app在线播放 | 精品国产一区二区三区蜜臀 | 粉嫩一区二区三区粉嫩91 | 男女靠逼app | 波多野结衣一区二区三区中文字幕 | 中文字幕日韩免费视频 | 五月婷婷一级片 | av资源在线观看 | 超碰在线人人97 | 久久午夜精品影院一区 | 免费一级片久久 | 亚洲精品美女久久17c | 亚洲激情影院 | 91黄色小视频 | 黄色福利视频网站 | 国产免费观看视频 | 亚洲一级在线观看 | 国产高清在线a视频大全 | 国产在线日韩 | 天天天干天天天操 | 999久久久 | 人人爽爽人人 | 久久夜夜操 | 色综合婷婷久久 | 精品a在线 | 亚洲精品国偷自产在线91正片 | 丁香午夜婷婷 | 在线不卡视频 | japanesefreesex中国少妇 | 久久中文精品视频 | 中文字幕欧美日韩va免费视频 | 天天干国产| 国产精品亚洲精品 | 国产手机在线观看视频 | 欧美日在线观看 | 五月婷婷丁香综合 | 国产精品毛片一区视频播 | 国产一级91 | 久久99久久99精品免视看婷婷 | 天天爱天天干天天爽 | 99这里只有精品视频 | 久久久久99精品成人片三人毛片 | 国产一区二区网址 | 成人免费观看视频大全 | 玖玖在线精品 | 亚洲激情| 一区二区三区免费播放 | 亚洲国产小视频在线观看 | 天天干干 | 最新亚洲视频 | 一级黄色在线免费观看 | 91原创在线观看 | www.天天操.com | 亚洲2019精品 | 欧美激情va永久在线播放 | 国内精品久久久久影院一蜜桃 | av高清在线观看 | 欧美日韩免费在线视频 | 99精品久久只有精品 | 一区二区三区四区精品视频 | 天天色成人 | 日本久久影视 | 国产一区二区三区四区在线 | av看片网 | 亚洲 成人 欧美 | 日本系列中文字幕 | 香蕉在线播放 | 精品国产三级 | 丝袜一区在线 | 日本中文字幕免费观看 | 久久人网 | 在线播放国产一区二区三区 | 久久 精品一区 | 国产无遮挡又黄又爽馒头漫画 | 久草在线视频首页 | 成人av视屏 | 最新国产在线 | 精品国产精品久久 | 国产精品女同一区二区三区久久夜 | 91精品一区二区在线观看 | 成人黄色片免费 | 久久丝袜视频 | 亚洲91网站 | 色婷婷精品大在线视频 | 97人人澡人人添人人爽超碰 | 久久a免费视频 | 色中色资源站 | 国产精品成人免费精品自在线观看 | 麻花豆传媒一二三产区 | 97电影网站| 亚洲精品美女久久久 | 日韩av成人在线 | 亚洲日韩欧美一区二区在线 | 在线免费观看不卡av | 激情丁香综合五月 | 国产成人一区二区三区在线观看 | 毛片网站在线观看 | 欧洲精品亚洲精品 | 在线视频麻豆 | 成人在线小视频 | 最近av在线| 免费男女网站 | 91av福利视频| 日韩视频在线不卡 | 人人干人人草 | 午夜av激情 | 欧美大片www | 毛片一区二区 | 91超碰免费在线 | 久久久久久久久久久国产精品 | 欧美一进一出抽搐大尺度视频 | 中文在线字幕免费观看 | 岛国av在线不卡 | 黄色影院在线免费观看 | 麻豆传媒在线免费看 | 国产一二区精品 | 粉嫩av一区二区三区四区 | 2019中文字幕第一页 | 中文不卡视频 | 国产黄色一级片在线 | 激情网在线视频 | 成人精品福利 | 国产色拍拍拍拍在线精品 | 久久精品久久久久电影 | 日本午夜免费福利视频 | 久久国产精品免费一区二区三区 | 日韩精品在线视频 | 午夜精品一区二区三区在线观看 | 99久久婷婷国产精品综合 | 一区二区三区韩国免费中文网站 | 亚洲视频在线观看网站 | 欧美日韩在线免费观看视频 | 伊人狠狠色丁香婷婷综合 | 97精产国品一二三产区在线 | 97色在线观看| 中文字幕有码在线 | 国产高h视频 | 黄色成年片 | 成年人免费在线观看网站 | 96av麻豆蜜桃一区二区 | 97成人精品 | 黄污视频网站 | 午夜黄色影院 | 中日韩免费视频 | 日韩极品在线 | 成人欧美在线 | 久久国产福利 | 成人黄色在线 | 亚洲首页 | 日韩精品首页 | 黄a在线观看 | 国产精品视频久久久 | 久久av网| 中文日韩在线 | avsex| 中文字幕 二区 | 色999视频| 欧美日韩高清在线 | 国产精彩视频 | 91精品久久久久久久久久久久久 | 国产精品手机在线观看 | 欧美国产大片 | 香蕉久久久久 | 国产在线观看91 | 久久久在线 | 国产在线免费观看 | 一级黄色视屏 | 久久久精品国产一区二区 | 国内精品在线看 | 久久99精品视频 | 一级做a爱片性色毛片www | 2020天天干夜夜爽 | www.香蕉视频在线观看 | 五月天亚洲综合小说网 | av成人黄色 | 成人免费视频视频在线观看 免费 | 91人人射| 狠狠操精品 | 成人影视免费 | 欧美日韩有码 | 亚洲精品国产品国语在线 | 日本深夜福利视频 | 成年人在线观看网站 | 91日韩在线播放 | 在线成人国产 | 99热国产在线中文 | 成人av在线电影 | 久久夜色精品国产欧美一区麻豆 | 亚洲精品视频一二三 | 日韩视频一区二区三区在线播放免费观看 | 国产精品色婷婷视频 | 免费看污在线观看 | 激情五月伊人 | 干天天 | 伊人久久精品久久亚洲一区 | 欧美大片在线观看一区 | 国产午夜在线观看视频 | 成 人 黄 色 视频播放1 | 成人免费观看av | 欧美性护士 | 97偷拍视频 | 2022国产精品视频 | 欧美精品一区二区免费 | 在线视频观看国产 | 97日日 | 天天色天天草天天射 | 成年人免费电影 | 久久精品99久久久久久2456 | 18久久久久| 色婷婷狠狠 | 中文字幕色婷婷在线视频 | 有码中文字幕 | 狠狠干五月天 | 在线视频你懂得 | 欧美精品色 | 成人性生活大片 | 成人av av在线 | 四虎在线免费 | 久久精品视频免费观看 | 久久免费黄色 | 国产精品久久久久av福利动漫 | 日本黄色大片儿 | 日韩一二区在线 | 99久高清在线观看视频99精品热在线观看视频 | 超碰国产在线 | 久香蕉| 国产精品久久久久久a | 国产精品美女免费看 | 亚州免费视频 | 99爱视频在线观看 | 狠狠色丁香久久婷婷综合丁香 | 狠狠狠狠狠操 | 日韩国产精品毛片 | 欧美激情精品久久 | 在线免费观看国产精品 | 久久精品三级 | 欧美成人黄色片 | 国内精品久久久久影院男同志 | 国内精品久久久久影院优 | aaawww| 色婷婷激情 | 99久久www免费 | 成人一区影院 | 天天色天天操天天爽 | 亚洲精品tv | 亚洲欧美激情精品一区二区 | 久久九九九九 | 亚洲一级电影视频 | 最新日韩视频在线观看 | 久久99网站 | 在线播放视频一区 | 黄色软件在线观看免费 | 日韩精品在线看 | 免费黄色网址大全 | 日韩精品久久久久久 | .国产精品成人自产拍在线观看6 | 亚洲二区精品 | 国产a级精品 | 成人av资源 | 久久综合久久88 | 在线观看日韩av | 免费国产黄线在线观看视频 | 日韩电影一区二区在线 | 97免费视频在线播放 | 午夜精品一区二区三区免费视频 | 国产精品久久久久久久久搜平片 | 久久视频在线观看免费 | 亚洲资源一区 | 在线免费观看一区二区三区 | 夜夜躁天天躁很躁波 | 国产一级二级在线播放 | 日韩在线观看你懂得 | 国产婷婷在线观看 | 久久久久五月天 | 亚洲一区二区黄色 | 91免费网站在线观看 | 免费在线观看av网站 | 99视频在线观看免费 | 精品美女久久 | 亚洲精品视频一 | 国产在线a| 久久精品99久久 | 涩涩网站在线 | 亚洲精品国产精品国 | 亚洲免费在线视频 | av在线免费播放网站 | 色综合久久久久综合体 | 免费高清在线观看成人 | 国产丝袜制服在线 | 99久久久久久 | 最近中文字幕mv免费高清在线 | 久久国产精品电影 | 超碰97中文 | 视频国产一区二区三区 | 久久国产精品99精国产 | 亚洲日韩精品欧美一区二区 | 在线精品一区二区 | 91精品对白一区国产伦 | 在线观看视频一区二区 | 久久伊人热 | 亚洲码国产日韩欧美高潮在线播放 | 国产精品一区二区三区四 | 国产精品女同一区二区三区久久夜 | 久草视频资源 | 伊人影院在线观看 | 久久综合久色欧美综合狠狠 | 欧美日韩成人一区 | 免费人人干 | 久久国产a | 日韩在线观看视频免费 | av福利第一导航 | 成人在线视频你懂的 | 狠狠干天天 | 看v片| 天天激情 | 天天做天天看 | 国产精品美女视频网站 | 日韩视频二区 | 午夜色婷婷 | 一级做a爱片性色毛片www | 国产成年免费视频 | 精品久久精品 | 91视频久久久久久 | 91干干干 | 91桃色国产在线播放 | 亚洲激情校园春色 | 久久精品欧美一区 | 国产精品系列在线观看 | 久久久久久欧美二区电影网 | 五月综合激情婷婷 | 91久久久国产精品 | 国产99久久久国产精品免费看 | 最新免费中文字幕 | 久久久高清免费视频 | 国产精品二区在线 | 亚洲一区二区黄色 | 久久久麻豆视频 | 99在线观看 | 91色九色| 日韩亚洲在线观看 | 日韩电影一区二区在线观看 | 成人免费一区二区三区在线观看 | 国产在线不卡视频 | 欧洲一区二区在线观看 | 三级黄色片在线观看 | 成人一区不卡 | 天天操天天添 | 欧美动漫一区二区三区 | 色午夜 | 精品国产1区2区3区 国产欧美精品在线观看 | 激情偷乱人伦小说视频在线观看 | 国产亚洲综合在线 | 丁香av | 操高跟美女 | 久久久久久久久久久福利 | 青青草国产精品视频 | 少妇自拍av | 国产成人精品亚洲日本在线观看 | 天天草天天 | 久久兔费看a级 | 天天射天天干天天插 | 亚洲综合一区二区精品导航 | 91视视频在线直接观看在线看网页在线看 | 国产又粗又猛又色又黄视频 | 奇米导航 | 在线91播放| 2022中文字幕在线观看 | 伊甸园永久入口www 99热 精品在线 | 色婷婷福利 | 国产一区二区久久久 | 免费在线看v | 国产精品成人av电影 | 久久视频这里只有精品 | 欧美日韩一区二区视频在线观看 | 午夜国产福利视频 | 亚洲天堂精品视频在线观看 | 色综合久久久久久久久五月 | 日韩精品欧美精品 | 午夜精品福利在线 | 精品国产成人 | 欧美一区二区免费在线观看 | 免费裸体视频网 | 亚洲经典中文字幕 | 九九热99视频 | 久久久久高清毛片一级 | 国产精品激情偷乱一区二区∴ | 国产精品久久一 | 96视频在线| 手机在线看片日韩 | 亚洲最大成人网4388xx | 日韩视频一二三区 | www.狠狠插.com | 人人干干人人 | 国产剧情一区二区 | 97香蕉久久超级碰碰高清版 | 五月在线视频 | 免费视频 三区 | 黄免费网站 | 91人人射| 国产一区二区三区高清播放 | 久久婷婷五月综合色丁香 | 99视频在线精品免费观看2 | 操综合| 激情伊人五月天 | 视频国产在线观看18 | 99精品国产免费久久久久久下载 | 免费在线观看av电影 | 国产午夜三级一二三区 | 国产中年夫妇高潮精品视频 | 亚洲精品乱码久久久久v最新版 | 日韩黄色一区 | 亚洲国产成人在线观看 | 国产精品一区二区中文字幕 | 久久久www成人免费毛片 | 91超级碰 | 国产亚洲无 | 欧美地下肉体性派对 | 午夜久久福利 | 91在线精品视频 | 国产精品第72页 | 美腿丝袜一区二区三区 | 精久久久久 | 成 人 黄 色视频免费播放 | 婷婷丁香社区 | 午夜av在线免费 | 五月天久久久 | 天天射天天爱天天干 | 日本精品视频在线播放 | 亚洲专区一二三 | 久久精品综合网 | 久免费视频 | 视色网站| 亚洲日本在线视频观看 | 激情图片qvod | 九九精品毛片 | 久久精品亚洲国产 | 国产天天爽 | 日韩av一区二区三区在线观看 | 国产国产人免费人成免费视频 | 成人资源网 | 日韩免费大片 | 免费av网址在线观看 | 久久影院一区 | 国产免费人成xvideos视频 | 国产小视频在线免费观看 | 国产一区视频在线播放 | 99久久久国产精品美女 | 五月天激情综合网 | 中文字幕精品一区二区精品 | 亚洲网久久 | 日韩中文字幕亚洲一区二区va在线 | 天天天射 | 国产中文字幕三区 | 又黄又刺激视频 | 91久久黄色 | 国产黄色在线 | 高清av免费一区中文字幕 | 日韩成人黄色av | 亚洲综合最新在线 | 美女网站在线观看 | 超碰成人免费电影 | 亚洲视频综合 | 久久久久久电影 | 免费看毛片网站 | 三级黄色大片在线观看 | 四虎永久精品在线 | 欧美一级看片 | 在线激情av电影 | 国产精品成人国产乱一区 | 中文字幕91在线 | 日本女人的性生活视频 | 99精品视频中文字幕 | 91成人免费| 激情xxxx| www最近高清中文国语在线观看 | 97在线观看免费视频 | 中文字幕人成乱码在线观看 | 一区二区久久 | 亚洲视频一区二区三区在线观看 | 激情欧美xxxx| 91人人干 | 一区二区视频电影在线观看 | 丁香婷婷在线观看 | 成年人在线观看视频免费 | 亚洲免费小视频 | 天天操天天干天天干 | 日本99热| 96精品高清视频在线观看软件特色 | 免费在线h | 97碰在线 | 天天舔夜夜操 | 男女全黄一级一级高潮免费看 | 欧美日韩免费在线观看视频 | 久久国内精品99久久6app | 午夜成人影视 | 一级一片免费看 | 国产精品1区2区3区 久久免费视频7 | 欧美va电影 | 国产理伦在线 | 色婷婷一区 | 就要干b| 色丁香婷婷 | 在线观看黄 | 亚洲精品黄色片 | av电影在线播放 | 亚洲精品视频免费 | 国产一区麻豆 | 人人超碰97| av亚洲产国偷v产偷v自拍小说 | 婷婷六月中文字幕 | 精品国模一区二区 | 中日韩三级视频 | 五月婷婷六月丁香 | 欧洲一区二区三区精品 | 国产美女精品视频免费观看 | 美女视频黄频大全免费 | 天天综合色网 | 一本到视频在线观看 | 久久国产免 | 一区二区国产精品 | 午夜视频在线观看一区二区 | 成 人 黄 色 免费播放 | 成人久久久精品国产乱码一区二区 | 日韩二区三区 | 麻豆传媒视频在线播放 | 日韩成人精品一区二区 | 国产精品久久久久久久久久ktv | 91热爆在线观看 | 日韩啪啪小视频 | 婷婷色站 |