libv8 3.16.14.19.1-universal-darwin → 8.4.255.0.1-universal-darwin
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/libv8/location.rb +15 -7
- data/ext/libv8/paths.rb +6 -19
- data/lib/libv8/version.rb +1 -1
- data/vendor/v8/include/cppgc/allocation.h +124 -0
- data/vendor/v8/include/cppgc/garbage-collected.h +192 -0
- data/vendor/v8/include/cppgc/heap.h +50 -0
- data/vendor/v8/include/cppgc/internal/accessors.h +26 -0
- data/vendor/v8/include/cppgc/internal/api-constants.h +44 -0
- data/vendor/v8/include/cppgc/internal/compiler-specific.h +26 -0
- data/vendor/v8/include/cppgc/internal/finalizer-trait.h +90 -0
- data/vendor/v8/include/cppgc/internal/gc-info.h +43 -0
- data/vendor/v8/include/cppgc/internal/logging.h +50 -0
- data/vendor/v8/include/cppgc/internal/persistent-node.h +109 -0
- data/vendor/v8/include/cppgc/internal/pointer-policies.h +133 -0
- data/vendor/v8/include/cppgc/internal/prefinalizer-handler.h +31 -0
- data/vendor/v8/include/cppgc/liveness-broker.h +50 -0
- data/vendor/v8/include/cppgc/macros.h +26 -0
- data/vendor/v8/include/cppgc/member.h +206 -0
- data/vendor/v8/include/cppgc/persistent.h +304 -0
- data/vendor/v8/include/cppgc/platform.h +31 -0
- data/vendor/v8/include/cppgc/prefinalizer.h +54 -0
- data/vendor/v8/include/cppgc/source-location.h +59 -0
- data/vendor/v8/include/cppgc/trace-trait.h +67 -0
- data/vendor/v8/include/cppgc/type-traits.h +109 -0
- data/vendor/v8/include/cppgc/visitor.h +137 -0
- data/vendor/v8/include/libplatform/libplatform-export.h +29 -0
- data/vendor/v8/include/libplatform/libplatform.h +85 -0
- data/vendor/v8/include/libplatform/v8-tracing.h +332 -0
- data/vendor/v8/include/v8-fast-api-calls.h +412 -0
- data/vendor/v8/include/v8-inspector-protocol.h +13 -0
- data/vendor/v8/include/v8-inspector.h +327 -0
- data/vendor/v8/include/v8-internal.h +389 -0
- data/vendor/v8/include/v8-platform.h +577 -0
- data/vendor/v8/include/v8-profiler.h +744 -265
- data/vendor/v8/include/v8-util.h +652 -0
- data/vendor/v8/include/v8-value-serializer-version.h +24 -0
- data/vendor/v8/include/v8-version-string.h +38 -0
- data/vendor/v8/include/v8-version.h +20 -0
- data/vendor/v8/include/v8-wasm-trap-handler-posix.h +31 -0
- data/vendor/v8/include/v8-wasm-trap-handler-win.h +28 -0
- data/vendor/v8/include/v8.h +10228 -3147
- data/vendor/v8/include/v8config.h +465 -0
- data/vendor/v8/out.gn/libv8/obj/libv8_libbase.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/libv8_libplatform.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/libv8_monolith.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/third_party/icu/libicui18n.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/third_party/icu/libicuuc.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/third_party/zlib/google/libcompression_utils_portable.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/third_party/zlib/libchrome_zlib.a +0 -0
- metadata +52 -32
- data/ext/libv8/arch.rb +0 -43
- data/vendor/v8/include/v8-debug.h +0 -408
- data/vendor/v8/include/v8-preparser.h +0 -118
- data/vendor/v8/include/v8-testing.h +0 -105
- data/vendor/v8/include/v8stdint.h +0 -54
- data/vendor/v8/out/x64.release/libpreparser_lib.a +0 -0
- data/vendor/v8/out/x64.release/libv8_base.a +0 -0
- data/vendor/v8/out/x64.release/libv8_nosnapshot.a +0 -0
- data/vendor/v8/out/x64.release/libv8_snapshot.a +0 -0
@@ -1,82 +1,114 @@
|
|
1
1
|
// Copyright 2010 the V8 project authors. All rights reserved.
|
2
|
-
//
|
3
|
-
//
|
4
|
-
// met:
|
5
|
-
//
|
6
|
-
// * Redistributions of source code must retain the above copyright
|
7
|
-
// notice, this list of conditions and the following disclaimer.
|
8
|
-
// * Redistributions in binary form must reproduce the above
|
9
|
-
// copyright notice, this list of conditions and the following
|
10
|
-
// disclaimer in the documentation and/or other materials provided
|
11
|
-
// with the distribution.
|
12
|
-
// * Neither the name of Google Inc. nor the names of its
|
13
|
-
// contributors may be used to endorse or promote products derived
|
14
|
-
// from this software without specific prior written permission.
|
15
|
-
//
|
16
|
-
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
-
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18
|
-
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19
|
-
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
20
|
-
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21
|
-
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22
|
-
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
23
|
-
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
24
|
-
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
25
|
-
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
26
|
-
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
3
|
+
// found in the LICENSE file.
|
27
4
|
|
28
5
|
#ifndef V8_V8_PROFILER_H_
|
29
6
|
#define V8_V8_PROFILER_H_
|
30
7
|
|
31
|
-
#include
|
8
|
+
#include <limits.h>
|
9
|
+
#include <memory>
|
10
|
+
#include <unordered_set>
|
11
|
+
#include <vector>
|
32
12
|
|
33
|
-
#
|
34
|
-
// Setup for Windows DLL export/import. See v8.h in this directory for
|
35
|
-
// information on how to build/use V8 as a DLL.
|
36
|
-
#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
|
37
|
-
#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\
|
38
|
-
build configuration to ensure that at most one of these is set
|
39
|
-
#endif
|
13
|
+
#include "v8.h" // NOLINT(build/include_directory)
|
40
14
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
15
|
+
/**
|
16
|
+
* Profiler support for the V8 JavaScript engine.
|
17
|
+
*/
|
18
|
+
namespace v8 {
|
19
|
+
|
20
|
+
class HeapGraphNode;
|
21
|
+
struct HeapStatsUpdate;
|
48
22
|
|
49
|
-
|
23
|
+
using NativeObject = void*;
|
24
|
+
using SnapshotObjectId = uint32_t;
|
50
25
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
#define V8EXPORT __attribute__ ((visibility("default")))
|
56
|
-
#else
|
57
|
-
#define V8EXPORT
|
58
|
-
#endif
|
26
|
+
struct CpuProfileDeoptFrame {
|
27
|
+
int script_id;
|
28
|
+
size_t position;
|
29
|
+
};
|
59
30
|
|
60
|
-
|
31
|
+
namespace internal {
|
32
|
+
class CpuProfile;
|
33
|
+
} // namespace internal
|
61
34
|
|
35
|
+
} // namespace v8
|
36
|
+
|
37
|
+
#ifdef V8_OS_WIN
|
38
|
+
template class V8_EXPORT std::vector<v8::CpuProfileDeoptFrame>;
|
39
|
+
#endif
|
62
40
|
|
63
|
-
/**
|
64
|
-
* Profiler support for the V8 JavaScript engine.
|
65
|
-
*/
|
66
41
|
namespace v8 {
|
67
42
|
|
68
|
-
|
43
|
+
struct V8_EXPORT CpuProfileDeoptInfo {
|
44
|
+
/** A pointer to a static string owned by v8. */
|
45
|
+
const char* deopt_reason;
|
46
|
+
std::vector<CpuProfileDeoptFrame> stack;
|
47
|
+
};
|
48
|
+
|
49
|
+
} // namespace v8
|
50
|
+
|
51
|
+
#ifdef V8_OS_WIN
|
52
|
+
template class V8_EXPORT std::vector<v8::CpuProfileDeoptInfo>;
|
53
|
+
#endif
|
54
|
+
|
55
|
+
namespace v8 {
|
69
56
|
|
70
57
|
/**
|
71
58
|
* CpuProfileNode represents a node in a call graph.
|
72
59
|
*/
|
73
|
-
class
|
60
|
+
class V8_EXPORT CpuProfileNode {
|
74
61
|
public:
|
62
|
+
struct LineTick {
|
63
|
+
/** The 1-based number of the source line where the function originates. */
|
64
|
+
int line;
|
65
|
+
|
66
|
+
/** The count of samples associated with the source line. */
|
67
|
+
unsigned int hit_count;
|
68
|
+
};
|
69
|
+
|
70
|
+
// An annotation hinting at the source of a CpuProfileNode.
|
71
|
+
enum SourceType {
|
72
|
+
// User-supplied script with associated resource information.
|
73
|
+
kScript = 0,
|
74
|
+
// Native scripts and provided builtins.
|
75
|
+
kBuiltin = 1,
|
76
|
+
// Callbacks into native code.
|
77
|
+
kCallback = 2,
|
78
|
+
// VM-internal functions or state.
|
79
|
+
kInternal = 3,
|
80
|
+
// A node that failed to symbolize.
|
81
|
+
kUnresolved = 4,
|
82
|
+
};
|
83
|
+
|
75
84
|
/** Returns function name (empty string for anonymous functions.) */
|
76
|
-
|
85
|
+
Local<String> GetFunctionName() const;
|
86
|
+
|
87
|
+
/**
|
88
|
+
* Returns function name (empty string for anonymous functions.)
|
89
|
+
* The string ownership is *not* passed to the caller. It stays valid until
|
90
|
+
* profile is deleted. The function is thread safe.
|
91
|
+
*/
|
92
|
+
const char* GetFunctionNameStr() const;
|
93
|
+
|
94
|
+
/** Returns id of the script where function is located. */
|
95
|
+
int GetScriptId() const;
|
77
96
|
|
78
97
|
/** Returns resource name for script from where the function originates. */
|
79
|
-
|
98
|
+
Local<String> GetScriptResourceName() const;
|
99
|
+
|
100
|
+
/**
|
101
|
+
* Returns resource name for script from where the function originates.
|
102
|
+
* The string ownership is *not* passed to the caller. It stays valid until
|
103
|
+
* profile is deleted. The function is thread safe.
|
104
|
+
*/
|
105
|
+
const char* GetScriptResourceNameStr() const;
|
106
|
+
|
107
|
+
/**
|
108
|
+
* Return true if the script from where the function originates is flagged as
|
109
|
+
* being shared cross-origin.
|
110
|
+
*/
|
111
|
+
bool IsScriptSharedCrossOrigin() const;
|
80
112
|
|
81
113
|
/**
|
82
114
|
* Returns the number, 1-based, of the line where the function originates.
|
@@ -85,25 +117,40 @@ class V8EXPORT CpuProfileNode {
|
|
85
117
|
int GetLineNumber() const;
|
86
118
|
|
87
119
|
/**
|
88
|
-
* Returns
|
89
|
-
*
|
120
|
+
* Returns 1-based number of the column where the function originates.
|
121
|
+
* kNoColumnNumberInfo if no column number information is available.
|
90
122
|
*/
|
91
|
-
|
123
|
+
int GetColumnNumber() const;
|
92
124
|
|
93
125
|
/**
|
94
|
-
* Returns
|
95
|
-
* estimated by samples count.
|
126
|
+
* Returns the number of the function's source lines that collect the samples.
|
96
127
|
*/
|
97
|
-
|
128
|
+
unsigned int GetHitLineCount() const;
|
98
129
|
|
99
|
-
/** Returns the
|
100
|
-
|
130
|
+
/** Returns the set of source lines that collect the samples.
|
131
|
+
* The caller allocates buffer and responsible for releasing it.
|
132
|
+
* True if all available entries are copied, otherwise false.
|
133
|
+
* The function copies nothing if buffer is not large enough.
|
134
|
+
*/
|
135
|
+
bool GetLineTicks(LineTick* entries, unsigned int length) const;
|
101
136
|
|
102
|
-
/** Returns
|
103
|
-
|
137
|
+
/** Returns bailout reason for the function
|
138
|
+
* if the optimization was disabled for it.
|
139
|
+
*/
|
140
|
+
const char* GetBailoutReason() const;
|
104
141
|
|
105
|
-
/**
|
106
|
-
|
142
|
+
/**
|
143
|
+
* Returns the count of samples where the function was currently executing.
|
144
|
+
*/
|
145
|
+
unsigned GetHitCount() const;
|
146
|
+
|
147
|
+
/** Returns id of the node. The id is unique within the tree */
|
148
|
+
unsigned GetNodeId() const;
|
149
|
+
|
150
|
+
/**
|
151
|
+
* Gets the type of the source which the node was captured from.
|
152
|
+
*/
|
153
|
+
SourceType GetSourceType() const;
|
107
154
|
|
108
155
|
/** Returns child nodes count of the node. */
|
109
156
|
int GetChildrenCount() const;
|
@@ -111,106 +158,233 @@ class V8EXPORT CpuProfileNode {
|
|
111
158
|
/** Retrieves a child node by index. */
|
112
159
|
const CpuProfileNode* GetChild(int index) const;
|
113
160
|
|
161
|
+
/** Retrieves the ancestor node, or null if the root. */
|
162
|
+
const CpuProfileNode* GetParent() const;
|
163
|
+
|
164
|
+
/** Retrieves deopt infos for the node. */
|
165
|
+
const std::vector<CpuProfileDeoptInfo>& GetDeoptInfos() const;
|
166
|
+
|
114
167
|
static const int kNoLineNumberInfo = Message::kNoLineNumberInfo;
|
168
|
+
static const int kNoColumnNumberInfo = Message::kNoColumnInfo;
|
115
169
|
};
|
116
170
|
|
117
171
|
|
118
172
|
/**
|
119
|
-
* CpuProfile contains a CPU profile in a form of
|
120
|
-
*
|
121
|
-
* - bottom-up call graph (in backward direction).
|
173
|
+
* CpuProfile contains a CPU profile in a form of top-down call tree
|
174
|
+
* (from main() down to functions that do all the work).
|
122
175
|
*/
|
123
|
-
class
|
176
|
+
class V8_EXPORT CpuProfile {
|
124
177
|
public:
|
125
|
-
/** Returns CPU profile UID (assigned by the profiler.) */
|
126
|
-
unsigned GetUid() const;
|
127
|
-
|
128
178
|
/** Returns CPU profile title. */
|
129
|
-
|
130
|
-
|
131
|
-
/** Returns the root node of the bottom up call tree. */
|
132
|
-
const CpuProfileNode* GetBottomUpRoot() const;
|
179
|
+
Local<String> GetTitle() const;
|
133
180
|
|
134
181
|
/** Returns the root node of the top down call tree. */
|
135
182
|
const CpuProfileNode* GetTopDownRoot() const;
|
136
183
|
|
184
|
+
/**
|
185
|
+
* Returns number of samples recorded. The samples are not recorded unless
|
186
|
+
* |record_samples| parameter of CpuProfiler::StartCpuProfiling is true.
|
187
|
+
*/
|
188
|
+
int GetSamplesCount() const;
|
189
|
+
|
190
|
+
/**
|
191
|
+
* Returns profile node corresponding to the top frame the sample at
|
192
|
+
* the given index.
|
193
|
+
*/
|
194
|
+
const CpuProfileNode* GetSample(int index) const;
|
195
|
+
|
196
|
+
/**
|
197
|
+
* Returns the timestamp of the sample. The timestamp is the number of
|
198
|
+
* microseconds since some unspecified starting point.
|
199
|
+
* The point is equal to the starting point used by GetStartTime.
|
200
|
+
*/
|
201
|
+
int64_t GetSampleTimestamp(int index) const;
|
202
|
+
|
203
|
+
/**
|
204
|
+
* Returns time when the profile recording was started (in microseconds)
|
205
|
+
* since some unspecified starting point.
|
206
|
+
*/
|
207
|
+
int64_t GetStartTime() const;
|
208
|
+
|
209
|
+
/**
|
210
|
+
* Returns time when the profile recording was stopped (in microseconds)
|
211
|
+
* since some unspecified starting point.
|
212
|
+
* The point is equal to the starting point used by GetStartTime.
|
213
|
+
*/
|
214
|
+
int64_t GetEndTime() const;
|
215
|
+
|
137
216
|
/**
|
138
217
|
* Deletes the profile and removes it from CpuProfiler's list.
|
139
218
|
* All pointers to nodes previously returned become invalid.
|
140
|
-
* Profiles with the same uid but obtained using different
|
141
|
-
* security token are not deleted, but become inaccessible
|
142
|
-
* using FindProfile method. It is embedder's responsibility
|
143
|
-
* to call Delete on these profiles.
|
144
219
|
*/
|
145
220
|
void Delete();
|
146
221
|
};
|
147
222
|
|
223
|
+
enum CpuProfilingMode {
|
224
|
+
// In the resulting CpuProfile tree, intermediate nodes in a stack trace
|
225
|
+
// (from the root to a leaf) will have line numbers that point to the start
|
226
|
+
// line of the function, rather than the line of the callsite of the child.
|
227
|
+
kLeafNodeLineNumbers,
|
228
|
+
// In the resulting CpuProfile tree, nodes are separated based on the line
|
229
|
+
// number of their callsite in their parent.
|
230
|
+
kCallerLineNumbers,
|
231
|
+
};
|
232
|
+
|
233
|
+
// Determines how names are derived for functions sampled.
|
234
|
+
enum CpuProfilingNamingMode {
|
235
|
+
// Use the immediate name of functions at compilation time.
|
236
|
+
kStandardNaming,
|
237
|
+
// Use more verbose naming for functions without names, inferred from scope
|
238
|
+
// where possible.
|
239
|
+
kDebugNaming,
|
240
|
+
};
|
241
|
+
|
242
|
+
enum CpuProfilingLoggingMode {
|
243
|
+
// Enables logging when a profile is active, and disables logging when all
|
244
|
+
// profiles are detached.
|
245
|
+
kLazyLogging,
|
246
|
+
// Enables logging for the lifetime of the CpuProfiler. Calls to
|
247
|
+
// StartRecording are faster, at the expense of runtime overhead.
|
248
|
+
kEagerLogging,
|
249
|
+
};
|
148
250
|
|
149
251
|
/**
|
150
|
-
*
|
252
|
+
* Optional profiling attributes.
|
151
253
|
*/
|
152
|
-
class
|
254
|
+
class V8_EXPORT CpuProfilingOptions {
|
153
255
|
public:
|
256
|
+
// Indicates that the sample buffer size should not be explicitly limited.
|
257
|
+
static const unsigned kNoSampleLimit = UINT_MAX;
|
258
|
+
|
154
259
|
/**
|
155
|
-
*
|
156
|
-
*
|
157
|
-
*
|
158
|
-
*
|
159
|
-
*
|
160
|
-
*
|
260
|
+
* \param mode Type of computation of stack frame line numbers.
|
261
|
+
* \param max_samples The maximum number of samples that should be recorded by
|
262
|
+
* the profiler. Samples obtained after this limit will be
|
263
|
+
* discarded.
|
264
|
+
* \param sampling_interval_us controls the profile-specific target
|
265
|
+
* sampling interval. The provided sampling
|
266
|
+
* interval will be snapped to the next lowest
|
267
|
+
* non-zero multiple of the profiler's sampling
|
268
|
+
* interval, set via SetSamplingInterval(). If
|
269
|
+
* zero, the sampling interval will be equal to
|
270
|
+
* the profiler's sampling interval.
|
161
271
|
*/
|
272
|
+
CpuProfilingOptions(
|
273
|
+
CpuProfilingMode mode = kLeafNodeLineNumbers,
|
274
|
+
unsigned max_samples = kNoSampleLimit, int sampling_interval_us = 0,
|
275
|
+
MaybeLocal<Context> filter_context = MaybeLocal<Context>());
|
276
|
+
|
277
|
+
CpuProfilingMode mode() const { return mode_; }
|
278
|
+
unsigned max_samples() const { return max_samples_; }
|
279
|
+
int sampling_interval_us() const { return sampling_interval_us_; }
|
162
280
|
|
281
|
+
private:
|
282
|
+
friend class internal::CpuProfile;
|
283
|
+
|
284
|
+
bool has_filter_context() const { return !filter_context_.IsEmpty(); }
|
285
|
+
void* raw_filter_context() const;
|
286
|
+
|
287
|
+
CpuProfilingMode mode_;
|
288
|
+
unsigned max_samples_;
|
289
|
+
int sampling_interval_us_;
|
290
|
+
CopyablePersistentTraits<Context>::CopyablePersistent filter_context_;
|
291
|
+
};
|
292
|
+
|
293
|
+
/**
|
294
|
+
* Interface for controlling CPU profiling. Instance of the
|
295
|
+
* profiler can be created using v8::CpuProfiler::New method.
|
296
|
+
*/
|
297
|
+
class V8_EXPORT CpuProfiler {
|
298
|
+
public:
|
163
299
|
/**
|
164
|
-
*
|
165
|
-
*
|
300
|
+
* Creates a new CPU profiler for the |isolate|. The isolate must be
|
301
|
+
* initialized. The profiler object must be disposed after use by calling
|
302
|
+
* |Dispose| method.
|
166
303
|
*/
|
167
|
-
static
|
304
|
+
static CpuProfiler* New(Isolate* isolate,
|
305
|
+
CpuProfilingNamingMode = kDebugNaming,
|
306
|
+
CpuProfilingLoggingMode = kLazyLogging);
|
168
307
|
|
169
|
-
/**
|
170
|
-
|
171
|
-
|
172
|
-
|
308
|
+
/**
|
309
|
+
* Synchronously collect current stack sample in all profilers attached to
|
310
|
+
* the |isolate|. The call does not affect number of ticks recorded for
|
311
|
+
* the current top node.
|
312
|
+
*/
|
313
|
+
static void CollectSample(Isolate* isolate);
|
173
314
|
|
174
|
-
/**
|
175
|
-
|
176
|
-
|
177
|
-
|
315
|
+
/**
|
316
|
+
* Disposes the CPU profiler object.
|
317
|
+
*/
|
318
|
+
void Dispose();
|
178
319
|
|
179
320
|
/**
|
180
|
-
*
|
181
|
-
*
|
182
|
-
*
|
183
|
-
* title are silently ignored. While collecting a profile, functions
|
184
|
-
* from all security contexts are included in it. The token-based
|
185
|
-
* filtering is only performed when querying for a profile.
|
321
|
+
* Changes default CPU profiler sampling interval to the specified number
|
322
|
+
* of microseconds. Default interval is 1000us. This method must be called
|
323
|
+
* when there are no profiles being recorded.
|
186
324
|
*/
|
187
|
-
|
325
|
+
void SetSamplingInterval(int us);
|
188
326
|
|
189
327
|
/**
|
190
|
-
*
|
191
|
-
*
|
328
|
+
* Sets whether or not the profiler should prioritize consistency of sample
|
329
|
+
* periodicity on Windows. Disabling this can greatly reduce CPU usage, but
|
330
|
+
* may result in greater variance in sample timings from the platform's
|
331
|
+
* scheduler. Defaults to enabled. This method must be called when there are
|
332
|
+
* no profiles being recorded.
|
192
333
|
*/
|
193
|
-
|
194
|
-
Handle<String> title,
|
195
|
-
Handle<Value> security_token = Handle<Value>());
|
334
|
+
void SetUsePreciseSampling(bool);
|
196
335
|
|
197
336
|
/**
|
198
|
-
*
|
199
|
-
*
|
200
|
-
*
|
337
|
+
* Starts collecting a CPU profile. Title may be an empty string. Several
|
338
|
+
* profiles may be collected at once. Attempts to start collecting several
|
339
|
+
* profiles with the same title are silently ignored.
|
201
340
|
*/
|
202
|
-
|
203
|
-
};
|
341
|
+
void StartProfiling(Local<String> title, CpuProfilingOptions options);
|
204
342
|
|
343
|
+
/**
|
344
|
+
* Starts profiling with the same semantics as above, except with expanded
|
345
|
+
* parameters.
|
346
|
+
*
|
347
|
+
* |record_samples| parameter controls whether individual samples should
|
348
|
+
* be recorded in addition to the aggregated tree.
|
349
|
+
*
|
350
|
+
* |max_samples| controls the maximum number of samples that should be
|
351
|
+
* recorded by the profiler. Samples obtained after this limit will be
|
352
|
+
* discarded.
|
353
|
+
*/
|
354
|
+
void StartProfiling(
|
355
|
+
Local<String> title, CpuProfilingMode mode, bool record_samples = false,
|
356
|
+
unsigned max_samples = CpuProfilingOptions::kNoSampleLimit);
|
357
|
+
/**
|
358
|
+
* The same as StartProfiling above, but the CpuProfilingMode defaults to
|
359
|
+
* kLeafNodeLineNumbers mode, which was the previous default behavior of the
|
360
|
+
* profiler.
|
361
|
+
*/
|
362
|
+
void StartProfiling(Local<String> title, bool record_samples = false);
|
205
363
|
|
206
|
-
|
364
|
+
/**
|
365
|
+
* Stops collecting CPU profile with a given title and returns it.
|
366
|
+
* If the title given is empty, finishes the last profile started.
|
367
|
+
*/
|
368
|
+
CpuProfile* StopProfiling(Local<String> title);
|
207
369
|
|
370
|
+
/**
|
371
|
+
* Generate more detailed source positions to code objects. This results in
|
372
|
+
* better results when mapping profiling samples to script source.
|
373
|
+
*/
|
374
|
+
static void UseDetailedSourcePositionsForProfiling(Isolate* isolate);
|
375
|
+
|
376
|
+
private:
|
377
|
+
CpuProfiler();
|
378
|
+
~CpuProfiler();
|
379
|
+
CpuProfiler(const CpuProfiler&);
|
380
|
+
CpuProfiler& operator=(const CpuProfiler&);
|
381
|
+
};
|
208
382
|
|
209
383
|
/**
|
210
384
|
* HeapSnapshotEdge represents a directed connection between heap
|
211
385
|
* graph nodes: from retainers to retained nodes.
|
212
386
|
*/
|
213
|
-
class
|
387
|
+
class V8_EXPORT HeapGraphEdge {
|
214
388
|
public:
|
215
389
|
enum Type {
|
216
390
|
kContextVariable = 0, // A variable from a function context.
|
@@ -233,7 +407,7 @@ class V8EXPORT HeapGraphEdge {
|
|
233
407
|
* Returns edge name. This can be a variable name, an element index, or
|
234
408
|
* a property name.
|
235
409
|
*/
|
236
|
-
|
410
|
+
Local<Value> GetName() const;
|
237
411
|
|
238
412
|
/** Returns origin node. */
|
239
413
|
const HeapGraphNode* GetFromNode() const;
|
@@ -246,20 +420,24 @@ class V8EXPORT HeapGraphEdge {
|
|
246
420
|
/**
|
247
421
|
* HeapGraphNode represents a node in a heap graph.
|
248
422
|
*/
|
249
|
-
class
|
423
|
+
class V8_EXPORT HeapGraphNode {
|
250
424
|
public:
|
251
425
|
enum Type {
|
252
|
-
kHidden = 0,
|
253
|
-
kArray = 1,
|
254
|
-
kString = 2,
|
255
|
-
kObject = 3,
|
256
|
-
kCode = 4,
|
257
|
-
kClosure = 5,
|
258
|
-
kRegExp = 6,
|
259
|
-
kHeapNumber = 7,
|
260
|
-
kNative = 8,
|
261
|
-
kSynthetic = 9
|
262
|
-
|
426
|
+
kHidden = 0, // Hidden node, may be filtered when shown to user.
|
427
|
+
kArray = 1, // An array of elements.
|
428
|
+
kString = 2, // A string.
|
429
|
+
kObject = 3, // A JS object (except for arrays and strings).
|
430
|
+
kCode = 4, // Compiled code.
|
431
|
+
kClosure = 5, // Function closure.
|
432
|
+
kRegExp = 6, // RegExp.
|
433
|
+
kHeapNumber = 7, // Number stored in the heap.
|
434
|
+
kNative = 8, // Native object (not from V8 heap).
|
435
|
+
kSynthetic = 9, // Synthetic object, usually used for grouping
|
436
|
+
// snapshot items together.
|
437
|
+
kConsString = 10, // Concatenated string. A pair of pointers to strings.
|
438
|
+
kSlicedString = 11, // Sliced string. A fragment of another string.
|
439
|
+
kSymbol = 12, // A Symbol (ES6).
|
440
|
+
kBigInt = 13 // BigInt.
|
263
441
|
};
|
264
442
|
|
265
443
|
/** Returns node type (see HeapGraphNode::Type). */
|
@@ -270,7 +448,7 @@ class V8EXPORT HeapGraphNode {
|
|
270
448
|
* of the constructor (for objects), the name of the function (for
|
271
449
|
* closures), string value, or an empty string (for compiled code).
|
272
450
|
*/
|
273
|
-
|
451
|
+
Local<String> GetName() const;
|
274
452
|
|
275
453
|
/**
|
276
454
|
* Returns node id. For the same heap object, the id remains the same
|
@@ -279,43 +457,56 @@ class V8EXPORT HeapGraphNode {
|
|
279
457
|
SnapshotObjectId GetId() const;
|
280
458
|
|
281
459
|
/** Returns node's own size, in bytes. */
|
282
|
-
|
460
|
+
size_t GetShallowSize() const;
|
283
461
|
|
284
462
|
/** Returns child nodes count of the node. */
|
285
463
|
int GetChildrenCount() const;
|
286
464
|
|
287
465
|
/** Retrieves a child by index. */
|
288
466
|
const HeapGraphEdge* GetChild(int index) const;
|
467
|
+
};
|
468
|
+
|
289
469
|
|
470
|
+
/**
|
471
|
+
* An interface for exporting data from V8, using "push" model.
|
472
|
+
*/
|
473
|
+
class V8_EXPORT OutputStream { // NOLINT
|
474
|
+
public:
|
475
|
+
enum WriteResult {
|
476
|
+
kContinue = 0,
|
477
|
+
kAbort = 1
|
478
|
+
};
|
479
|
+
virtual ~OutputStream() = default;
|
480
|
+
/** Notify about the end of stream. */
|
481
|
+
virtual void EndOfStream() = 0;
|
482
|
+
/** Get preferred output chunk size. Called only once. */
|
483
|
+
virtual int GetChunkSize() { return 1024; }
|
290
484
|
/**
|
291
|
-
*
|
292
|
-
*
|
485
|
+
* Writes the next chunk of snapshot data into the stream. Writing
|
486
|
+
* can be stopped by returning kAbort as function result. EndOfStream
|
487
|
+
* will not be called in case writing was aborted.
|
293
488
|
*/
|
294
|
-
|
489
|
+
virtual WriteResult WriteAsciiChunk(char* data, int size) = 0;
|
490
|
+
/**
|
491
|
+
* Writes the next chunk of heap stats data into the stream. Writing
|
492
|
+
* can be stopped by returning kAbort as function result. EndOfStream
|
493
|
+
* will not be called in case writing was aborted.
|
494
|
+
*/
|
495
|
+
virtual WriteResult WriteHeapStatsChunk(HeapStatsUpdate* data, int count) {
|
496
|
+
return kAbort;
|
497
|
+
}
|
295
498
|
};
|
296
499
|
|
297
500
|
|
298
501
|
/**
|
299
502
|
* HeapSnapshots record the state of the JS heap at some moment.
|
300
503
|
*/
|
301
|
-
class
|
504
|
+
class V8_EXPORT HeapSnapshot {
|
302
505
|
public:
|
303
|
-
enum Type {
|
304
|
-
kFull = 0 // Heap snapshot with all instances and references.
|
305
|
-
};
|
306
506
|
enum SerializationFormat {
|
307
507
|
kJSON = 0 // See format description near 'Serialize' method.
|
308
508
|
};
|
309
509
|
|
310
|
-
/** Returns heap snapshot type. */
|
311
|
-
Type GetType() const;
|
312
|
-
|
313
|
-
/** Returns heap snapshot UID (assigned by the profiler.) */
|
314
|
-
unsigned GetUid() const;
|
315
|
-
|
316
|
-
/** Returns heap snapshot title. */
|
317
|
-
Handle<String> GetTitle() const;
|
318
|
-
|
319
510
|
/** Returns the root node of the heap graph. */
|
320
511
|
const HeapGraphNode* GetRoot() const;
|
321
512
|
|
@@ -364,40 +555,267 @@ class V8EXPORT HeapSnapshot {
|
|
364
555
|
* Nodes reference strings, other nodes, and edges by their indexes
|
365
556
|
* in corresponding arrays.
|
366
557
|
*/
|
367
|
-
void Serialize(OutputStream* stream,
|
558
|
+
void Serialize(OutputStream* stream,
|
559
|
+
SerializationFormat format = kJSON) const;
|
560
|
+
};
|
561
|
+
|
562
|
+
|
563
|
+
/**
|
564
|
+
* An interface for reporting progress and controlling long-running
|
565
|
+
* activities.
|
566
|
+
*/
|
567
|
+
class V8_EXPORT ActivityControl { // NOLINT
|
568
|
+
public:
|
569
|
+
enum ControlOption {
|
570
|
+
kContinue = 0,
|
571
|
+
kAbort = 1
|
572
|
+
};
|
573
|
+
virtual ~ActivityControl() = default;
|
574
|
+
/**
|
575
|
+
* Notify about current progress. The activity can be stopped by
|
576
|
+
* returning kAbort as the callback result.
|
577
|
+
*/
|
578
|
+
virtual ControlOption ReportProgressValue(int done, int total) = 0;
|
579
|
+
};
|
580
|
+
|
581
|
+
|
582
|
+
/**
|
583
|
+
* AllocationProfile is a sampled profile of allocations done by the program.
|
584
|
+
* This is structured as a call-graph.
|
585
|
+
*/
|
586
|
+
class V8_EXPORT AllocationProfile {
|
587
|
+
public:
|
588
|
+
struct Allocation {
|
589
|
+
/**
|
590
|
+
* Size of the sampled allocation object.
|
591
|
+
*/
|
592
|
+
size_t size;
|
593
|
+
|
594
|
+
/**
|
595
|
+
* The number of objects of such size that were sampled.
|
596
|
+
*/
|
597
|
+
unsigned int count;
|
598
|
+
};
|
599
|
+
|
600
|
+
/**
|
601
|
+
* Represents a node in the call-graph.
|
602
|
+
*/
|
603
|
+
struct Node {
|
604
|
+
/**
|
605
|
+
* Name of the function. May be empty for anonymous functions or if the
|
606
|
+
* script corresponding to this function has been unloaded.
|
607
|
+
*/
|
608
|
+
Local<String> name;
|
609
|
+
|
610
|
+
/**
|
611
|
+
* Name of the script containing the function. May be empty if the script
|
612
|
+
* name is not available, or if the script has been unloaded.
|
613
|
+
*/
|
614
|
+
Local<String> script_name;
|
615
|
+
|
616
|
+
/**
|
617
|
+
* id of the script where the function is located. May be equal to
|
618
|
+
* v8::UnboundScript::kNoScriptId in cases where the script doesn't exist.
|
619
|
+
*/
|
620
|
+
int script_id;
|
621
|
+
|
622
|
+
/**
|
623
|
+
* Start position of the function in the script.
|
624
|
+
*/
|
625
|
+
int start_position;
|
626
|
+
|
627
|
+
/**
|
628
|
+
* 1-indexed line number where the function starts. May be
|
629
|
+
* kNoLineNumberInfo if no line number information is available.
|
630
|
+
*/
|
631
|
+
int line_number;
|
632
|
+
|
633
|
+
/**
|
634
|
+
* 1-indexed column number where the function starts. May be
|
635
|
+
* kNoColumnNumberInfo if no line number information is available.
|
636
|
+
*/
|
637
|
+
int column_number;
|
638
|
+
|
639
|
+
/**
|
640
|
+
* Unique id of the node.
|
641
|
+
*/
|
642
|
+
uint32_t node_id;
|
643
|
+
|
644
|
+
/**
|
645
|
+
* List of callees called from this node for which we have sampled
|
646
|
+
* allocations. The lifetime of the children is scoped to the containing
|
647
|
+
* AllocationProfile.
|
648
|
+
*/
|
649
|
+
std::vector<Node*> children;
|
650
|
+
|
651
|
+
/**
|
652
|
+
* List of self allocations done by this node in the call-graph.
|
653
|
+
*/
|
654
|
+
std::vector<Allocation> allocations;
|
655
|
+
};
|
656
|
+
|
657
|
+
/**
|
658
|
+
* Represent a single sample recorded for an allocation.
|
659
|
+
*/
|
660
|
+
struct Sample {
|
661
|
+
/**
|
662
|
+
* id of the node in the profile tree.
|
663
|
+
*/
|
664
|
+
uint32_t node_id;
|
665
|
+
|
666
|
+
/**
|
667
|
+
* Size of the sampled allocation object.
|
668
|
+
*/
|
669
|
+
size_t size;
|
670
|
+
|
671
|
+
/**
|
672
|
+
* The number of objects of such size that were sampled.
|
673
|
+
*/
|
674
|
+
unsigned int count;
|
675
|
+
|
676
|
+
/**
|
677
|
+
* Unique time-ordered id of the allocation sample. Can be used to track
|
678
|
+
* what samples were added or removed between two snapshots.
|
679
|
+
*/
|
680
|
+
uint64_t sample_id;
|
681
|
+
};
|
682
|
+
|
683
|
+
/**
|
684
|
+
* Returns the root node of the call-graph. The root node corresponds to an
|
685
|
+
* empty JS call-stack. The lifetime of the returned Node* is scoped to the
|
686
|
+
* containing AllocationProfile.
|
687
|
+
*/
|
688
|
+
virtual Node* GetRootNode() = 0;
|
689
|
+
virtual const std::vector<Sample>& GetSamples() = 0;
|
690
|
+
|
691
|
+
virtual ~AllocationProfile() = default;
|
692
|
+
|
693
|
+
static const int kNoLineNumberInfo = Message::kNoLineNumberInfo;
|
694
|
+
static const int kNoColumnNumberInfo = Message::kNoColumnInfo;
|
368
695
|
};
|
369
696
|
|
697
|
+
/**
|
698
|
+
* An object graph consisting of embedder objects and V8 objects.
|
699
|
+
* Edges of the graph are strong references between the objects.
|
700
|
+
* The embedder can build this graph during heap snapshot generation
|
701
|
+
* to include the embedder objects in the heap snapshot.
|
702
|
+
* Usage:
|
703
|
+
* 1) Define derived class of EmbedderGraph::Node for embedder objects.
|
704
|
+
* 2) Set the build embedder graph callback on the heap profiler using
|
705
|
+
* HeapProfiler::AddBuildEmbedderGraphCallback.
|
706
|
+
* 3) In the callback use graph->AddEdge(node1, node2) to add an edge from
|
707
|
+
* node1 to node2.
|
708
|
+
* 4) To represent references from/to V8 object, construct V8 nodes using
|
709
|
+
* graph->V8Node(value).
|
710
|
+
*/
|
711
|
+
class V8_EXPORT EmbedderGraph {
|
712
|
+
public:
|
713
|
+
class Node {
|
714
|
+
public:
|
715
|
+
Node() = default;
|
716
|
+
virtual ~Node() = default;
|
717
|
+
virtual const char* Name() = 0;
|
718
|
+
virtual size_t SizeInBytes() = 0;
|
719
|
+
/**
|
720
|
+
* The corresponding V8 wrapper node if not null.
|
721
|
+
* During heap snapshot generation the embedder node and the V8 wrapper
|
722
|
+
* node will be merged into one node to simplify retaining paths.
|
723
|
+
*/
|
724
|
+
virtual Node* WrapperNode() { return nullptr; }
|
725
|
+
virtual bool IsRootNode() { return false; }
|
726
|
+
/** Must return true for non-V8 nodes. */
|
727
|
+
virtual bool IsEmbedderNode() { return true; }
|
728
|
+
/**
|
729
|
+
* Optional name prefix. It is used in Chrome for tagging detached nodes.
|
730
|
+
*/
|
731
|
+
virtual const char* NamePrefix() { return nullptr; }
|
732
|
+
|
733
|
+
/**
|
734
|
+
* Returns the NativeObject that can be used for querying the
|
735
|
+
* |HeapSnapshot|.
|
736
|
+
*/
|
737
|
+
virtual NativeObject GetNativeObject() { return nullptr; }
|
370
738
|
|
371
|
-
|
739
|
+
Node(const Node&) = delete;
|
740
|
+
Node& operator=(const Node&) = delete;
|
741
|
+
};
|
742
|
+
|
743
|
+
/**
|
744
|
+
* Returns a node corresponding to the given V8 value. Ownership is not
|
745
|
+
* transferred. The result pointer is valid while the graph is alive.
|
746
|
+
*/
|
747
|
+
virtual Node* V8Node(const v8::Local<v8::Value>& value) = 0;
|
748
|
+
|
749
|
+
/**
|
750
|
+
* Adds the given node to the graph and takes ownership of the node.
|
751
|
+
* Returns a raw pointer to the node that is valid while the graph is alive.
|
752
|
+
*/
|
753
|
+
virtual Node* AddNode(std::unique_ptr<Node> node) = 0;
|
754
|
+
|
755
|
+
/**
|
756
|
+
* Adds an edge that represents a strong reference from the given
|
757
|
+
* node |from| to the given node |to|. The nodes must be added to the graph
|
758
|
+
* before calling this function.
|
759
|
+
*
|
760
|
+
* If name is nullptr, the edge will have auto-increment indexes, otherwise
|
761
|
+
* it will be named accordingly.
|
762
|
+
*/
|
763
|
+
virtual void AddEdge(Node* from, Node* to, const char* name = nullptr) = 0;
|
764
|
+
|
765
|
+
virtual ~EmbedderGraph() = default;
|
766
|
+
};
|
372
767
|
|
373
768
|
/**
|
374
|
-
* Interface for controlling heap profiling.
|
769
|
+
* Interface for controlling heap profiling. Instance of the
|
770
|
+
* profiler can be retrieved using v8::Isolate::GetHeapProfiler.
|
375
771
|
*/
|
376
|
-
class
|
772
|
+
class V8_EXPORT HeapProfiler {
|
377
773
|
public:
|
774
|
+
enum SamplingFlags {
|
775
|
+
kSamplingNoFlags = 0,
|
776
|
+
kSamplingForceGC = 1 << 0,
|
777
|
+
};
|
778
|
+
|
378
779
|
/**
|
379
|
-
* Callback function invoked
|
380
|
-
* the
|
381
|
-
*
|
382
|
-
*
|
780
|
+
* Callback function invoked during heap snapshot generation to retrieve
|
781
|
+
* the embedder object graph. The callback should use graph->AddEdge(..) to
|
782
|
+
* add references between the objects.
|
783
|
+
* The callback must not trigger garbage collection in V8.
|
383
784
|
*/
|
384
|
-
typedef
|
385
|
-
|
785
|
+
typedef void (*BuildEmbedderGraphCallback)(v8::Isolate* isolate,
|
786
|
+
v8::EmbedderGraph* graph,
|
787
|
+
void* data);
|
386
788
|
|
387
789
|
/** Returns the number of snapshots taken. */
|
388
|
-
|
790
|
+
int GetSnapshotCount();
|
389
791
|
|
390
792
|
/** Returns a snapshot by index. */
|
391
|
-
|
392
|
-
|
393
|
-
/** Returns a profile by uid. */
|
394
|
-
static const HeapSnapshot* FindSnapshot(unsigned uid);
|
793
|
+
const HeapSnapshot* GetHeapSnapshot(int index);
|
395
794
|
|
396
795
|
/**
|
397
796
|
* Returns SnapshotObjectId for a heap object referenced by |value| if
|
398
797
|
* it has been seen by the heap profiler, kUnknownObjectId otherwise.
|
399
798
|
*/
|
400
|
-
|
799
|
+
SnapshotObjectId GetObjectId(Local<Value> value);
|
800
|
+
|
801
|
+
/**
|
802
|
+
* Returns SnapshotObjectId for a native object referenced by |value| if it
|
803
|
+
* has been seen by the heap profiler, kUnknownObjectId otherwise.
|
804
|
+
*/
|
805
|
+
SnapshotObjectId GetObjectId(NativeObject value);
|
806
|
+
|
807
|
+
/**
|
808
|
+
* Returns heap object with given SnapshotObjectId if the object is alive,
|
809
|
+
* otherwise empty handle is returned.
|
810
|
+
*/
|
811
|
+
Local<Value> FindObjectById(SnapshotObjectId id);
|
812
|
+
|
813
|
+
/**
|
814
|
+
* Clears internal map from SnapshotObjectId to heap object. The new objects
|
815
|
+
* will not be added into it unless a heap snapshot is taken or heap object
|
816
|
+
* tracking is kicked off.
|
817
|
+
*/
|
818
|
+
void ClearObjectIds();
|
401
819
|
|
402
820
|
/**
|
403
821
|
* A constant for invalid SnapshotObjectId. GetSnapshotObjectId will return
|
@@ -410,32 +828,35 @@ class V8EXPORT HeapProfiler {
|
|
410
828
|
* Callback interface for retrieving user friendly names of global objects.
|
411
829
|
*/
|
412
830
|
class ObjectNameResolver {
|
413
|
-
|
831
|
+
public:
|
414
832
|
/**
|
415
833
|
* Returns name to be used in the heap snapshot for given node. Returned
|
416
834
|
* string must stay alive until snapshot collection is completed.
|
417
835
|
*/
|
418
|
-
virtual const char* GetName(
|
419
|
-
|
420
|
-
|
836
|
+
virtual const char* GetName(Local<Object> object) = 0;
|
837
|
+
|
838
|
+
protected:
|
839
|
+
virtual ~ObjectNameResolver() = default;
|
421
840
|
};
|
422
841
|
|
423
842
|
/**
|
424
|
-
* Takes a heap snapshot and returns it.
|
425
|
-
* See HeapSnapshot::Type for types description.
|
843
|
+
* Takes a heap snapshot and returns it.
|
426
844
|
*/
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
ObjectNameResolver* global_object_name_resolver = NULL);
|
845
|
+
const HeapSnapshot* TakeHeapSnapshot(
|
846
|
+
ActivityControl* control = nullptr,
|
847
|
+
ObjectNameResolver* global_object_name_resolver = nullptr,
|
848
|
+
bool treat_global_objects_as_roots = true);
|
432
849
|
|
433
850
|
/**
|
434
851
|
* Starts tracking of heap objects population statistics. After calling
|
435
852
|
* this method, all heap objects relocations done by the garbage collector
|
436
853
|
* are being registered.
|
854
|
+
*
|
855
|
+
* |track_allocations| parameter controls whether stack trace of each
|
856
|
+
* allocation in the heap will be recorded and reported as part of
|
857
|
+
* HeapSnapshot.
|
437
858
|
*/
|
438
|
-
|
859
|
+
void StartTrackingHeapObjects(bool track_allocations = false);
|
439
860
|
|
440
861
|
/**
|
441
862
|
* Adds a new time interval entry to the aggregated statistics array. The
|
@@ -444,30 +865,76 @@ class V8EXPORT HeapProfiler {
|
|
444
865
|
* reports updates for all previous time intervals via the OutputStream
|
445
866
|
* object. Updates on each time interval are provided as a stream of the
|
446
867
|
* HeapStatsUpdate structure instances.
|
447
|
-
*
|
868
|
+
* If |timestamp_us| is supplied, timestamp of the new entry will be written
|
869
|
+
* into it. The return value of the function is the last seen heap object Id.
|
448
870
|
*
|
449
|
-
*
|
871
|
+
* StartTrackingHeapObjects must be called before the first call to this
|
450
872
|
* method.
|
451
873
|
*/
|
452
|
-
|
874
|
+
SnapshotObjectId GetHeapStats(OutputStream* stream,
|
875
|
+
int64_t* timestamp_us = nullptr);
|
453
876
|
|
454
877
|
/**
|
455
878
|
* Stops tracking of heap objects population statistics, cleans up all
|
456
879
|
* collected data. StartHeapObjectsTracking must be called again prior to
|
457
|
-
* calling
|
880
|
+
* calling GetHeapStats next time.
|
458
881
|
*/
|
459
|
-
|
882
|
+
void StopTrackingHeapObjects();
|
883
|
+
|
884
|
+
/**
|
885
|
+
* Starts gathering a sampling heap profile. A sampling heap profile is
|
886
|
+
* similar to tcmalloc's heap profiler and Go's mprof. It samples object
|
887
|
+
* allocations and builds an online 'sampling' heap profile. At any point in
|
888
|
+
* time, this profile is expected to be a representative sample of objects
|
889
|
+
* currently live in the system. Each sampled allocation includes the stack
|
890
|
+
* trace at the time of allocation, which makes this really useful for memory
|
891
|
+
* leak detection.
|
892
|
+
*
|
893
|
+
* This mechanism is intended to be cheap enough that it can be used in
|
894
|
+
* production with minimal performance overhead.
|
895
|
+
*
|
896
|
+
* Allocations are sampled using a randomized Poisson process. On average, one
|
897
|
+
* allocation will be sampled every |sample_interval| bytes allocated. The
|
898
|
+
* |stack_depth| parameter controls the maximum number of stack frames to be
|
899
|
+
* captured on each allocation.
|
900
|
+
*
|
901
|
+
* NOTE: This is a proof-of-concept at this point. Right now we only sample
|
902
|
+
* newspace allocations. Support for paged space allocation (e.g. pre-tenured
|
903
|
+
* objects, large objects, code objects, etc.) and native allocations
|
904
|
+
* doesn't exist yet, but is anticipated in the future.
|
905
|
+
*
|
906
|
+
* Objects allocated before the sampling is started will not be included in
|
907
|
+
* the profile.
|
908
|
+
*
|
909
|
+
* Returns false if a sampling heap profiler is already running.
|
910
|
+
*/
|
911
|
+
bool StartSamplingHeapProfiler(uint64_t sample_interval = 512 * 1024,
|
912
|
+
int stack_depth = 16,
|
913
|
+
SamplingFlags flags = kSamplingNoFlags);
|
914
|
+
|
915
|
+
/**
|
916
|
+
* Stops the sampling heap profile and discards the current profile.
|
917
|
+
*/
|
918
|
+
void StopSamplingHeapProfiler();
|
919
|
+
|
920
|
+
/**
|
921
|
+
* Returns the sampled profile of allocations allocated (and still live) since
|
922
|
+
* StartSamplingHeapProfiler was called. The ownership of the pointer is
|
923
|
+
* transferred to the caller. Returns nullptr if sampling heap profiler is not
|
924
|
+
* active.
|
925
|
+
*/
|
926
|
+
AllocationProfile* GetAllocationProfile();
|
460
927
|
|
461
928
|
/**
|
462
929
|
* Deletes all snapshots taken. All previously returned pointers to
|
463
930
|
* snapshots and their contents become invalid after this call.
|
464
931
|
*/
|
465
|
-
|
932
|
+
void DeleteAllHeapSnapshots();
|
466
933
|
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
934
|
+
void AddBuildEmbedderGraphCallback(BuildEmbedderGraphCallback callback,
|
935
|
+
void* data);
|
936
|
+
void RemoveBuildEmbedderGraphCallback(BuildEmbedderGraphCallback callback,
|
937
|
+
void* data);
|
471
938
|
|
472
939
|
/**
|
473
940
|
* Default value of persistent handle class ID. Must not be used to
|
@@ -476,105 +943,117 @@ class V8EXPORT HeapProfiler {
|
|
476
943
|
*/
|
477
944
|
static const uint16_t kPersistentHandleNoClassId = 0;
|
478
945
|
|
479
|
-
|
480
|
-
|
946
|
+
private:
|
947
|
+
HeapProfiler();
|
948
|
+
~HeapProfiler();
|
949
|
+
HeapProfiler(const HeapProfiler&);
|
950
|
+
HeapProfiler& operator=(const HeapProfiler&);
|
951
|
+
};
|
481
952
|
|
482
|
-
|
483
|
-
|
953
|
+
/**
|
954
|
+
* A struct for exporting HeapStats data from V8, using "push" model.
|
955
|
+
* See HeapProfiler::GetHeapStats.
|
956
|
+
*/
|
957
|
+
struct HeapStatsUpdate {
|
958
|
+
HeapStatsUpdate(uint32_t index, uint32_t count, uint32_t size)
|
959
|
+
: index(index), count(count), size(size) { }
|
960
|
+
uint32_t index; // Index of the time interval that was changed.
|
961
|
+
uint32_t count; // New value of count field for the interval with this index.
|
962
|
+
uint32_t size; // New value of size field for the interval with this index.
|
484
963
|
};
|
485
964
|
|
965
|
+
#define CODE_EVENTS_LIST(V) \
|
966
|
+
V(Builtin) \
|
967
|
+
V(Callback) \
|
968
|
+
V(Eval) \
|
969
|
+
V(Function) \
|
970
|
+
V(InterpretedFunction) \
|
971
|
+
V(Handler) \
|
972
|
+
V(BytecodeHandler) \
|
973
|
+
V(LazyCompile) \
|
974
|
+
V(RegExp) \
|
975
|
+
V(Script) \
|
976
|
+
V(Stub) \
|
977
|
+
V(Relocation)
|
978
|
+
|
979
|
+
/**
|
980
|
+
* Note that this enum may be extended in the future. Please include a default
|
981
|
+
* case if this enum is used in a switch statement.
|
982
|
+
*/
|
983
|
+
enum CodeEventType {
|
984
|
+
kUnknownType = 0
|
985
|
+
#define V(Name) , k##Name##Type
|
986
|
+
CODE_EVENTS_LIST(V)
|
987
|
+
#undef V
|
988
|
+
};
|
486
989
|
|
487
990
|
/**
|
488
|
-
*
|
489
|
-
* held by global handles. This information is reported in two ways:
|
490
|
-
*
|
491
|
-
* 1. When calling AddObjectGroup, an embedder may pass
|
492
|
-
* RetainedObjectInfo instance describing the group. To collect
|
493
|
-
* this information while taking a heap snapshot, V8 calls GC
|
494
|
-
* prologue and epilogue callbacks.
|
495
|
-
*
|
496
|
-
* 2. When a heap snapshot is collected, V8 additionally
|
497
|
-
* requests RetainedObjectInfos for persistent handles that
|
498
|
-
* were not previously reported via AddObjectGroup.
|
499
|
-
*
|
500
|
-
* Thus, if an embedder wants to provide information about native
|
501
|
-
* objects for heap snapshots, he can do it in a GC prologue
|
502
|
-
* handler, and / or by assigning wrapper class ids in the following way:
|
503
|
-
*
|
504
|
-
* 1. Bind a callback to class id by calling DefineWrapperClass.
|
505
|
-
* 2. Call SetWrapperClassId on certain persistent handles.
|
506
|
-
*
|
507
|
-
* V8 takes ownership of RetainedObjectInfo instances passed to it and
|
508
|
-
* keeps them alive only during snapshot collection. Afterwards, they
|
509
|
-
* are freed by calling the Dispose class function.
|
991
|
+
* Representation of a code creation event
|
510
992
|
*/
|
511
|
-
class
|
993
|
+
class V8_EXPORT CodeEvent {
|
512
994
|
public:
|
513
|
-
|
514
|
-
|
995
|
+
uintptr_t GetCodeStartAddress();
|
996
|
+
size_t GetCodeSize();
|
997
|
+
Local<String> GetFunctionName();
|
998
|
+
Local<String> GetScriptName();
|
999
|
+
int GetScriptLine();
|
1000
|
+
int GetScriptColumn();
|
1001
|
+
/**
|
1002
|
+
* NOTE (mmarchini): We can't allocate objects in the heap when we collect
|
1003
|
+
* existing code, and both the code type and the comment are not stored in the
|
1004
|
+
* heap, so we return those as const char*.
|
1005
|
+
*/
|
1006
|
+
CodeEventType GetCodeType();
|
1007
|
+
const char* GetComment();
|
515
1008
|
|
516
|
-
|
517
|
-
|
1009
|
+
static const char* GetCodeEventTypeName(CodeEventType code_event_type);
|
1010
|
+
|
1011
|
+
uintptr_t GetPreviousCodeStartAddress();
|
1012
|
+
};
|
518
1013
|
|
1014
|
+
/**
|
1015
|
+
* Interface to listen to code creation and code relocation events.
|
1016
|
+
*/
|
1017
|
+
class V8_EXPORT CodeEventHandler {
|
1018
|
+
public:
|
519
1019
|
/**
|
520
|
-
*
|
521
|
-
* must
|
1020
|
+
* Creates a new listener for the |isolate|. The isolate must be initialized.
|
1021
|
+
* The listener object must be disposed after use by calling |Dispose| method.
|
1022
|
+
* Multiple listeners can be created for the same isolate.
|
522
1023
|
*/
|
523
|
-
|
1024
|
+
explicit CodeEventHandler(Isolate* isolate);
|
1025
|
+
virtual ~CodeEventHandler();
|
524
1026
|
|
525
1027
|
/**
|
526
|
-
*
|
527
|
-
*
|
1028
|
+
* Handle is called every time a code object is created or moved. Information
|
1029
|
+
* about each code event will be available through the `code_event`
|
1030
|
+
* parameter.
|
1031
|
+
*
|
1032
|
+
* When the CodeEventType is kRelocationType, the code for this CodeEvent has
|
1033
|
+
* moved from `GetPreviousCodeStartAddress()` to `GetCodeStartAddress()`.
|
528
1034
|
*/
|
529
|
-
virtual
|
1035
|
+
virtual void Handle(CodeEvent* code_event) = 0;
|
530
1036
|
|
531
1037
|
/**
|
532
|
-
*
|
533
|
-
*
|
534
|
-
* Heap snapshot generator will collect all the group names, create
|
535
|
-
* top level entries with these names and attach the objects to the
|
536
|
-
* corresponding top level group objects. There is a default
|
537
|
-
* implementation which is required because embedders don't have their
|
538
|
-
* own implementation yet.
|
1038
|
+
* Call `Enable()` to starts listening to code creation and code relocation
|
1039
|
+
* events. These events will be handled by `Handle()`.
|
539
1040
|
*/
|
540
|
-
|
1041
|
+
void Enable();
|
541
1042
|
|
542
1043
|
/**
|
543
|
-
*
|
544
|
-
*
|
1044
|
+
* Call `Disable()` to stop listening to code creation and code relocation
|
1045
|
+
* events.
|
545
1046
|
*/
|
546
|
-
|
547
|
-
|
548
|
-
/** Returns embedder's object size in bytes. */
|
549
|
-
virtual intptr_t GetSizeInBytes() { return -1; }
|
550
|
-
|
551
|
-
protected:
|
552
|
-
RetainedObjectInfo() {}
|
553
|
-
virtual ~RetainedObjectInfo() {}
|
1047
|
+
void Disable();
|
554
1048
|
|
555
1049
|
private:
|
556
|
-
|
557
|
-
|
1050
|
+
CodeEventHandler();
|
1051
|
+
CodeEventHandler(const CodeEventHandler&);
|
1052
|
+
CodeEventHandler& operator=(const CodeEventHandler&);
|
1053
|
+
void* internal_listener_;
|
558
1054
|
};
|
559
1055
|
|
560
|
-
|
561
|
-
/**
|
562
|
-
* A struct for exporting HeapStats data from V8, using "push" model.
|
563
|
-
* See HeapProfiler::PushHeapObjectsStats.
|
564
|
-
*/
|
565
|
-
struct HeapStatsUpdate {
|
566
|
-
HeapStatsUpdate(uint32_t index, uint32_t count, uint32_t size)
|
567
|
-
: index(index), count(count), size(size) { }
|
568
|
-
uint32_t index; // Index of the time interval that was changed.
|
569
|
-
uint32_t count; // New value of count field for the interval with this index.
|
570
|
-
uint32_t size; // New value of size field for the interval with this index.
|
571
|
-
};
|
572
|
-
|
573
|
-
|
574
1056
|
} // namespace v8
|
575
1057
|
|
576
1058
|
|
577
|
-
#undef V8EXPORT
|
578
|
-
|
579
|
-
|
580
1059
|
#endif // V8_V8_PROFILER_H_
|