Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
third_party
dart-lang
sdk
runtime
lib
stacktrace.cc
Go to the documentation of this file.
1
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2
// for details. All rights reserved. Use of this source code is governed by a
3
// BSD-style license that can be found in the LICENSE file.
4
5
#include "
lib/stacktrace.h
"
6
#include "
vm/bootstrap_natives.h
"
7
#include "
vm/debugger.h
"
8
#include "
vm/exceptions.h
"
9
#include "
vm/native_entry.h
"
10
#include "
vm/object_store.h
"
11
#include "
vm/runtime_entry.h
"
12
#include "
vm/stack_frame.h
"
13
#include "
vm/stack_trace.h
"
14
15
namespace
dart
{
16
17
DECLARE_FLAG
(
bool
, show_invisible_frames);
18
19
static
constexpr
intptr_t
kDefaultStackAllocation
= 8;
20
21
static
StackTracePtr
CreateStackTraceObject
(
22
Zone
* zone,
23
const
GrowableObjectArray
& code_list,
24
const
GrowableArray<uword>
& pc_offset_list) {
25
const
auto
& code_array =
26
Array::Handle
(zone,
Array::MakeFixedLength
(code_list));
27
const
auto
& pc_offset_array =
TypedData::Handle
(
28
zone,
TypedData::New
(kUintPtrCid, pc_offset_list.
length
()));
29
{
30
NoSafepointScope
no_safepoint;
31
memmove(pc_offset_array.DataAddr(0), pc_offset_list.
data
(),
32
pc_offset_list.
length
() *
kWordSize
);
33
}
34
return
StackTrace::New
(code_array, pc_offset_array);
35
}
36
37
// Gets current stack trace for `thread`.
38
static
StackTracePtr
CurrentStackTrace
(
Thread
* thread,
39
intptr_t skip_frames = 1) {
40
Zone
* zone = thread->
zone
();
41
42
const
auto
& code_array =
GrowableObjectArray::ZoneHandle
(
43
zone,
GrowableObjectArray::New
(
kDefaultStackAllocation
));
44
GrowableArray<uword>
pc_offset_array(
kDefaultStackAllocation
);
45
46
// Collect the frames.
47
StackTraceUtils::CollectFrames
(thread, skip_frames,
48
[&](
const
StackTraceUtils::Frame
&
frame
) {
49
code_array.Add(
frame
.code);
50
pc_offset_array.
Add
(
frame
.pc_offset);
51
});
52
53
return
CreateStackTraceObject
(zone, code_array, pc_offset_array);
54
}
55
56
StackTracePtr
GetStackTraceForException
() {
57
Thread
* thread =
Thread::Current
();
58
return
CurrentStackTrace
(thread, 0);
59
}
60
61
DEFINE_NATIVE_ENTRY
(StackTrace_current, 0, 0) {
62
return
CurrentStackTrace
(thread);
63
}
64
65
static
void
AppendFrames
(
const
GrowableObjectArray
& code_list,
66
GrowableArray<uword>
* pc_offset_list,
67
int
skip_frames) {
68
Thread
* thread =
Thread::Current
();
69
Zone
* zone = thread->
zone
();
70
StackFrameIterator
frames(
ValidationPolicy::kDontValidateFrames
, thread,
71
StackFrameIterator::kNoCrossThreadIteration
);
72
StackFrame
*
frame
= frames.
NextFrame
();
73
ASSERT
(
frame
!=
nullptr
);
// We expect to find a dart invocation frame.
74
Code
& code =
Code::Handle
(zone);
75
for
(;
frame
!=
nullptr
;
frame
= frames.
NextFrame
()) {
76
if
(!
frame
->IsDartFrame()) {
77
continue
;
78
}
79
if
(skip_frames > 0) {
80
skip_frames--;
81
continue
;
82
}
83
84
code =
frame
->LookupDartCode();
85
const
intptr_t pc_offset =
frame
->pc() - code.PayloadStart();
86
code_list.
Add
(code);
87
pc_offset_list->
Add
(pc_offset);
88
}
89
}
90
91
// Creates a StackTrace object from the current stack.
92
//
93
// Skips the first skip_frames Dart frames.
94
const
StackTrace
&
GetCurrentStackTrace
(
int
skip_frames) {
95
Zone
* zone =
Thread::Current
()->
zone
();
96
const
GrowableObjectArray
& code_list =
97
GrowableObjectArray::Handle
(zone,
GrowableObjectArray::New
());
98
GrowableArray<uword>
pc_offset_list;
99
AppendFrames
(code_list, &pc_offset_list, skip_frames);
100
101
const
StackTrace
& stacktrace =
StackTrace::Handle
(
102
zone,
CreateStackTraceObject
(zone, code_list, pc_offset_list));
103
return
stacktrace;
104
}
105
106
bool
HasStack
() {
107
Thread
* thread =
Thread::Current
();
108
StackFrameIterator
frames(
ValidationPolicy::kDontValidateFrames
, thread,
109
StackFrameIterator::kNoCrossThreadIteration
);
110
StackFrame
*
frame
= frames.
NextFrame
();
111
return
frame
!=
nullptr
;
112
}
113
114
}
// namespace dart
bootstrap_natives.h
dart::Array::MakeFixedLength
static ArrayPtr MakeFixedLength(const GrowableObjectArray &growable_array, bool unique=false)
Definition
object.cc:25014
dart::BaseGrowableArray::data
T * data() const
Definition
growable_array.h:61
dart::BaseGrowableArray::Add
void Add(const T &value)
Definition
growable_array.h:84
dart::BaseGrowableArray::length
intptr_t length() const
Definition
growable_array.h:60
dart::Code
Definition
object.h:6734
dart::GrowableArray
Definition
growable_array.h:22
dart::GrowableObjectArray
Definition
object.h:11039
dart::GrowableObjectArray::Add
void Add(const Object &value, Heap::Space space=Heap::kNew) const
Definition
object.cc:25070
dart::GrowableObjectArray::New
static GrowableObjectArrayPtr New(Heap::Space space=Heap::kNew)
Definition
object.h:11118
dart::NoSafepointScope
Definition
thread.h:1535
dart::Object::Handle
static Object & Handle()
Definition
object.h:407
dart::Object::ZoneHandle
static Object & ZoneHandle()
Definition
object.h:419
dart::StackFrameIterator
Definition
stack_frame.h:218
dart::StackFrameIterator::kNoCrossThreadIteration
@ kNoCrossThreadIteration
Definition
stack_frame.h:221
dart::StackFrameIterator::NextFrame
StackFrame * NextFrame()
Definition
stack_frame.cc:549
dart::StackFrame
Definition
stack_frame.h:36
dart::StackTraceUtils::CollectFrames
static void CollectFrames(Thread *thread, int skip_frames, const std::function< void(const Frame &)> &handle_frame, bool *has_async_catch_error=nullptr)
Definition
stack_trace.cc:745
dart::StackTrace
Definition
object.h:12530
dart::StackTrace::New
static StackTracePtr New(const Array &code_array, const TypedData &pc_offset_array, Heap::Space space=Heap::kNew)
Definition
object.cc:26148
dart::ThreadState::zone
Zone * zone() const
Definition
thread_state.h:37
dart::Thread
Definition
thread.h:342
dart::Thread::Current
static Thread * Current()
Definition
thread.h:361
dart::TypedData::New
static TypedDataPtr New(intptr_t class_id, intptr_t len, Heap::Space space=Heap::kNew)
Definition
object.cc:25666
dart::Zone
Definition
unit_test_custom_zone.h:19
debugger.h
ASSERT
#define ASSERT(E)
Definition
entrypoints_verification_test.cc:25
frame
double frame
Definition
examples.cpp:31
exceptions.h
DECLARE_FLAG
#define DECLARE_FLAG(type, name)
Definition
flags.h:14
dart
Definition
dart_vm.cc:33
dart::GetStackTraceForException
StackTracePtr GetStackTraceForException()
Definition
stacktrace.cc:56
dart::AppendFrames
static void AppendFrames(const GrowableObjectArray &code_list, GrowableArray< uword > *pc_offset_list, int skip_frames)
Definition
stacktrace.cc:65
dart::kDefaultStackAllocation
static constexpr intptr_t kDefaultStackAllocation
Definition
stacktrace.cc:19
dart::CurrentStackTrace
static StackTracePtr CurrentStackTrace(Thread *thread, intptr_t skip_frames=1)
Definition
stacktrace.cc:38
dart::HasStack
bool HasStack()
Definition
stacktrace.cc:106
dart::ValidationPolicy::kDontValidateFrames
@ kDontValidateFrames
dart::kWordSize
constexpr intptr_t kWordSize
Definition
globals.h:509
dart::GetCurrentStackTrace
const StackTrace & GetCurrentStackTrace(int skip_frames)
Definition
stacktrace.cc:94
dart::CreateStackTraceObject
static StackTracePtr CreateStackTraceObject(Zone *zone, const GrowableObjectArray &code_list, const GrowableArray< uword > &pc_offset_list)
Definition
stacktrace.cc:21
native_entry.h
DEFINE_NATIVE_ENTRY
#define DEFINE_NATIVE_ENTRY(name, type_argument_count, argument_count)
Definition
native_entry.h:39
object_store.h
runtime_entry.h
stack_frame.h
stack_trace.h
stacktrace.h
dart::StackTraceUtils::Frame
Definition
stack_trace.h:21
Generated on Fri Apr 26 2024 06:14:44 for Flutter Engine by
1.9.8