summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2023-05-04 17:32:53 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-05-04 17:32:53 +0000
commit00324aefa10457811e91ab4c96f4bcdd6075b963 (patch)
treeb6d00325b8dab974d9ee47ae5005c033962f2963
parent58046a2a5755ec970013b997fd387ba9eebe1b21 (diff)
parentc04455b76d4d667d56d4902674043ca4e5d137e0 (diff)
downloadextras-00324aefa10457811e91ab4c96f4bcdd6075b963.tar.gz
simpleperf: inject cmd: accept missing aux data am: c04455b76d
Original change: https://googleplex-android-review.googlesource.com/c/platform/system/extras/+/23008003 Change-Id: Id04e175c199fcf620281a2fcf42f07874adae884 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--simpleperf/cmd_dumprecord.cpp5
-rw-r--r--simpleperf/cmd_inject.cpp6
-rw-r--r--simpleperf/cmd_inject_test.cpp8
-rw-r--r--simpleperf/cmd_record.cpp3
-rw-r--r--simpleperf/record_file.h7
-rw-r--r--simpleperf/record_file_reader.cpp23
-rw-r--r--simpleperf/testdata/etm/perf_with_missing_aux_data.databin0 -> 24552 bytes
7 files changed, 35 insertions, 17 deletions
diff --git a/simpleperf/cmd_dumprecord.cpp b/simpleperf/cmd_dumprecord.cpp
index 9a71182f..909b7a62 100644
--- a/simpleperf/cmd_dumprecord.cpp
+++ b/simpleperf/cmd_dumprecord.cpp
@@ -423,8 +423,9 @@ bool DumpRecordCommand::DumpAuxData(const AuxRecord& aux) {
size_t size = aux.data->aux_size;
if (size > 0) {
std::vector<uint8_t> data;
- if (!record_file_reader_->ReadAuxData(aux.Cpu(), aux.data->aux_offset, size, &data)) {
- return false;
+ bool error = false;
+ if (!record_file_reader_->ReadAuxData(aux.Cpu(), aux.data->aux_offset, size, data, error)) {
+ return !error;
}
if (!etm_decoder_) {
LOG(ERROR) << "ETMDecoder isn't created";
diff --git a/simpleperf/cmd_inject.cpp b/simpleperf/cmd_inject.cpp
index e00f4826..47cfc629 100644
--- a/simpleperf/cmd_inject.cpp
+++ b/simpleperf/cmd_inject.cpp
@@ -317,10 +317,10 @@ class PerfDataReader {
}
size_t aux_size = aux->data->aux_size;
if (aux_size > 0) {
+ bool error = false;
if (!record_file_reader_->ReadAuxData(aux->Cpu(), aux->data->aux_offset, aux_size,
- &aux_data_buffer_)) {
- LOG(ERROR) << "failed to read aux data in " << filename_;
- return false;
+ aux_data_buffer_, error)) {
+ return !error;
}
if (!etm_decoder_) {
LOG(ERROR) << "ETMDecoder isn't created";
diff --git a/simpleperf/cmd_inject_test.cpp b/simpleperf/cmd_inject_test.cpp
index 6c6161c1..6b799f5f 100644
--- a/simpleperf/cmd_inject_test.cpp
+++ b/simpleperf/cmd_inject_test.cpp
@@ -231,3 +231,11 @@ TEST(cmd_inject, report_warning_when_overflow) {
ASSERT_NE(capture.str().find(WARNING_MSG), std::string::npos);
ASSERT_NE(autofdo_data.find("106c->1074:18446744073709551615"), std::string::npos);
}
+
+TEST(cmd_inject, accept_missing_aux_data) {
+ // Recorded with "-e cs-etm:u --user-buffer-size 64k sleep 1".
+ std::string perf_data = GetTestData("etm/perf_with_missing_aux_data.data");
+ TemporaryFile tmpfile;
+ close(tmpfile.release());
+ ASSERT_TRUE(RunInjectCmd({"--output", "branch-list", "-i", perf_data, "-o", tmpfile.path}));
+}
diff --git a/simpleperf/cmd_record.cpp b/simpleperf/cmd_record.cpp
index e168305e..2d0d26bc 100644
--- a/simpleperf/cmd_record.cpp
+++ b/simpleperf/cmd_record.cpp
@@ -848,7 +848,8 @@ bool RecordCommand::PostProcessRecording(const std::vector<std::string>& args) {
if (event_selection_set_.HasAuxTrace()) {
LOG(INFO) << "Aux data traced: " << record_stat.aux_data_size;
if (record_stat.lost_aux_data_size != 0) {
- LOG(INFO) << "Aux data lost in user space: " << record_stat.lost_aux_data_size;
+ LOG(INFO) << "Aux data lost in user space: " << record_stat.lost_aux_data_size
+ << ", consider increasing userspace buffer size(--user-buffer-size).";
}
} else {
// Here we report all lost records as samples. This isn't accurate. Because records like
diff --git a/simpleperf/record_file.h b/simpleperf/record_file.h
index 51c7b245..fa696269 100644
--- a/simpleperf/record_file.h
+++ b/simpleperf/record_file.h
@@ -188,7 +188,12 @@ class RecordFileReader {
bool LoadBuildIdAndFileFeatures(ThreadTree& thread_tree);
- bool ReadAuxData(uint32_t cpu, uint64_t aux_offset, size_t size, std::vector<uint8_t>* buf);
+ // Read aux data into buf.
+ // When read successfully, return true and set error to false.
+ // When the data isn't available, return false and set error to false.
+ // When having error, return false and set error to true.
+ bool ReadAuxData(uint32_t cpu, uint64_t aux_offset, size_t size, std::vector<uint8_t>& buf,
+ bool& error);
bool Close();
diff --git a/simpleperf/record_file_reader.cpp b/simpleperf/record_file_reader.cpp
index d7f1d5eb..8f54e65d 100644
--- a/simpleperf/record_file_reader.cpp
+++ b/simpleperf/record_file_reader.cpp
@@ -754,18 +754,22 @@ bool RecordFileReader::LoadBuildIdAndFileFeatures(ThreadTree& thread_tree) {
}
bool RecordFileReader::ReadAuxData(uint32_t cpu, uint64_t aux_offset, size_t size,
- std::vector<uint8_t>* buf) {
+ std::vector<uint8_t>& buf, bool& error) {
+ error = false;
long saved_pos = ftell(record_fp_);
if (saved_pos == -1) {
PLOG(ERROR) << "ftell() failed";
+ error = true;
return false;
}
OverflowResult aux_end = SafeAdd(aux_offset, size);
if (aux_end.overflow) {
LOG(ERROR) << "aux_end overflow";
+ error = true;
return false;
}
if (aux_data_location_.empty() && !BuildAuxDataLocation()) {
+ error = true;
return false;
}
AuxDataLocation* location = nullptr;
@@ -783,18 +787,21 @@ bool RecordFileReader::ReadAuxData(uint32_t cpu, uint64_t aux_offset, size_t siz
}
}
if (location == nullptr) {
- LOG(ERROR) << "failed to find file offset of aux data: cpu " << cpu << ", aux_offset "
- << aux_offset << ", size " << size;
+ // ETM data can be dropped when recording if the userspace buffer is full. This isn't an error.
+ LOG(INFO) << "aux data is missing: cpu " << cpu << ", aux_offset " << aux_offset << ", size "
+ << size << ". Probably the data is lost when recording.";
return false;
}
- if (buf->size() < size) {
- buf->resize(size);
+ if (buf.size() < size) {
+ buf.resize(size);
}
- if (!ReadAtOffset(aux_offset - location->aux_offset + location->file_offset, buf->data(), size)) {
+ if (!ReadAtOffset(aux_offset - location->aux_offset + location->file_offset, buf.data(), size)) {
+ error = true;
return false;
}
if (fseek(record_fp_, saved_pos, SEEK_SET) != 0) {
PLOG(ERROR) << "fseek() failed";
+ error = true;
return false;
}
return true;
@@ -802,10 +809,6 @@ bool RecordFileReader::ReadAuxData(uint32_t cpu, uint64_t aux_offset, size_t siz
bool RecordFileReader::BuildAuxDataLocation() {
std::vector<uint64_t> auxtrace_offset = ReadAuxTraceFeature();
- if (auxtrace_offset.empty()) {
- LOG(ERROR) << "failed to read auxtrace feature section";
- return false;
- }
std::unique_ptr<char[]> buf(new char[AuxTraceRecord::Size()]);
for (auto offset : auxtrace_offset) {
if (!ReadAtOffset(offset, buf.get(), AuxTraceRecord::Size())) {
diff --git a/simpleperf/testdata/etm/perf_with_missing_aux_data.data b/simpleperf/testdata/etm/perf_with_missing_aux_data.data
new file mode 100644
index 00000000..781a0a35
--- /dev/null
+++ b/simpleperf/testdata/etm/perf_with_missing_aux_data.data
Binary files differ