blob: d5a6b86733a7fe814bd9a5e601c4799155a7f23a [file] [log] [blame]
// The file format generated by cmd_report_sample.proto is as below:
// char magic[10] = "SIMPLEPERF";
// LittleEndian16(version) = 1;
// LittleEndian32(record_size_0)
// message Record(record_0) (having record_size_0 bytes)
// LittleEndian32(record_size_1)
// message Record(record_1) (having record_size_1 bytes)
// ...
// LittleEndian32(record_size_N)
// message Record(record_N) (having record_size_N bytes)
// LittleEndian32(0)
syntax = "proto2";
option optimize_for = LITE_RUNTIME;
package simpleperf_report_proto;
option java_package = "com.android.tools.profiler.proto";
option java_outer_classname = "SimpleperfReport";
message Sample {
// Monotonic clock time in nanoseconds. On kernel < 4.1, it's perf clock instead.
optional uint64 time = 1;
optional int32 thread_id = 2;
message CallChainEntry {
// virtual address of the instruction in elf file
optional uint64 vaddr_in_file = 1;
// index of the elf file containing the instruction
optional uint32 file_id = 2;
// symbol_id refers to the name of the function containing the instruction.
// If the function name is found, it is a valid index in the symbol table
// of File with 'id' field being file_id, otherwise it is -1.
optional int32 symbol_id = 3;
enum ExecutionType {
// methods belong to native libraries, AOT compiled JVM code and ART methods not used near
// JVM methods
NATIVE_METHOD = 0;
INTERPRETED_JVM_METHOD = 1;
JIT_JVM_METHOD = 2;
// ART methods used near JVM methods. It's shown only when --show-art-frames is used.
ART_METHOD = 3;
}
optional ExecutionType execution_type = 4 [default = NATIVE_METHOD];
}
repeated CallChainEntry callchain = 3;
// Simpleperf generates one sample whenever a specified amount of events happen
// while running a monitored thread. So each sample belongs to one event type.
// Event type can be cpu-cycles, cpu-clock, sched:sched_switch or other types.
// By using '-e' option, we can ask simpleperf to record samples for one or more
// event types.
// Each event type generates samples independently. But recording more event types
// will cost more cpu time generating samples, which may affect the monitored threads
// and sample lost rate.
// event_count field shows the count of the events (belong to the sample's event type)
// that have happened since last sample (belong to the sample's event type) for the
// same thread. However, if there are lost samples between current sample and previous
// sample, the event_count is the count of events from the last lost sample.
optional uint64 event_count = 4;
// An index in meta_info.event_type, shows which event type current sample belongs to.
optional uint32 event_type_id = 5;
message UnwindingResult {
// error code provided by libunwindstack, in
// https://cs.android.com/android/platform/superproject/+/master:system/unwinding/libunwindstack/include/unwindstack/Error.h
optional uint32 raw_error_code = 1;
// error addr provided by libunwindstack
optional uint64 error_addr = 2;
// error code interpreted by simpleperf
enum ErrorCode {
ERROR_NONE = 0; // No error
ERROR_UNKNOWN = 1; // Error not interpreted by simpleperf, see raw_error_code
ERROR_NOT_ENOUGH_STACK = 2; // Simpleperf doesn't record enough stack data
ERROR_MEMORY_INVALID = 3; // Memory read failed
ERROR_UNWIND_INFO = 4; // No debug info in binary to support unwinding
ERROR_INVALID_MAP = 5; // Unwind in an invalid map
ERROR_MAX_FRAME_EXCEEDED = 6; // Stopped at MAX_UNWINDING_FRAMES, which is 512.
ERROR_REPEATED_FRAME = 7; // The last frame has the same pc/sp as the next.
ERROR_INVALID_ELF = 8; // Unwind in an invalid elf file
}
optional ErrorCode error_code = 3;
}
// Unwinding result is provided for samples without a complete callchain, when recorded with
// --keep-failed-unwinding-result or --keep-failed-unwinding-debug-info.
optional UnwindingResult unwinding_result = 6;
}
message LostSituation {
optional uint64 sample_count = 1;
optional uint64 lost_count = 2;
}
message File {
// unique id for each file, starting from 0, and add 1 each time.
optional uint32 id = 1;
// file path, like /system/lib/libc.so.
optional string path = 2;
// symbol table of the file.
repeated string symbol = 3;
// mangled symbol table of the file.
repeated string mangled_symbol = 4;
}
message Thread {
optional uint32 thread_id = 1;
optional uint32 process_id = 2;
optional string thread_name = 3;
}
message MetaInfo {
repeated string event_type = 1;
optional string app_package_name = 2;
optional string app_type = 3; // debuggable, profileable or non_profileable
optional string android_sdk_version = 4;
optional string android_build_type = 5; // user, userdebug or eng
// True if the profile is recorded with --trace-offcpu option.
optional bool trace_offcpu = 6;
}
// Thread context switch info. It is available when MetaInfo.trace_offcpu = true.
message ContextSwitch {
// If true, the thread is scheduled on cpu, otherwise it is scheduled off cpu.
optional bool switch_on = 1;
// Monotonic clock time in nanoseconds. On kernel < 4.1, it's perf clock instead.
optional uint64 time = 2;
optional uint32 thread_id = 3;
}
message Record {
oneof record_data {
Sample sample = 1;
LostSituation lost = 2;
File file = 3;
Thread thread = 4;
MetaInfo meta_info = 5;
ContextSwitch context_switch = 6;
}
}