10
10
#include " lldb/Utility/LLDBLog.h"
11
11
#include " lldb/Utility/Log.h"
12
12
13
+ #include " Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h"
14
+ #include " swift/Strings.h"
15
+
13
16
using namespace llvm ;
14
17
using namespace lldb ;
15
18
using namespace lldb_private ;
@@ -21,12 +24,19 @@ SwiftRuntimeFailureRecognizedStackFrame::
21
24
m_stop_desc = std::string (stop_desc);
22
25
}
23
26
27
+ lldb::StackFrameSP
28
+ SwiftRuntimeFailureRecognizedStackFrame::GetMostRelevantFrame () {
29
+ return m_most_relevant_frame;
30
+ }
31
+
24
32
lldb::RecognizedStackFrameSP SwiftRuntimeFailureFrameRecognizer::RecognizeFrame (
25
33
lldb::StackFrameSP frame_sp) {
26
34
if (frame_sp->GetFrameIndex ())
27
35
return {};
28
36
29
37
ThreadSP thread_sp = frame_sp->GetThread ();
38
+ if (!thread_sp)
39
+ return {};
30
40
ProcessSP process_sp = thread_sp->GetProcess ();
31
41
32
42
StackFrameSP most_relevant_frame_sp = thread_sp->GetStackFrameAtIndex (1 );
@@ -67,23 +77,72 @@ lldb::RecognizedStackFrameSP SwiftRuntimeFailureFrameRecognizer::RecognizeFrame(
67
77
runtime_error));
68
78
}
69
79
70
- lldb::StackFrameSP
71
- SwiftRuntimeFailureRecognizedStackFrame::GetMostRelevantFrame () {
72
- return m_most_relevant_frame;
80
+ lldb::RecognizedStackFrameSP
81
+ SwiftRuntimeInstrumentedFrameRecognizer::RecognizeFrame (
82
+ lldb::StackFrameSP frame_sp) {
83
+ if (frame_sp->GetFrameIndex ())
84
+ return {};
85
+
86
+ ThreadSP thread_sp = frame_sp->GetThread ();
87
+ if (!thread_sp)
88
+ return {};
89
+
90
+ StackFrameSP most_relevant_frame_sp;
91
+ // Unwind until we leave the standard library.
92
+ unsigned max_depth = 16 ;
93
+ for (unsigned i = 1 ; i < max_depth; ++i) {
94
+ most_relevant_frame_sp = thread_sp->GetStackFrameAtIndex (i);
95
+ if (!most_relevant_frame_sp) {
96
+ Log *log = GetLog (LLDBLog::Unwind);
97
+ LLDB_LOG (log ,
98
+ " Swift Runtime Instrumentation Failure Recognizer: Hit "
99
+ " unwinding bound ({0} frames)!" ,
100
+ i);
101
+ return {};
102
+ }
103
+ auto &sc =
104
+ most_relevant_frame_sp->GetSymbolContext (lldb::eSymbolContextFunction);
105
+ ConstString module_name = TypeSystemSwiftTypeRef::GetSwiftModuleFor (&sc);
106
+ if (!module_name)
107
+ continue ;
108
+ if (module_name == swift::STDLIB_NAME)
109
+ continue ;
110
+ if (i + 1 == max_depth)
111
+ return {};
112
+
113
+ break ;
114
+ }
115
+
116
+ std::string runtime_error = thread_sp->GetStopDescriptionRaw ();
117
+ return lldb::RecognizedStackFrameSP (
118
+ new SwiftRuntimeFailureRecognizedStackFrame (most_relevant_frame_sp,
119
+ runtime_error));
73
120
}
74
121
75
122
namespace lldb_private {
76
123
77
124
void RegisterSwiftRuntimeFailureRecognizer (Process &process) {
78
- RegularExpressionSP module_regex_sp = nullptr ;
79
- RegularExpressionSP symbol_regex_sp (
80
- new RegularExpression (" Swift runtime failure" ));
125
+ RegularExpressionSP module_regex_sp = nullptr ;
126
+ {
127
+ auto symbol_regex_sp =
128
+ std::make_shared<RegularExpression>(" Swift runtime failure" );
81
129
82
130
StackFrameRecognizerSP srf_recognizer_sp =
83
131
std::make_shared<SwiftRuntimeFailureFrameRecognizer>();
84
132
85
133
process.GetTarget ().GetFrameRecognizerManager ().AddRecognizer (
86
134
srf_recognizer_sp, module_regex_sp, symbol_regex_sp, false );
135
+ }
136
+ {
137
+ auto symbol_regex_sp =
138
+ std::make_shared<RegularExpression>(" _swift_runtime_on_report" );
139
+
140
+ StackFrameRecognizerSP srf_recognizer_sp =
141
+ std::make_shared<SwiftRuntimeInstrumentedFrameRecognizer>();
142
+
143
+ process.GetTarget ().GetFrameRecognizerManager ().AddRecognizer (
144
+ srf_recognizer_sp, module_regex_sp, symbol_regex_sp, false );
145
+ }
87
146
}
88
147
89
148
} // namespace lldb_private
0 commit comments