jingham created this revision. jingham added reviewers: labath, JDevlieghere. Herald added a project: All. jingham requested review of this revision. Herald added a project: LLDB. Herald added a subscriber: lldb-commits.
I was trying to figure out a problem with how a client was seeing the breakpoint events, and was impeded by two things: 1. The BreakpointEventData::Dump did nothing 2. In order to see the breakpoint events you had to turn on the event log stream, and that's really noisy. I fixed (1) straightforwardly by printing the breakpoint ID and event type. More than that is probably overkill I fixed (2) by adding a backstop in the "event" log channel printing where the EventData for the event can provide a Log channel. Then I made the BreakpointEventData return the breakpoint log (if it's on of course), so you can see breakpoint event logging & break logging but not all the other event logging. I didn't go through and make the other EventData subclasses implement this method. It's not guaranteed that having the event data come out along with the regular log traffic is helpful rather than noisy. For the breakpoints it is clearly helpful since there aren't that many events sent by the system. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D120917 Files: lldb/include/lldb/Breakpoint/Breakpoint.h lldb/include/lldb/Utility/Event.h lldb/source/Breakpoint/Breakpoint.cpp lldb/source/Utility/Broadcaster.cpp
Index: lldb/source/Utility/Broadcaster.cpp =================================================================== --- lldb/source/Utility/Broadcaster.cpp +++ lldb/source/Utility/Broadcaster.cpp @@ -208,7 +208,11 @@ 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, Index: lldb/source/Breakpoint/Breakpoint.cpp =================================================================== --- lldb/source/Breakpoint/Breakpoint.cpp +++ lldb/source/Breakpoint/Breakpoint.cpp @@ -1010,6 +1010,28 @@ 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 @@ return BreakpointEventData::GetFlavorString(); } -BreakpointSP &Breakpoint::BreakpointEventData::GetBreakpoint() { +BreakpointSP Breakpoint::BreakpointEventData::GetBreakpoint() const { return m_new_breakpoint_sp; } @@ -1034,7 +1056,14 @@ 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) { Index: lldb/include/lldb/Utility/Event.h =================================================================== --- lldb/include/lldb/Utility/Event.h +++ lldb/include/lldb/Utility/Event.h @@ -42,7 +42,9 @@ virtual ~EventData(); virtual ConstString GetFlavor() const = 0; - + + virtual Log *GetLogChannel() { return nullptr; } + virtual void Dump(Stream *s) const; private: Index: lldb/include/lldb/Breakpoint/Breakpoint.h =================================================================== --- lldb/include/lldb/Breakpoint/Breakpoint.h +++ lldb/include/lldb/Breakpoint/Breakpoint.h @@ -81,6 +81,8 @@ 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 @@ ~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;
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits