#!/bin/bash
datename=$(date +%Y%m%d_%H%M%S)
filename=systrace_$datename.ftrace
#adb shell "echo 1 > /sys/kernel/debug/tracing/events/filemap/enable"
#adb shell "echo 1 > /sys/kernel/debug/tracing/events/ext4/enable"
/mnt/d/ADB/adb.exe shell "echo 1 > /sys/kernel/tracing/events/schedwalt/waltgov_next_freq/enable"
/mnt/d/ADB/adb.exe shell "echo 1 > /sys/kernel/tracing/events/schedwalt/sched_update_history/enable"
/mnt/d/ADB/adb.exe shell "atrace -t 5 -b 20480 gfx binder_driver memory input wm am sched view res disk freq" > $filename
sed -i '1,2d' $filename
java -cp /mnt/d/lib.jar com.example.KernelTraceUtils $filename waltgov_next_freq sched_update_history
/mnt/d/ADB/adb.exe shell "echo 0 > /sys/kernel/tracing/events/schedwalt/waltgov_next_freq/enable"
/mnt/d/ADB/adb.exe shell "echo 0 > /sys/kernel/tracing/events/schedwalt/sched_update_history/enable"
android13上通过上述脚本抓的ftrace无法打开,最后分析是最新的kernel版本多了一栏,导致tracing.js解析报错
这里提供一种改法:
lineREWithTGID=new RegExp('^\\s*(.+)-(\\d+)\\s+\\(\\s*(\\d+|-+)\\)\\s\\[(\\d+)\\]'+'\\s+[dX.][Nnp.][Hhs.][0-9a-f.]'+'\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$');
lineREWithTGID=new RegExp('^\\s*(.+)-(\\d+)\\s+\\(\\s*(\\d+|-+)\\)\\s\\[(\\d+)\\]'+'\\s+[dX.][Nnp.][Hhs.][0-9a-f.][0-9a-f.]'+'\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$');
kernel trace tag显示
package com.example;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class KernelTraceUtils {
static Pattern TID = Pattern.compile("^.*-([0-9]{1,5})");
public static void main(String[] args) throws IOException {
String path = args[0];
List<Pattern> targets = new ArrayList<>();
for (int i = 1; i < args.length; i++) {
targets.add(Pattern.compile("(^.*)" + args[i] + ":"));
}
List<String> lines = Files.readAllLines(Paths.get(path));
BufferedWriter writer = new BufferedWriter(new FileWriter(path));
for (String line : lines) {
String newLine = null;
String prefix = match(targets, line);
if (prefix != null) {
Matcher m = TID.matcher(prefix);
m.find();
String tid = m.group(1);
line = line.replace(prefix, prefix + "tracing_mark_write: B|" + tid + "|");
newLine = prefix + "tracing_mark_write: E|" + tid + "|";
}
writer.write(line);
writer.newLine();
if (newLine != null) {
writer.write(newLine);
writer.newLine();
}
}
writer.close();
}
public static String match(List<Pattern> targets, String line) {
String ret = null;
for (Pattern pattern : targets) {
Matcher m = pattern.matcher(line);
if (m.find()) {
ret = m.group(1);
}
}
return ret;
}
}
- wsl2 ftrace线程号不对问题
package org.example;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class KernelTraceUtils {
static Pattern uPID = Pattern.compile("tracing_mark_write:.*[BE]{1}\\|(\\d{2,6})");
static Pattern kPID = Pattern.compile("\\(\\s*(\\d+)\\)");
static HashMap<Integer, Integer> map = new HashMap<>();
public static void main(String[] args) throws IOException, InterruptedException {
String path = args[0];
List<String> lines = Files.readAllLines(Paths.get(path));
BufferedWriter writer = new BufferedWriter(new FileWriter(path));
for (String line : lines) {
if (line.contains("JNI_CreateJavaVM")) {
Matcher m = kPID.matcher(line);
m.find();
int kpid = Integer.parseInt(m.group(1));
m = uPID.matcher(line);
m.find();
int upid = Integer.parseInt(m.group(1));
map.put(upid, kpid);
}
if (line.contains("tracing_mark_write: B|") || line.contains("tracing_mark_write: E|")) {
Matcher m = uPID.matcher(line);
m.find();
int upid = Integer.parseInt(m.group(1));
int kpid = map.get(upid);
line = line.replace(""+upid, ""+kpid);
}
writer.write(line);
writer.newLine();
}
writer.close();
}
}