diff --git a/include/perf_file_format.h b/include/perf_file_format.h index e7016fc9790d067570f1b5ede83f5d0e0d64a2f9..84f28f9a451f9721e467f4d7c7d5c6716696079c 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 bf1c1e0443f8ea2e93d2b8a48fcd4da4d617c82d..739b73046c416d818c61e04899e0b7affd7761ac 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 d6eeb653b934be17b21f27956064f005b606f2f6..293f1737045b6581ac0dfc386b8757f66f95a576 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;