#include <stdint.h> #include <stdlib.h> #include <string.h> #include "memprof_rawprofile.h" #include "profile/MemProfData.inc" #include "sanitizer_common/sanitizer_allocator_internal.h" #include "sanitizer_common/sanitizer_array_ref.h" #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_linux.h" #include "sanitizer_common/sanitizer_procmaps.h" #include "sanitizer_common/sanitizer_stackdepot.h" #include "sanitizer_common/sanitizer_stackdepotbase.h" #include "sanitizer_common/sanitizer_stacktrace.h" #include "sanitizer_common/sanitizer_vector.h" namespace __memprof { Vector; MemInfoBlock; SegmentEntry; Header; namespace { template <class T> char *WriteBytes(const T &Pod, char *Buffer) { … } void RecordStackId(const uptr Key, UNUSED LockedMemInfoBlock *const &MIB, void *Arg) { … } } // namespace u64 SegmentSizeBytes(ArrayRef<LoadedModule> Modules) { … } // The segment section uses the following format: // ---------- Segment Info // Num Entries // ---------- Segment Entry // Start // End // Offset // UuidSize // Uuid 32B // ---------- // ... void SerializeSegmentsToBuffer(ArrayRef<LoadedModule> Modules, const u64 ExpectedNumBytes, char *&Buffer) { … } u64 StackSizeBytes(const Vector<u64> &StackIds) { … } // The stack info section uses the following format: // // ---------- Stack Info // Num Entries // ---------- Stack Entry // Num Stacks // PC1 // PC2 // ... // ---------- void SerializeStackToBuffer(const Vector<u64> &StackIds, const u64 ExpectedNumBytes, char *&Buffer) { … } // The MIB section has the following format: // ---------- MIB Info // Num Entries // ---------- MIB Entry 0 // Alloc Count // ... // ---- AccessHistogram Entry 0 // ... // ---- AccessHistogram Entry AccessHistogramSize - 1 // ---------- MIB Entry 1 // Alloc Count // ... // ---- AccessHistogram Entry 0 // ... // ---- AccessHistogram Entry AccessHistogramSize - 1 // ---------- void SerializeMIBInfoToBuffer(MIBMapTy &MIBMap, const Vector<u64> &StackIds, const u64 ExpectedNumBytes, char *&Buffer) { … } // Format // ---------- Header // Magic // Version // Total Size // Segment Offset // MIB Info Offset // Stack Offset // ---------- Segment Info // Num Entries // ---------- Segment Entry // Start // End // Offset // BuildID 32B // ---------- // ... // ---------- // Optional Padding Bytes // ---------- MIB Info // Num Entries // ---------- MIB Entry // Alloc Count // ... // ---- AccessHistogram Entry 0 // ... // ---- AccessHistogram Entry AccessHistogramSize - 1 // ---------- MIB Entry 1 // Alloc Count // ... // ---- AccessHistogram Entry 0 // ... // ---- AccessHistogram Entry AccessHistogramSize - 1 // Optional Padding Bytes // ---------- Stack Info // Num Entries // ---------- Stack Entry // Num Stacks // PC1 // PC2 // ... // ---------- // Optional Padding Bytes // ... u64 SerializeToRawProfile(MIBMapTy &MIBMap, ArrayRef<LoadedModule> Modules, char *&Buffer) { … } } // namespace __memprof