From 3bd184da63984c52e4b8c91add1c4fd3c1f23d40 Mon Sep 17 00:00:00 2001 From: wenlong12 Date: Mon, 28 Mar 2022 17:22:10 +0800 Subject: [PATCH] fix record command failed issue Signed-off-by: wenlong12 Signed-off-by: wenlong12 --- include/perf_file_format.h | 4 ++-- include/utilities.h | 2 ++ src/perf_events.cpp | 21 ++++++++++----------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/include/perf_file_format.h b/include/perf_file_format.h index e7016fc..84f28f9 100644 --- a/include/perf_file_format.h +++ b/include/perf_file_format.h @@ -212,8 +212,8 @@ public: private: // issue from fuzz test - const size_t MAX_SYMBOLS_FILE_NUMBER = 100; - const size_t MAX_SYMBOLS_NUMBER = 1000; + const size_t MAX_SYMBOLS_FILE_NUMBER = 300; + const size_t MAX_SYMBOLS_NUMBER = 3000; }; // NRCPUS: A structure defining the number of CPUs. diff --git a/include/utilities.h b/include/utilities.h index bf1c1e0..739b730 100644 --- a/include/utilities.h +++ b/include/utilities.h @@ -221,6 +221,8 @@ std::string PlatformPathConvert(const std::string &path); // some time u will meet signal 7 (SIGBUS), code 1 (BUS_ADRALN) in 32 or 64 arch cpu #define HIPERF_BUF_ALIGN alignas(64) +#define ALIGN(size, align) (((size) + (align) - 1) & (~((align) - 1))) + uint32_t RoundUp(uint32_t x, const int align); // data convert function diff --git a/src/perf_events.cpp b/src/perf_events.cpp index d6eeb65..293f173 100644 --- a/src/perf_events.cpp +++ b/src/perf_events.cpp @@ -1354,10 +1354,10 @@ size_t PerfEvents::GetStackSizePosInSampleRecord(MmapFd &mmap) bool PerfEvents::CutStackAndMove(MmapFd &mmap) { + constexpr uint32_t alignSize = 64; if (!(mmap.attr->sample_type & PERF_SAMPLE_STACK_USER)) { return false; } - size_t stackSizePos = GetStackSizePosInSampleRecord(mmap); uint64_t stackSize = 0; GetRecordFieldFromMmap(mmap, &stackSize, mmap.mmapPage->data_tail + stackSizePos, @@ -1368,16 +1368,17 @@ bool PerfEvents::CutStackAndMove(MmapFd &mmap) size_t dynSizePos = stackSizePos + sizeof(uint64_t) + stackSize; uint64_t dynSize = 0; GetRecordFieldFromMmap(mmap, &dynSize, mmap.mmapPage->data_tail + dynSizePos, sizeof(dynSize)); - if (dynSize >= stackSize) { + uint64_t newStackSize = std::min(ALIGN(dynSize, alignSize), stackSize); + if (newStackSize >= stackSize) { return false; } - + HLOGM("stackSize %" PRIx64 " dynSize %" PRIx64 " newStackSize %" PRIx64 "\n", stackSize, dynSize, newStackSize); // move and cut stack_data // mmap: |<+++copy1+++>|<++++++copy2++++++>|<---------------cut--------------->|<+++copy3+++>| // ^ ^ ^ ^ // new_header stackSizePos dynSizePos uint16_t recordSize = mmap.header.size; - mmap.header.size -= stackSize - dynSize; + mmap.header.size -= stackSize - newStackSize; // reduce the stack size uint8_t *buf = recordBuf_->AllocForWrite(mmap.header.size); // copy1: new_header if (memcpy_s(buf, sizeof(perf_event_header), &(mmap.header), sizeof(perf_event_header)) != 0) { @@ -1385,20 +1386,18 @@ bool PerfEvents::CutStackAndMove(MmapFd &mmap) sizeof(perf_event_header)); } size_t copyPos = sizeof(perf_event_header); - size_t copySize = stackSizePos - sizeof(perf_event_header) + sizeof(stackSize) + dynSize; - // copy2 + size_t copySize = stackSizePos - sizeof(perf_event_header) + sizeof(stackSize) + newStackSize; + // copy2: copy stack_size, data[stack_size], GetRecordFieldFromMmap(mmap, buf + copyPos, mmap.mmapPage->data_tail + copyPos, copySize); copyPos += copySize; - // copy3 + // copy3: copy dyn_size GetRecordFieldFromMmap(mmap, buf + copyPos, mmap.mmapPage->data_tail + dynSizePos, recordSize - dynSizePos); // update stack_size - if (memcpy_s(buf + stackSizePos, sizeof(dynSize), &(dynSize), sizeof(dynSize)) != 0) { - HLOGEP("memcpy_s %p to %p failed. size %zd", &(dynSize), buf + stackSizePos, - sizeof(dynSize)); + if (memcpy_s(buf + stackSizePos, sizeof(stackSize), &(newStackSize), sizeof(newStackSize)) != 0) { + HLOGEP("memcpy_s %p to %p failed. size %zd", &(newStackSize), buf + stackSizePos, sizeof(newStackSize)); } recordBuf_->EndWrite(); - __sync_synchronize(); mmap.mmapPage->data_tail += recordSize; mmap.dataSize -= recordSize; -- Gitee