2. 这些信息的来源是什么
打开/catapult/systrace/systrace/tracing_agents,我们就能发现很多抓trace的agent,这是抓不同类型信息对应的代码逻辑。
通过atrace_agent.py的函数StartAgentTracing和StopAgentTracing,我们终于知道了systrace的主要部分是通过atrace命令抓取的。
虽然使用systrace.py是抓取systrace最常规的方法,但如果要在测试脚本加入抓systrace的操作,我认为atrace命令是最直接的方法,也可以节省测试脚本的运行时间。
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
- static const TracingCategory k_categories[] = {
- { "gfx", "Graphics", ATRACE_TAG_GRAPHICS, {
- { OPT, "events/mdss/enable" },
- { OPT, "events/sde/enable" },
- } },
- { "input", "Input", ATRACE_TAG_INPUT, { } },
- { "view", "View System", ATRACE_TAG_VIEW, { } },
- { "webview", "WebView", ATRACE_TAG_WEBVIEW, { } },
- { "wm", "Window Manager", ATRACE_TAG_WINDOW_MANAGER, { } },
- { "am", "Activity Manager", ATRACE_TAG_ACTIVITY_MANAGER, { } },
- { "sm", "Sync Manager", ATRACE_TAG_SYNC_MANAGER, { } },
- { "audio", "Audio", ATRACE_TAG_AUDIO, { } },
- { "video", "Video", ATRACE_TAG_VIDEO, { } },
- { "camera", "Camera", ATRACE_TAG_CAMERA, { } },
- { "hal", "Hardware Modules", ATRACE_TAG_HAL, { } },
- { "res", "Resource Loading", ATRACE_TAG_RESOURCES, { } },
- { "dalvik", "Dalvik VM", ATRACE_TAG_DALVIK, { } },
- { "rs", "RenderScript", ATRACE_TAG_RS, { } },
- { "bionic", "Bionic C Library", ATRACE_TAG_BIONIC, { } },
- { "power", "Power Management", ATRACE_TAG_POWER, { } },
- { "pm", "Package Manager", ATRACE_TAG_PACKAGE_MANAGER, { } },
- { "ss", "System Server", ATRACE_TAG_SYSTEM_SERVER, { } },
- { "database", "Database", ATRACE_TAG_DATABASE, { } },
- { "network", "Network", ATRACE_TAG_NETWORK, { } },
- { "adb", "ADB", ATRACE_TAG_ADB, { } },
- { "vibrator", "Vibrator", ATRACE_TAG_VIBRATOR, { } },
- { "aidl", "AIDL calls", ATRACE_TAG_AIDL, { } },
- { k_coreServiceCategory, "Core services", 0, { } },
- { k_pdxServiceCategory, "PDX services", 0, { } },
- { "sched", "CPU Scheduling", 0, {
- { REQ, "events/sched/sched_switch/enable" },
- { REQ, "events/sched/sched_wakeup/enable" },
- { OPT, "events/sched/sched_waking/enable" },
- { OPT, "events/sched/sched_blocked_reason/enable" },
- { OPT, "events/sched/sched_cpu_hotplug/enable" },
- { OPT, "events/sched/sched_pi_setprio/enable" },
- { OPT, "events/cgroup/enable" },
- } },
- { "irq", "IRQ Events", 0, {
- { REQ, "events/irq/enable" },
- { OPT, "events/ipi/enable" },
- } },
- { "irqoff", "IRQ-disabled code section tracing", 0, {
- { REQ, "events/preemptirq/irq_enable/enable" },
- { REQ, "events/preemptirq/irq_disable/enable" },
- } },
- { "preemptoff", "Preempt-disabled code section tracing", 0, {
- { REQ, "events/preemptirq/preempt_enable/enable" },
- { REQ, "events/preemptirq/preempt_disable/enable" },
- } },
- { "i2c", "I2C Events", 0, {
- { REQ, "events/i2c/enable" },
- { REQ, "events/i2c/i2c_read/enable" },
- { REQ, "events/i2c/i2c_write/enable" },
- { REQ, "events/i2c/i2c_result/enable" },
- { REQ, "events/i2c/i2c_reply/enable" },
- { OPT, "events/i2c/smbus_read/enable" },
- { OPT, "events/i2c/smbus_write/enable" },
- { OPT, "events/i2c/smbus_result/enable" },
- { OPT, "events/i2c/smbus_reply/enable" },
- } },
- { "freq", "CPU Frequency", 0, {
- { REQ, "events/power/cpu_frequency/enable" },
- { OPT, "events/power/clock_set_rate/enable" },
- { OPT, "events/power/clock_disable/enable" },
- { OPT, "events/power/clock_enable/enable" },
- { OPT, "events/clk/clk_set_rate/enable" },
- { OPT, "events/clk/clk_disable/enable" },
- { OPT, "events/clk/clk_enable/enable" },
- { OPT, "events/power/cpu_frequency_limits/enable" },
- } },
- { "membus", "Memory Bus Utilization", 0, {
- { REQ, "events/memory_bus/enable" },
- } },
- { "idle", "CPU Idle", 0, {
- { REQ, "events/power/cpu_idle/enable" },
- } },
- { "disk", "Disk I/O", 0, {
- { OPT, "events/f2fs/f2fs_sync_file_enter/enable" },
- { OPT, "events/f2fs/f2fs_sync_file_exit/enable" },
- { OPT, "events/f2fs/f2fs_write_begin/enable" },
- { OPT, "events/f2fs/f2fs_write_end/enable" },
- { OPT, "events/ext4/ext4_da_write_begin/enable" },
- { OPT, "events/ext4/ext4_da_write_end/enable" },
- { OPT, "events/ext4/ext4_sync_file_enter/enable" },
- { OPT, "events/ext4/ext4_sync_file_exit/enable" },
- { REQ, "events/block/block_rq_issue/enable" },
- { REQ, "events/block/block_rq_complete/enable" },
- } },
- { "mmc", "eMMC commands", 0, {
- { REQ, "events/mmc/enable" },
- } },
- { "load", "CPU Load", 0, {
- { REQ, "events/cpufreq_interactive/enable" },
- } },
- { "sync", "Synchronization", 0, {
- // before linux kernel 4.9
- { OPT, "events/sync/enable" },
- // starting in linux kernel 4.9
- { OPT, "events/fence/enable" },
- } },
- { "workq", "Kernel Workqueues", 0, {
- { REQ, "events/workqueue/enable" },
- } },
- { "memreclaim", "Kernel Memory Reclaim", 0, {
- { REQ, "events/vmscan/mm_vmscan_direct_reclaim_begin/enable" },
- { REQ, "events/vmscan/mm_vmscan_direct_reclaim_end/enable" },
- { REQ, "events/vmscan/mm_vmscan_kswapd_wake/enable" },
- { REQ, "events/vmscan/mm_vmscan_kswapd_sleep/enable" },
- { OPT, "events/lowmemorykiller/enable" },
- } },
- { "regulators", "Voltage and Current Regulators", 0, {
- { REQ, "events/regulator/enable" },
- } },
- { "binder_driver", "Binder Kernel driver", 0, {
- { REQ, "events/binder/binder_transaction/enable" },
- { REQ, "events/binder/binder_transaction_received/enable" },
- { OPT, "events/binder/binder_set_priority/enable" },
- } },
- { "binder_lock", "Binder global lock trace", 0, {
- { OPT, "events/binder/binder_lock/enable" },
- { OPT, "events/binder/binder_locked/enable" },
- { OPT, "events/binder/binder_unlock/enable" },
- } },
- { "pagecache", "Page cache", 0, {
- { REQ, "events/filemap/enable" },
- } },
- };
static inline void atrace_begin(uint64_t tag, const char* name) 中控制是否写入相应TAG的log。