经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
[Android systrace系列] systrace的信息从哪里来
来源:cnblogs  作者:zzc1024  时间:2020/12/8 8:45:18  对本文有异议

--------------------------------------------------------------

这篇文章的小目标:

1. systrace是怎么抓出来的

2. 这些信息的来源是什么

------------------------------------

 

[Android systrace系列] systrace入门第一式 介绍了用命令行抓取systrace的方法。

打开systrace.py的目录,会发现一大堆python文件,让人以为抓取systrace的流程很复杂。

其实不然,systrace是附属于catapult这个项目(传送门),是一个抓trace的框架,而且不仅仅为Andorid服务。

 

打开/catapult/systrace/systrace/tracing_agents,我们就能发现很多抓trace的agent,这是抓不同类型信息对应的代码逻辑。

抓Android默认用到这三个agent,对应三类信息:

atrace_agent(atrace,负责收集用户空间打印的systrace log和kernel ftrace事件)

android_process_data_agent(ps命令,用来对应进程名与PID)

android_cgroup_agent(cgroup中cpuset子系统,市面销售的机器不一定能抓到)

 

atrace抓取的信息是Android systrace中最核心的部分。

通过atrace_agent.py的函数StartAgentTracing和StopAgentTracing,我们终于知道了systrace的主要部分是通过atrace命令抓取的。

实质上,只抓取atrace就可以生成systrace html文件了。

虽然使用systrace.py是抓取systrace最常规的方法,但如果要在测试脚本加入抓systrace的操作,我认为atrace命令是最直接的方法,也可以节省测试脚本的运行时间。

这也有助于了解systrace的细节,衍生出更多技巧。

 

0. 执行adb shell atrace --list_categories,选择你需要的log类别

1. adb shell atrace --async_start -b 8192 gfx input view webview wm am sm audio video camera hal res dalvik rs bionic power pm ss database network sched freq idle disk sync memreclaim binder_driver binder_lock gfx ion

2. 重现问题,现象出现后,执行 adb shell atrace --async_stop -z > a.out

3. 事后转换成html文件,systrace.py --from-file a.out -o a.html

 

 

现在我们阅读atrace的代码,寻找更多细节。

代码路径://android/frameworks/native/cmds/atrace/atrace.cpp

这个数组,就是之前提到的systrace信息的两大来源,用户空间打印的systrace log和kernel ftrace事件。

用户空间systrace logATRACE_TAG 开头的

kernel ftrace:events开头的

  1. static const TracingCategory k_categories[] = {
  2. { "gfx", "Graphics", ATRACE_TAG_GRAPHICS, {
  3. { OPT, "events/mdss/enable" },
  4. { OPT, "events/sde/enable" },
  5. } },
  6. { "input", "Input", ATRACE_TAG_INPUT, { } },
  7. { "view", "View System", ATRACE_TAG_VIEW, { } },
  8. { "webview", "WebView", ATRACE_TAG_WEBVIEW, { } },
  9. { "wm", "Window Manager", ATRACE_TAG_WINDOW_MANAGER, { } },
  10. { "am", "Activity Manager", ATRACE_TAG_ACTIVITY_MANAGER, { } },
  11. { "sm", "Sync Manager", ATRACE_TAG_SYNC_MANAGER, { } },
  12. { "audio", "Audio", ATRACE_TAG_AUDIO, { } },
  13. { "video", "Video", ATRACE_TAG_VIDEO, { } },
  14. { "camera", "Camera", ATRACE_TAG_CAMERA, { } },
  15. { "hal", "Hardware Modules", ATRACE_TAG_HAL, { } },
  16. { "res", "Resource Loading", ATRACE_TAG_RESOURCES, { } },
  17. { "dalvik", "Dalvik VM", ATRACE_TAG_DALVIK, { } },
  18. { "rs", "RenderScript", ATRACE_TAG_RS, { } },
  19. { "bionic", "Bionic C Library", ATRACE_TAG_BIONIC, { } },
  20. { "power", "Power Management", ATRACE_TAG_POWER, { } },
  21. { "pm", "Package Manager", ATRACE_TAG_PACKAGE_MANAGER, { } },
  22. { "ss", "System Server", ATRACE_TAG_SYSTEM_SERVER, { } },
  23. { "database", "Database", ATRACE_TAG_DATABASE, { } },
  24. { "network", "Network", ATRACE_TAG_NETWORK, { } },
  25. { "adb", "ADB", ATRACE_TAG_ADB, { } },
  26. { "vibrator", "Vibrator", ATRACE_TAG_VIBRATOR, { } },
  27. { "aidl", "AIDL calls", ATRACE_TAG_AIDL, { } },
  28. { k_coreServiceCategory, "Core services", 0, { } },
  29. { k_pdxServiceCategory, "PDX services", 0, { } },
  30. { "sched", "CPU Scheduling", 0, {
  31. { REQ, "events/sched/sched_switch/enable" },
  32. { REQ, "events/sched/sched_wakeup/enable" },
  33. { OPT, "events/sched/sched_waking/enable" },
  34. { OPT, "events/sched/sched_blocked_reason/enable" },
  35. { OPT, "events/sched/sched_cpu_hotplug/enable" },
  36. { OPT, "events/sched/sched_pi_setprio/enable" },
  37. { OPT, "events/cgroup/enable" },
  38. } },
  39. { "irq", "IRQ Events", 0, {
  40. { REQ, "events/irq/enable" },
  41. { OPT, "events/ipi/enable" },
  42. } },
  43. { "irqoff", "IRQ-disabled code section tracing", 0, {
  44. { REQ, "events/preemptirq/irq_enable/enable" },
  45. { REQ, "events/preemptirq/irq_disable/enable" },
  46. } },
  47. { "preemptoff", "Preempt-disabled code section tracing", 0, {
  48. { REQ, "events/preemptirq/preempt_enable/enable" },
  49. { REQ, "events/preemptirq/preempt_disable/enable" },
  50. } },
  51. { "i2c", "I2C Events", 0, {
  52. { REQ, "events/i2c/enable" },
  53. { REQ, "events/i2c/i2c_read/enable" },
  54. { REQ, "events/i2c/i2c_write/enable" },
  55. { REQ, "events/i2c/i2c_result/enable" },
  56. { REQ, "events/i2c/i2c_reply/enable" },
  57. { OPT, "events/i2c/smbus_read/enable" },
  58. { OPT, "events/i2c/smbus_write/enable" },
  59. { OPT, "events/i2c/smbus_result/enable" },
  60. { OPT, "events/i2c/smbus_reply/enable" },
  61. } },
  62. { "freq", "CPU Frequency", 0, {
  63. { REQ, "events/power/cpu_frequency/enable" },
  64. { OPT, "events/power/clock_set_rate/enable" },
  65. { OPT, "events/power/clock_disable/enable" },
  66. { OPT, "events/power/clock_enable/enable" },
  67. { OPT, "events/clk/clk_set_rate/enable" },
  68. { OPT, "events/clk/clk_disable/enable" },
  69. { OPT, "events/clk/clk_enable/enable" },
  70. { OPT, "events/power/cpu_frequency_limits/enable" },
  71. } },
  72. { "membus", "Memory Bus Utilization", 0, {
  73. { REQ, "events/memory_bus/enable" },
  74. } },
  75. { "idle", "CPU Idle", 0, {
  76. { REQ, "events/power/cpu_idle/enable" },
  77. } },
  78. { "disk", "Disk I/O", 0, {
  79. { OPT, "events/f2fs/f2fs_sync_file_enter/enable" },
  80. { OPT, "events/f2fs/f2fs_sync_file_exit/enable" },
  81. { OPT, "events/f2fs/f2fs_write_begin/enable" },
  82. { OPT, "events/f2fs/f2fs_write_end/enable" },
  83. { OPT, "events/ext4/ext4_da_write_begin/enable" },
  84. { OPT, "events/ext4/ext4_da_write_end/enable" },
  85. { OPT, "events/ext4/ext4_sync_file_enter/enable" },
  86. { OPT, "events/ext4/ext4_sync_file_exit/enable" },
  87. { REQ, "events/block/block_rq_issue/enable" },
  88. { REQ, "events/block/block_rq_complete/enable" },
  89. } },
  90. { "mmc", "eMMC commands", 0, {
  91. { REQ, "events/mmc/enable" },
  92. } },
  93. { "load", "CPU Load", 0, {
  94. { REQ, "events/cpufreq_interactive/enable" },
  95. } },
  96. { "sync", "Synchronization", 0, {
  97. // before linux kernel 4.9
  98. { OPT, "events/sync/enable" },
  99. // starting in linux kernel 4.9
  100. { OPT, "events/fence/enable" },
  101. } },
  102. { "workq", "Kernel Workqueues", 0, {
  103. { REQ, "events/workqueue/enable" },
  104. } },
  105. { "memreclaim", "Kernel Memory Reclaim", 0, {
  106. { REQ, "events/vmscan/mm_vmscan_direct_reclaim_begin/enable" },
  107. { REQ, "events/vmscan/mm_vmscan_direct_reclaim_end/enable" },
  108. { REQ, "events/vmscan/mm_vmscan_kswapd_wake/enable" },
  109. { REQ, "events/vmscan/mm_vmscan_kswapd_sleep/enable" },
  110. { OPT, "events/lowmemorykiller/enable" },
  111. } },
  112. { "regulators", "Voltage and Current Regulators", 0, {
  113. { REQ, "events/regulator/enable" },
  114. } },
  115. { "binder_driver", "Binder Kernel driver", 0, {
  116. { REQ, "events/binder/binder_transaction/enable" },
  117. { REQ, "events/binder/binder_transaction_received/enable" },
  118. { OPT, "events/binder/binder_set_priority/enable" },
  119. } },
  120. { "binder_lock", "Binder global lock trace", 0, {
  121. { OPT, "events/binder/binder_lock/enable" },
  122. { OPT, "events/binder/binder_locked/enable" },
  123. { OPT, "events/binder/binder_unlock/enable" },
  124. } },
  125. { "pagecache", "Page cache", 0, {
  126. { REQ, "events/filemap/enable" },
  127. } },
  128. };

 

各个ATRACE_TAG_XXX的功能是掩码,在 //android/system/core/include/cutils/trace.h 的函数

static inline void atrace_begin(uint64_t tag, const char* name) 中控制是否写入相应TAG的log。

 

systrace在各层的调用接口,以及最终systrace的log格式如下表:

 

跟踪上表的代码很容易会发现,用户空间的systrace log,最终通过libcutils的接口,写入到

手机的 /sys/kernel/debug/tracing/trace_marker,就是写入到kernel ftrace的buffer中。

用户空间打印的systrace log 和 kernel ftrace事件在这里胜利会师了。

 

用纯文本打开systrace html 文件,除了上述两类log,开头还有一大段Javascript。

通过Javascript的解析处理,呈现出systrace可视化的分析界面。

 

 

转载请注明出处:https://www.cnblogs.com/zzcperf/p/14052681.html

原文链接:http://www.cnblogs.com/zzcperf/p/14052681.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号