[LLDB][Minidump] Add breakpoint stop reasons to the minidump. (#108448) · llvm/llvm-project@5033ea7 (original) (raw)
`@@ -75,8 +75,7 @@ Status MinidumpFileBuilder::AddHeaderAndCalculateDirectories() {
`
75
75
` StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
`
76
76
`if (stop_info_sp) {
`
77
77
`const StopReason &stop_reason = stop_info_sp->GetStopReason();
`
78
``
`-
if (stop_reason == StopReason::eStopReasonException ||
`
79
``
`-
stop_reason == StopReason::eStopReasonSignal)
`
``
78
`+
if (stop_reason != lldb::eStopReasonInvalid)
`
80
79
` m_expected_directories++;
`
81
80
` }
`
82
81
` }
`
`@@ -685,50 +684,45 @@ Status MinidumpFileBuilder::AddExceptions() {
`
685
684
` Status error;
`
686
685
`for (const ThreadSP &thread_sp : thread_list) {
`
687
686
` StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
`
688
``
`-
bool add_exception = false;
`
689
``
`-
if (stop_info_sp) {
`
690
``
`-
switch (stop_info_sp->GetStopReason()) {
`
691
``
`-
case eStopReasonSignal:
`
692
``
`-
case eStopReasonException:
`
693
``
`-
add_exception = true;
`
694
``
`-
break;
`
695
``
`-
default:
`
696
``
`-
break;
`
697
``
`-
}
`
698
``
`-
}
`
699
``
`-
if (add_exception) {
`
700
``
`-
constexpr size_t minidump_exception_size =
`
701
``
`-
sizeof(llvm::minidump::ExceptionStream);
`
702
``
`-
error = AddDirectory(StreamType::Exception, minidump_exception_size);
`
703
``
`-
if (error.Fail())
`
704
``
`-
return error;
`
``
687
`+
// If we don't have a stop info, or if it's invalid, skip.
`
``
688
`+
if (!stop_info_sp ||
`
``
689
`+
stop_info_sp->GetStopReason() == lldb::eStopReasonInvalid)
`
``
690
`+
continue;
`
705
691
``
706
``
`-
StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
`
707
``
`-
RegisterContextSP reg_ctx_sp(thread_sp->GetRegisterContext());
`
708
``
`-
Exception exp_record = {};
`
709
``
`-
exp_record.ExceptionCode =
`
710
``
`-
static_castllvm::support::ulittle32_t(stop_info_sp->GetValue());
`
711
``
`-
exp_record.ExceptionFlags = static_castllvm::support::ulittle32_t(0);
`
712
``
`-
exp_record.ExceptionRecord = static_castllvm::support::ulittle64_t(0);
`
713
``
`-
exp_record.ExceptionAddress = reg_ctx_sp->GetPC();
`
714
``
`-
exp_record.NumberParameters = static_castllvm::support::ulittle32_t(0);
`
715
``
`-
exp_record.UnusedAlignment = static_castllvm::support::ulittle32_t(0);
`
716
``
`-
// exp_record.ExceptionInformation;
`
717
``
-
718
``
`-
ExceptionStream exp_stream;
`
719
``
`-
exp_stream.ThreadId =
`
720
``
`-
static_castllvm::support::ulittle32_t(thread_sp->GetID());
`
721
``
`-
exp_stream.UnusedAlignment = static_castllvm::support::ulittle32_t(0);
`
722
``
`-
exp_stream.ExceptionRecord = exp_record;
`
723
``
`-
auto Iter = m_tid_to_reg_ctx.find(thread_sp->GetID());
`
724
``
`-
if (Iter != m_tid_to_reg_ctx.end()) {
`
725
``
`-
exp_stream.ThreadContext = Iter->second;
`
726
``
`-
} else {
`
727
``
`-
exp_stream.ThreadContext.DataSize = 0;
`
728
``
`-
exp_stream.ThreadContext.RVA = 0;
`
729
``
`-
}
`
730
``
`-
m_data.AppendData(&exp_stream, minidump_exception_size);
`
``
692
`+
constexpr size_t minidump_exception_size =
`
``
693
`+
sizeof(llvm::minidump::ExceptionStream);
`
``
694
`+
error = AddDirectory(StreamType::Exception, minidump_exception_size);
`
``
695
`+
if (error.Fail())
`
``
696
`+
return error;
`
``
697
+
``
698
`+
RegisterContextSP reg_ctx_sp(thread_sp->GetRegisterContext());
`
``
699
`+
Exception exp_record = {};
`
``
700
`+
exp_record.ExceptionCode =
`
``
701
`+
static_castllvm::support::ulittle32_t(stop_info_sp->GetValue());
`
``
702
`+
exp_record.ExceptionFlags =
`
``
703
`+
static_castllvm::support::ulittle32_t(Exception::LLDB_FLAG);
`
``
704
`+
exp_record.ExceptionRecord = static_castllvm::support::ulittle64_t(0);
`
``
705
`+
exp_record.ExceptionAddress = reg_ctx_sp->GetPC();
`
``
706
`+
exp_record.NumberParameters = static_castllvm::support::ulittle32_t(1);
`
``
707
`+
std::string description = stop_info_sp->GetDescription();
`
``
708
`+
// We have 120 bytes to work with and it's unlikely description will
`
``
709
`+
// overflow, but we gotta check.
`
``
710
`+
memcpy(&exp_record.ExceptionInformation, description.c_str(),
`
``
711
`+
std::max(description.size(), Exception::MaxParameterBytes));
`
``
712
`+
exp_record.UnusedAlignment = static_castllvm::support::ulittle32_t(0);
`
``
713
`+
ExceptionStream exp_stream;
`
``
714
`+
exp_stream.ThreadId =
`
``
715
`+
static_castllvm::support::ulittle32_t(thread_sp->GetID());
`
``
716
`+
exp_stream.UnusedAlignment = static_castllvm::support::ulittle32_t(0);
`
``
717
`+
exp_stream.ExceptionRecord = exp_record;
`
``
718
`+
auto Iter = m_tid_to_reg_ctx.find(thread_sp->GetID());
`
``
719
`+
if (Iter != m_tid_to_reg_ctx.end()) {
`
``
720
`+
exp_stream.ThreadContext = Iter->second;
`
``
721
`+
} else {
`
``
722
`+
exp_stream.ThreadContext.DataSize = 0;
`
``
723
`+
exp_stream.ThreadContext.RVA = 0;
`
731
724
` }
`
``
725
`+
m_data.AppendData(&exp_stream, minidump_exception_size);
`
732
726
` }
`
733
727
``
734
728
`return error;
`