diff options
author | Yabin Cui <yabinc@google.com> | 2023-05-04 17:32:53 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-05-04 17:32:53 +0000 |
commit | 00324aefa10457811e91ab4c96f4bcdd6075b963 (patch) | |
tree | b6d00325b8dab974d9ee47ae5005c033962f2963 | |
parent | 58046a2a5755ec970013b997fd387ba9eebe1b21 (diff) | |
parent | c04455b76d4d667d56d4902674043ca4e5d137e0 (diff) | |
download | extras-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.cpp | 5 | ||||
-rw-r--r-- | simpleperf/cmd_inject.cpp | 6 | ||||
-rw-r--r-- | simpleperf/cmd_inject_test.cpp | 8 | ||||
-rw-r--r-- | simpleperf/cmd_record.cpp | 3 | ||||
-rw-r--r-- | simpleperf/record_file.h | 7 | ||||
-rw-r--r-- | simpleperf/record_file_reader.cpp | 23 | ||||
-rw-r--r-- | simpleperf/testdata/etm/perf_with_missing_aux_data.data | bin | 0 -> 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 Binary files differnew file mode 100644 index 00000000..781a0a35 --- /dev/null +++ b/simpleperf/testdata/etm/perf_with_missing_aux_data.data |