@@ -208,26 +208,21 @@ Status ProcessMinidump::DoLoadCore() {
208
208
GetTarget ().SetArchitecture (arch, true /* set_platform*/ );
209
209
210
210
m_thread_list = m_minidump_parser->GetThreads ();
211
- std::optional<std::vector<const minidump::ExceptionStream *>>
212
- exception_streams = m_minidump_parser->GetExceptionStreams ();
213
-
214
- if (exception_streams) {
215
- for (const auto *exception_stream : *exception_streams) {
216
- if (!exception_stream) {
217
- error.SetErrorString (
218
- " Minidump returned null pointer for exception stream" );
219
- return error;
220
- }
221
- if (!m_exceptions_by_tid
222
- .try_emplace (exception_stream->ThreadId , exception_stream)
223
- .second ) {
224
- // We only cast to avoid the warning around converting little endian in
225
- // printf.
226
- error.SetErrorStringWithFormat (
227
- " Duplicate exception stream for tid %" PRIu32,
228
- (uint32_t )exception_stream->ThreadId );
229
- return error;
230
- }
211
+ auto exception_stream_it = m_minidump_parser->GetExceptionStreams ();
212
+ for (auto exception_stream : exception_stream_it) {
213
+ // If we can't read an exception stream skip it
214
+ // We should probably serve a warning
215
+ if (!exception_stream)
216
+ continue ;
217
+
218
+ if (!m_exceptions_by_tid
219
+ .try_emplace (exception_stream->ThreadId , exception_stream.get ())
220
+ .second ) {
221
+ // We only cast to avoid the warning around converting little endian in
222
+ // printf.
223
+ return Status::FromErrorStringWithFormat (
224
+ " Duplicate exception stream for tid %" PRIu32,
225
+ (uint32_t )exception_stream->ThreadId );
231
226
}
232
227
}
233
228
@@ -254,7 +249,7 @@ void ProcessMinidump::RefreshStateAfterStop() {
254
249
255
250
for (const auto &[_, exception_stream] : m_exceptions_by_tid) {
256
251
constexpr uint32_t BreakpadDumpRequested = 0xFFFFFFFF ;
257
- if (exception_stream-> ExceptionRecord .ExceptionCode ==
252
+ if (exception_stream. ExceptionRecord .ExceptionCode ==
258
253
BreakpadDumpRequested) {
259
254
// This "ExceptionCode" value is a sentinel that is sometimes used
260
255
// when generating a dump for a process that hasn't crashed.
@@ -271,12 +266,12 @@ void ProcessMinidump::RefreshStateAfterStop() {
271
266
lldb::StopInfoSP stop_info;
272
267
lldb::ThreadSP stop_thread;
273
268
274
- Process::m_thread_list.SetSelectedThreadByID (exception_stream-> ThreadId );
269
+ Process::m_thread_list.SetSelectedThreadByID (exception_stream. ThreadId );
275
270
stop_thread = Process::m_thread_list.GetSelectedThread ();
276
271
ArchSpec arch = GetArchitecture ();
277
272
278
273
if (arch.GetTriple ().getOS () == llvm::Triple::Linux) {
279
- uint32_t signo = exception_stream-> ExceptionRecord .ExceptionCode ;
274
+ uint32_t signo = exception_stream. ExceptionRecord .ExceptionCode ;
280
275
if (signo == 0 ) {
281
276
// No stop.
282
277
return ;
@@ -285,18 +280,18 @@ void ProcessMinidump::RefreshStateAfterStop() {
285
280
stop_info = StopInfo::CreateStopReasonWithSignal (*stop_thread, signo);
286
281
} else if (arch.GetTriple ().getVendor () == llvm::Triple::Apple) {
287
282
stop_info = StopInfoMachException::CreateStopReasonWithMachException (
288
- *stop_thread, exception_stream-> ExceptionRecord .ExceptionCode , 2 ,
289
- exception_stream-> ExceptionRecord .ExceptionFlags ,
290
- exception_stream-> ExceptionRecord .ExceptionAddress , 0 );
283
+ *stop_thread, exception_stream. ExceptionRecord .ExceptionCode , 2 ,
284
+ exception_stream. ExceptionRecord .ExceptionFlags ,
285
+ exception_stream. ExceptionRecord .ExceptionAddress , 0 );
291
286
} else {
292
287
std::string desc;
293
288
llvm::raw_string_ostream desc_stream (desc);
294
289
desc_stream << " Exception "
295
290
<< llvm::format_hex (
296
- exception_stream-> ExceptionRecord .ExceptionCode , 8 )
291
+ exception_stream. ExceptionRecord .ExceptionCode , 8 )
297
292
<< " encountered at address "
298
293
<< llvm::format_hex (
299
- exception_stream-> ExceptionRecord .ExceptionAddress , 8 );
294
+ exception_stream. ExceptionRecord .ExceptionAddress , 8 );
300
295
stop_info = StopInfo::CreateStopReasonWithException (
301
296
*stop_thread, desc_stream.str ().c_str ());
302
297
}
@@ -405,7 +400,7 @@ bool ProcessMinidump::DoUpdateThreadList(ThreadList &old_thread_list,
405
400
406
401
// If the minidump contains an exception context, use it
407
402
if (m_exceptions_by_tid.count (thread.ThreadId ) > 0 )
408
- context_location = m_exceptions_by_tid[thread.ThreadId ]-> ThreadContext ;
403
+ context_location = m_exceptions_by_tid[thread.ThreadId ]. ThreadContext ;
409
404
410
405
llvm::ArrayRef<uint8_t > context;
411
406
if (!m_is_wow64)
0 commit comments