Fix up the "lldb log break" channel output.

1) Make the BreakpointEventData::Dump actually do something useful.
2) Make the Breakpoint events print when the break log channel is on
without having to turn on the events channel.

Differential Revision: https://reviews.llvm.org/D120917
This commit is contained in:
Jim Ingham 2022-03-03 09:56:50 -08:00
parent 94623fb1c9
commit 3f438185a6
4 changed files with 44 additions and 5 deletions

View File

@ -81,6 +81,8 @@ class Breakpoint : public std::enable_shared_from_this<Breakpoint>,
public Stoppoint {
public:
static ConstString GetEventIdentifier();
static const char *
BreakpointEventTypeAsCString(lldb::BreakpointEventType type);
/// An enum specifying the match style for breakpoint settings. At present
/// only used for function name style breakpoints.
@ -105,12 +107,14 @@ public:
~BreakpointEventData() override;
static ConstString GetFlavorString();
Log *GetLogChannel() override;
ConstString GetFlavor() const override;
lldb::BreakpointEventType GetBreakpointEventType() const;
lldb::BreakpointSP &GetBreakpoint();
lldb::BreakpointSP GetBreakpoint() const;
BreakpointLocationCollection &GetBreakpointLocationCollection() {
return m_locations;

View File

@ -42,7 +42,9 @@ public:
virtual ~EventData();
virtual ConstString GetFlavor() const = 0;
virtual Log *GetLogChannel() { return nullptr; }
virtual void Dump(Stream *s) const;
private:

View File

@ -1010,6 +1010,28 @@ void Breakpoint::SendBreakpointChangedEvent(BreakpointEventData *data) {
delete data;
}
const char *Breakpoint::BreakpointEventTypeAsCString(BreakpointEventType type) {
switch (type) {
case eBreakpointEventTypeInvalidType: return "invalid";
case eBreakpointEventTypeAdded: return "breakpoint added";
case eBreakpointEventTypeRemoved: return "breakpoint removed";
case eBreakpointEventTypeLocationsAdded: return "locations added";
case eBreakpointEventTypeLocationsRemoved: return "locations removed";
case eBreakpointEventTypeLocationsResolved: return "locations resolved";
case eBreakpointEventTypeEnabled: return "breakpoint enabled";
case eBreakpointEventTypeDisabled: return "breakpoint disabled";
case eBreakpointEventTypeCommandChanged: return "command changed";
case eBreakpointEventTypeConditionChanged: return "condition changed";
case eBreakpointEventTypeIgnoreChanged: return "ignore count changed";
case eBreakpointEventTypeThreadChanged: return "thread changed";
case eBreakpointEventTypeAutoContinueChanged: return "autocontinue changed";
};
}
Log *Breakpoint::BreakpointEventData::GetLogChannel() {
return GetLog(LLDBLog::Breakpoints);
}
Breakpoint::BreakpointEventData::BreakpointEventData(
BreakpointEventType sub_type, const BreakpointSP &new_breakpoint_sp)
: m_breakpoint_event(sub_type), m_new_breakpoint_sp(new_breakpoint_sp) {}
@ -1025,7 +1047,7 @@ ConstString Breakpoint::BreakpointEventData::GetFlavor() const {
return BreakpointEventData::GetFlavorString();
}
BreakpointSP &Breakpoint::BreakpointEventData::GetBreakpoint() {
BreakpointSP Breakpoint::BreakpointEventData::GetBreakpoint() const {
return m_new_breakpoint_sp;
}
@ -1034,7 +1056,14 @@ Breakpoint::BreakpointEventData::GetBreakpointEventType() const {
return m_breakpoint_event;
}
void Breakpoint::BreakpointEventData::Dump(Stream *s) const {}
void Breakpoint::BreakpointEventData::Dump(Stream *s) const {
if (!s)
return;
BreakpointEventType event_type = GetBreakpointEventType();
break_id_t bkpt_id = GetBreakpoint()->GetID();
s->Format("bkpt: {0} type: {1}", bkpt_id,
BreakpointEventTypeAsCString(event_type));
}
const Breakpoint::BreakpointEventData *
Breakpoint::BreakpointEventData::GetEventDataFromEvent(const Event *event) {

View File

@ -208,7 +208,11 @@ void Broadcaster::BroadcasterImpl::PrivateBroadcastEvent(EventSP &event_sp,
hijacking_listener_sp.reset();
}
if (Log *log = GetLog(LLDBLog::Events)) {
Log *log = GetLog(LLDBLog::Events);
if (!log && event_sp->GetData())
log = event_sp->GetData()->GetLogChannel();
if (log) {
StreamString event_description;
event_sp->Dump(&event_description);
LLDB_LOGF(log,