summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2018-04-10 17:05:30 -0700
committerYabin Cui <yabinc@google.com>2018-04-10 17:49:15 -0700
commit0a59929031765d365a5ffa64a19310c917f12aef (patch)
tree7a76cb63cd4d908df3951605db37df0d3859c131
parent246c78073678c8d391caaac0138043673e3924fd (diff)
downloadextras-0a59929031765d365a5ffa64a19310c917f12aef.tar.gz
simpleperf: report app package name in report-sample command.
Bug: http://b/74527012 Test: run simpleperf_unit_test. Change-Id: I20cbb625d2b2f39cd754f6bece74b8475bd5c92e
-rw-r--r--simpleperf/cmd_record.cpp3
-rw-r--r--simpleperf/cmd_report_sample.cpp24
-rw-r--r--simpleperf/cmd_report_sample_test.cpp67
-rw-r--r--simpleperf/get_test_data.h3
-rw-r--r--simpleperf/report_sample.proto1
-rw-r--r--simpleperf/testdata/perf_with_app_package_name.databin0 -> 240419 bytes
6 files changed, 50 insertions, 48 deletions
diff --git a/simpleperf/cmd_record.cpp b/simpleperf/cmd_record.cpp
index 5ea42573..5c9165c2 100644
--- a/simpleperf/cmd_record.cpp
+++ b/simpleperf/cmd_record.cpp
@@ -1444,6 +1444,9 @@ bool RecordCommand::DumpMetaInfoFeature() {
android::base::GetProperty("ro.product.model", "").c_str(),
android::base::GetProperty("ro.product.name", "").c_str());
info_map["android_version"] = android::base::GetProperty("ro.build.version.release", "");
+ if (!app_package_name_.empty()) {
+ info_map["app_package_name"] = app_package_name_;
+ }
#endif
info_map["clockid"] = clockid_;
info_map["timestamp"] = std::to_string(time(nullptr));
diff --git a/simpleperf/cmd_report_sample.cpp b/simpleperf/cmd_report_sample.cpp
index 57da775b..c6ba9815 100644
--- a/simpleperf/cmd_report_sample.cpp
+++ b/simpleperf/cmd_report_sample.cpp
@@ -121,6 +121,7 @@ class ReportSampleCommand : public Command {
bool trace_offcpu_;
std::unique_ptr<ScopedEventTypes> scoped_event_types_;
std::vector<std::string> event_types_;
+ std::unordered_map<std::string, std::string> meta_info_;
};
bool ReportSampleCommand::Run(const std::vector<std::string>& args) {
@@ -359,6 +360,10 @@ bool ReportSampleCommand::DumpProtobufReport(const std::string& filename) {
for (int i = 0; i < meta_info.event_type_size(); ++i) {
FprintIndented(report_fp_, 1, "event_type: %s\n", meta_info.event_type(i).c_str());
}
+ if (meta_info.has_app_package_name()) {
+ FprintIndented(report_fp_, 0, "app_package_name: %s\n",
+ meta_info.app_package_name().c_str());
+ }
} else {
LOG(ERROR) << "unexpected record type ";
return false;
@@ -386,16 +391,15 @@ bool ReportSampleCommand::OpenRecordFile() {
}
record_file_reader_->LoadBuildIdAndFileFeatures(thread_tree_);
if (record_file_reader_->HasFeature(PerfFileFormat::FEAT_META_INFO)) {
- std::unordered_map<std::string, std::string> meta_info;
- if (!record_file_reader_->ReadMetaInfoFeature(&meta_info)) {
+ if (!record_file_reader_->ReadMetaInfoFeature(&meta_info_)) {
return false;
}
- auto it = meta_info.find("event_type_info");
- if (it != meta_info.end()) {
+ auto it = meta_info_.find("event_type_info");
+ if (it != meta_info_.end()) {
scoped_event_types_.reset(new ScopedEventTypes(it->second));
}
- it = meta_info.find("trace_offcpu");
- if (it != meta_info.end()) {
+ it = meta_info_.find("trace_offcpu");
+ if (it != meta_info_.end()) {
trace_offcpu_ = it->second == "true";
}
}
@@ -406,12 +410,17 @@ bool ReportSampleCommand::OpenRecordFile() {
}
bool ReportSampleCommand::PrintMetaInfo() {
+ auto it = meta_info_.find("app_package_name");
+ std::string app_package_name = it != meta_info_.end() ? it->second : "";
if (use_protobuf_) {
proto::Record proto_record;
proto::MetaInfo* meta_info = proto_record.mutable_meta_info();
for (auto& event_type : event_types_) {
*(meta_info->add_event_type()) = event_type;
}
+ if (!app_package_name.empty()) {
+ meta_info->set_app_package_name(app_package_name);
+ }
return WriteRecordInProtobuf(proto_record);
}
FprintIndented(report_fp_, 0, "meta_info:\n");
@@ -419,6 +428,9 @@ bool ReportSampleCommand::PrintMetaInfo() {
for (auto& event_type : event_types_) {
FprintIndented(report_fp_, 1, "event_type: %s\n", event_type.c_str());
}
+ if (!app_package_name.empty()) {
+ FprintIndented(report_fp_, 1, "app_package_name: %s\n", app_package_name.c_str());
+ }
return true;
}
diff --git a/simpleperf/cmd_report_sample_test.cpp b/simpleperf/cmd_report_sample_test.cpp
index 631b0cb7..2250393c 100644
--- a/simpleperf/cmd_report_sample_test.cpp
+++ b/simpleperf/cmd_report_sample_test.cpp
@@ -43,78 +43,61 @@ TEST(cmd_report_sample, show_callchain_option) {
"-o", tmpfile.path, "--show-callchain"}));
}
-TEST(cmd_report_sample, protobuf_option) {
+static void GetProtobufReport(const std::string& test_data_file, std::string* protobuf_report,
+ const std::vector<std::string>& extra_args = {}) {
TemporaryFile tmpfile;
TemporaryFile tmpfile2;
- ASSERT_TRUE(ReportSampleCmd()->Run({"-i", GetTestData(PERF_DATA_WITH_SYMBOLS),
- "-o", tmpfile.path, "--protobuf"}));
- ASSERT_TRUE(ReportSampleCmd()->Run(
- {"--dump-protobuf-report", tmpfile.path, "-o", tmpfile2.path}));
+ std::vector<std::string> args = {"-i", GetTestData(test_data_file), "-o", tmpfile.path,
+ "--protobuf"};
+ args.insert(args.end(), extra_args.begin(), extra_args.end());
+ ASSERT_TRUE(ReportSampleCmd()->Run(args));
+ ASSERT_TRUE(ReportSampleCmd()->Run({"--dump-protobuf-report", tmpfile.path,
+ "-o", tmpfile2.path}));
+ ASSERT_TRUE(android::base::ReadFileToString(tmpfile2.path, protobuf_report));
+}
+
+TEST(cmd_report_sample, protobuf_option) {
std::string data;
- ASSERT_TRUE(android::base::ReadFileToString(tmpfile2.path, &data));
+ GetProtobufReport(PERF_DATA_WITH_SYMBOLS, &data);
ASSERT_NE(data.find("magic: SIMPLEPERF"), std::string::npos);
ASSERT_NE(data.find("version: 1"), std::string::npos);
ASSERT_NE(data.find("file:"), std::string::npos);
}
TEST(cmd_report_sample, no_skipped_file_id) {
- TemporaryFile tmpfile;
- TemporaryFile tmpfile2;
- ASSERT_TRUE(ReportSampleCmd()->Run({"-i", GetTestData(PERF_DATA_WITH_WRONG_IP_IN_CALLCHAIN),
- "-o", tmpfile.path, "--protobuf"}));
- ASSERT_TRUE(ReportSampleCmd()->Run({"--dump-protobuf-report", tmpfile.path, "-o",
- tmpfile2.path}));
- // If wrong ips in callchain are omitted, "unknown" file path will not be generated.
std::string data;
- ASSERT_TRUE(android::base::ReadFileToString(tmpfile2.path, &data));
+ GetProtobufReport(PERF_DATA_WITH_WRONG_IP_IN_CALLCHAIN, &data);
+ // If wrong ips in callchain are omitted, "unknown" file path will not be generated.
ASSERT_EQ(data.find("unknown"), std::string::npos);
}
TEST(cmd_report_sample, sample_has_event_count) {
- TemporaryFile tmpfile;
- TemporaryFile tmpfile2;
- ASSERT_TRUE(ReportSampleCmd()->Run({"-i", GetTestData(PERF_DATA_WITH_SYMBOLS),
- "-o", tmpfile.path, "--protobuf"}));
- ASSERT_TRUE(ReportSampleCmd()->Run(
- {"--dump-protobuf-report", tmpfile.path, "-o", tmpfile2.path}));
std::string data;
- ASSERT_TRUE(android::base::ReadFileToString(tmpfile2.path, &data));
+ GetProtobufReport(PERF_DATA_WITH_SYMBOLS, &data);
ASSERT_NE(data.find("event_count:"), std::string::npos);
}
TEST(cmd_report_sample, has_thread_record) {
- TemporaryFile tmpfile;
- TemporaryFile tmpfile2;
- ASSERT_TRUE(ReportSampleCmd()->Run({"-i", GetTestData(PERF_DATA_WITH_SYMBOLS),
- "-o", tmpfile.path, "--protobuf"}));
- ASSERT_TRUE(ReportSampleCmd()->Run(
- {"--dump-protobuf-report", tmpfile.path, "-o", tmpfile2.path}));
std::string data;
- ASSERT_TRUE(android::base::ReadFileToString(tmpfile2.path, &data));
+ GetProtobufReport(PERF_DATA_WITH_SYMBOLS, &data);
ASSERT_NE(data.find("thread:"), std::string::npos);
}
TEST(cmd_report_sample, trace_offcpu) {
- TemporaryFile tmpfile;
- TemporaryFile tmpfile2;
- ASSERT_TRUE(ReportSampleCmd()->Run({"-i", GetTestData(PERF_DATA_WITH_TRACE_OFFCPU),
- "-o", tmpfile.path, "--protobuf"}));
- ASSERT_TRUE(ReportSampleCmd()->Run(
- {"--dump-protobuf-report", tmpfile.path, "-o", tmpfile2.path}));
std::string data;
- ASSERT_TRUE(android::base::ReadFileToString(tmpfile2.path, &data));
+ GetProtobufReport(PERF_DATA_WITH_TRACE_OFFCPU, &data);
ASSERT_NE(data.find("event_type: sched:sched_switch"), std::string::npos);
}
TEST(cmd_report_sample, have_clear_callchain_end_in_protobuf_output) {
- TemporaryFile tmpfile;
- TemporaryFile tmpfile2;
- ASSERT_TRUE(ReportSampleCmd()->Run({"-i", GetTestData(PERF_DATA_WITH_TRACE_OFFCPU),
- "--show-callchain", "-o", tmpfile.path, "--protobuf"}));
- ASSERT_TRUE(ReportSampleCmd()->Run(
- {"--dump-protobuf-report", tmpfile.path, "-o", tmpfile2.path}));
std::string data;
- ASSERT_TRUE(android::base::ReadFileToString(tmpfile2.path, &data));
+ GetProtobufReport(PERF_DATA_WITH_TRACE_OFFCPU, &data, {"--show-callchain"});
ASSERT_NE(data.find("__libc_init"), std::string::npos);
ASSERT_EQ(data.find("_start_main"), std::string::npos);
}
+
+TEST(cmd_report_sample, app_package_name_in_meta_info) {
+ std::string data;
+ GetProtobufReport(PERF_DATA_WITH_APP_PACKAGE_NAME, &data);
+ ASSERT_NE(data.find("app_package_name: com.google.sample.tunnel"), std::string::npos);
+}
diff --git a/simpleperf/get_test_data.h b/simpleperf/get_test_data.h
index 779afcdf..5e23a6ad 100644
--- a/simpleperf/get_test_data.h
+++ b/simpleperf/get_test_data.h
@@ -123,4 +123,7 @@ static const std::string PERF_DATA_SCHED_STAT_RUNTIME = "perf_sched_stat_runtime
// generated by `simpleperf record -e (about 200 tracepoint events) sleep 1`.
static const std::string PERF_DATA_WITH_BIG_TRACE_DATA = "perf_with_big_trace_data.data";
+// generated by `simpleperf record --app com.google.sample.tunnel --duration 1`.
+static const std::string PERF_DATA_WITH_APP_PACKAGE_NAME = "perf_with_app_package_name.data";
+
#endif // SIMPLE_PERF_GET_TEST_DATA_H_
diff --git a/simpleperf/report_sample.proto b/simpleperf/report_sample.proto
index a6612a96..1a4886ed 100644
--- a/simpleperf/report_sample.proto
+++ b/simpleperf/report_sample.proto
@@ -79,6 +79,7 @@ message Thread {
message MetaInfo {
repeated string event_type = 1;
+ optional string app_package_name = 2;
}
message Record {
diff --git a/simpleperf/testdata/perf_with_app_package_name.data b/simpleperf/testdata/perf_with_app_package_name.data
new file mode 100644
index 00000000..c9c61de5
--- /dev/null
+++ b/simpleperf/testdata/perf_with_app_package_name.data
Binary files differ