diff options
author | Yabin Cui <yabinc@google.com> | 2018-04-10 17:05:30 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2018-04-10 17:49:15 -0700 |
commit | 0a59929031765d365a5ffa64a19310c917f12aef (patch) | |
tree | 7a76cb63cd4d908df3951605db37df0d3859c131 | |
parent | 246c78073678c8d391caaac0138043673e3924fd (diff) | |
download | extras-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.cpp | 3 | ||||
-rw-r--r-- | simpleperf/cmd_report_sample.cpp | 24 | ||||
-rw-r--r-- | simpleperf/cmd_report_sample_test.cpp | 67 | ||||
-rw-r--r-- | simpleperf/get_test_data.h | 3 | ||||
-rw-r--r-- | simpleperf/report_sample.proto | 1 | ||||
-rw-r--r-- | simpleperf/testdata/perf_with_app_package_name.data | bin | 0 -> 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 Binary files differnew file mode 100644 index 00000000..c9c61de5 --- /dev/null +++ b/simpleperf/testdata/perf_with_app_package_name.data |