Simpleperf: check build id in report command.
1. refactor BuildId type.
2. check build id before parsing symbols in report command.
Bug: 22179177
Change-Id: Iefc797a88d4a168e109db786105120c8d6914369
diff --git a/simpleperf/cmd_report.cpp b/simpleperf/cmd_report.cpp
index 87479bd..5d17715 100644
--- a/simpleperf/cmd_report.cpp
+++ b/simpleperf/cmd_report.cpp
@@ -296,8 +296,9 @@
if (!ReadEventAttrFromRecordFile()) {
return false;
}
- ReadSampleTreeFromRecordFile();
+ // Read features first to prepare build ids used when building SampleTree.
ReadFeaturesFromRecordFile();
+ ReadSampleTreeFromRecordFile();
// 3. Show collected information.
PrintReport();
@@ -306,6 +307,8 @@
}
bool ReportCommand::ParseOptions(const std::vector<std::string>& args) {
+ bool demangle = true;
+ std::string symfs_dir;
bool print_sample_count = false;
std::vector<std::string> sort_keys = {"comm", "pid", "tid", "dso", "symbol"};
for (size_t i = 0; i < args.size(); ++i) {
@@ -323,7 +326,7 @@
print_sample_count = true;
} else if (args[i] == "--no-demangle") {
- DsoFactory::SetDemangle(false);
+ demangle = false;
} else if (args[i] == "--sort") {
if (!NextArgumentOrError(args, &i)) {
@@ -334,15 +337,18 @@
if (!NextArgumentOrError(args, &i)) {
return false;
}
- if (!DsoFactory::SetSymFsDir(args[i])) {
- return false;
- }
+ symfs_dir = args[i];
} else {
ReportUnknownOption(args, i);
return false;
}
}
+ DsoFactory::SetDemangle(demangle);
+ if (!DsoFactory::SetSymFsDir(symfs_dir)) {
+ return false;
+ }
+
if (!accumulate_callchain_) {
displayable_items_.push_back(
std::unique_ptr<Displayable>(new SelfOverheadItem(*sample_tree_, "Overhead")));
@@ -495,6 +501,12 @@
}
void ReportCommand::ReadFeaturesFromRecordFile() {
+ std::vector<BuildIdRecord> records = record_file_reader_->ReadBuildIdFeature();
+ std::vector<std::pair<std::string, BuildId>> build_ids;
+ for (auto& r : records) {
+ build_ids.push_back(std::make_pair(r.filename, r.build_id));
+ }
+ DsoFactory::SetBuildIds(build_ids);
std::vector<std::string> cmdline = record_file_reader_->ReadCmdlineFeature();
if (!cmdline.empty()) {
record_cmdline_ = android::base::Join(cmdline, ' ');