| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| syntax = "proto2"; |
| |
| option optimize_for = LITE_RUNTIME; |
| |
| package metrics; |
| |
| // Next tag: 10 |
| message MemoryLeakReportProto { |
| // The call stack at which the leak was found. This is a list of offsets |
| // within the program binary. The first entry is the deepest level of the call |
| // stack. |
| // |
| // Some call stack entries may not be within the Chrome binary (e.g. |
| // JavaScript code). Those entries are given as the absolute offset in memory. |
| // |
| // The offsets within Chrome are determined by whether the original call stack |
| // address was within the executable region of the Chrome binary's mapping in |
| // memory. To symbolize these results, look up these values as offsets within |
| // the Chrome debug binary. If the value doesn't fit within the Chrome |
| // binary's offset range, then it is considered to be from another binary. |
| repeated uint64 call_stack = 1; |
| |
| // Size of the memory allocation involved in the leak. |
| optional uint32 size_bytes = 2; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| // Contains all parameters passed to the leak detector during initialization. |
| // Since these are known at the beginning, this message can be stored locally |
| // and then added to generated memory leak report protobufs. |
| // |
| // Next tag: 6 |
| message Params { |
| // The rate at which allocations are pseudorandomly sampled. Ranges from 0 |
| // to 1. A rate of 1 means all incoming allocations are sampled by the leak |
| // detector, which is the maximum possible. |
| optional float sampling_rate = 1; |
| |
| // The max depth to which the call stacks were unwound by the leak detector. |
| // This may be greater than the size of |call_stack|. |
| optional uint32 max_stack_depth = 2; |
| |
| // The leak analysis takes place every so often, with an interval based on |
| // the number of bytes allocated. This is independent of the sampling rate |
| // as it is computed from allocation sizes before sampling. |
| optional uint64 analysis_interval_bytes = 3; |
| |
| // Suspicion thresholds used in leak analysis for size and call stacks, |
| // respectively. If an allocation size or call stack is suspected this many |
| // times in a row, the leak analysis escalates to the next level. For |
| // allocation sizes, the next level is to start analyzing by call stack. For |
| // call stacks, the next level is to generate a memory leak report. |
| optional uint32 size_suspicion_threshold = 4; |
| optional uint32 call_stack_suspicion_threshold = 5; |
| } |
| |
| // Parameters used to initialize the leak detector. |
| optional Params params = 3; |
| |
| // The type of Chrome process on which this leak report was generated. |
| enum ProcessType { |
| UNKNOWN_PROCESS = 0; |
| BROWSER_PROCESS = 1; |
| RENDERER_PROCESS = 2; |
| } |
| optional ProcessType source_process = 5; |
| |
| // The build ID of the Chrome binary from which this leak report was obtained. |
| // The build ID is typically a 16- or 20-byte hash that is generated by the |
| // compiler that built the binary. This value will be read directly from the |
| // GNU build notes section of the Chrome binary. |
| optional bytes build_id = 6; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| // Represents a single snapshot of the internal bookkeeping of the Runtime |
| // Memory Leak Detector, which tracks the number of extant allocations (a |
| // block of heap memory that has been allocated but not yet freed). |
| // |
| // Next tag: 3 |
| message AllocationBreakdown { |
| // Table of number of extant allocations for each allocation size. The i-th |
| // entry in the vector is the net number of allocations for sizes in the |
| // range [i * 4, i * 4 + 3]. |
| repeated uint32 counts_by_size = 1; |
| |
| // The number of extant allocations with size = |size_bytes| and made from |
| // the call site given by |call_stack|. If it is not set, it means tracking |
| // of allocs per call site for allocation size = |size_bytes| has not yet |
| // begun at the time of this entry. |
| optional uint32 count_for_call_stack = 2; |
| } |
| |
| // A record of past allocation data leading up to the circumstances that |
| // generated the current leak report. |
| // |
| // A new snapshot is taken every |analysis_interval_bytes| of memory |
| // allocation. The oldest record is at the beginning. The most recent record, |
| // taken at the time the report was generated, is at the end. |
| repeated AllocationBreakdown alloc_breakdown_history = 4; |
| |
| // The following two fields describe the last increasing trend in the number |
| // of allocations from the size and call stack that generated this |
| // leak report. |
| // |
| // |num_rising_intervals| equals timeslot_now - timeslot_drop, |
| // where timeslot_drop is the timeslot number of the last frame that saw |
| // a drop in the number of allocations, or the first frame in the history |
| // if there were no drops (history is cleared when the net number of |
| // allocations hits 0). |
| // If it is < 32, it will be visible in the allocation history graph. |
| // If it is >= 32, it will not be seen in the graph. |
| // E.g. for history [3,2,4,4,7] |num_rising_intervals| equals 3. |
| optional uint32 num_rising_intervals = 7; |
| |
| // Indicates the magnitude of the current uptrend in allocations. |
| // E.g. for history [3,2,4,4,7] |num_allocs_increase| equals 5. |
| optional uint32 num_allocs_increase = 8; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| // Contains additional data about the memory usage from the OS. |
| // There is no need to store the total system memory as it is |
| // available under SystemProfileProto::Hardware::system_ram_mb. |
| // |
| // Next tag: 3 |
| message MemoryUsageInfo { |
| // How much available physical memory the system has. |
| optional uint64 available_ram_mb = 1; |
| |
| // Total private working set memory across all Chrome processes. |
| optional uint64 chrome_ram_usage_mb = 2; |
| } |
| |
| // Information about the memory usage from the OS collected right after |
| // the leak report was created in the leak detector. |
| optional MemoryUsageInfo memory_usage_info = 9; |
| } |