[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;

`