forked from OSchip/llvm-project
StopInfoWatchpoint should override the StopInfo::ShouldStop() virtual method and delegate to
the WatchpointLocation object to check whether it should stop and allow it to update the hit count, among other bookkeepings. llvm-svn: 140279
This commit is contained in:
parent
8a529dc10a
commit
fd158f411a
|
@ -40,12 +40,14 @@ public:
|
|||
void
|
||||
SetEnabled (bool enabled);
|
||||
|
||||
virtual bool
|
||||
ShouldStop (StoppointCallbackContext *context);
|
||||
|
||||
bool WatchpointRead () const;
|
||||
bool WatchpointWrite () const;
|
||||
uint32_t GetIgnoreCount () const;
|
||||
void SetIgnoreCount (uint32_t n);
|
||||
void SetWatchpointType (uint32_t type);
|
||||
bool BreakpointWasHit (StoppointCallbackContext *context);
|
||||
bool SetCallback (WatchpointHitCallback callback, void *callback_baton);
|
||||
void SetDeclInfo (std::string &str);
|
||||
void GetDescription (Stream *s, lldb::DescriptionLevel level);
|
||||
|
|
|
@ -53,7 +53,7 @@ public:
|
|||
// ----------------------------------------------
|
||||
// eStopReasonBreakpoint BreakpointSiteID
|
||||
// eStopReasonSignal Signal number
|
||||
// eStopReasonWatchpoint WatchpointSiteID
|
||||
// eStopReasonWatchpoint WatchpointLocationID
|
||||
// eStopReasonPlanComplete No significance
|
||||
|
||||
uint64_t
|
||||
|
|
|
@ -62,7 +62,7 @@ WatchpointLocation::SetDeclInfo (std::string &str)
|
|||
// should continue.
|
||||
|
||||
bool
|
||||
WatchpointLocation::BreakpointWasHit (StoppointCallbackContext *context)
|
||||
WatchpointLocation::ShouldStop (StoppointCallbackContext *context)
|
||||
{
|
||||
m_hit_count++;
|
||||
|
||||
|
@ -73,7 +73,11 @@ WatchpointLocation::BreakpointWasHit (StoppointCallbackContext *context)
|
|||
access |= LLDB_WATCH_TYPE_READ;
|
||||
if (m_watch_was_written)
|
||||
access |= LLDB_WATCH_TYPE_WRITE;
|
||||
return m_callback(m_callback_baton, context, GetID(), access);
|
||||
|
||||
if (m_callback)
|
||||
return m_callback(m_callback_baton, context, GetID(), access);
|
||||
else
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -324,8 +324,10 @@ class StopInfoWatchpoint : public StopInfo
|
|||
public:
|
||||
|
||||
StopInfoWatchpoint (Thread &thread, break_id_t watch_id) :
|
||||
StopInfo (thread, watch_id),
|
||||
m_description()
|
||||
StopInfo(thread, watch_id),
|
||||
m_description(),
|
||||
m_should_stop(false),
|
||||
m_should_stop_is_valid(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -339,6 +341,40 @@ public:
|
|||
return eStopReasonWatchpoint;
|
||||
}
|
||||
|
||||
virtual bool
|
||||
ShouldStop (Event *event_ptr)
|
||||
{
|
||||
// ShouldStop() method is idempotent and should not affect hit count.
|
||||
if (m_should_stop_is_valid)
|
||||
return m_should_stop;
|
||||
|
||||
WatchpointLocationSP wp_loc_sp =
|
||||
m_thread.GetProcess().GetTarget().GetWatchpointLocationList().FindByID(GetValue());
|
||||
if (wp_loc_sp)
|
||||
{
|
||||
// Check if we should stop at a watchpoint.
|
||||
StoppointCallbackContext context (event_ptr,
|
||||
&m_thread.GetProcess(),
|
||||
&m_thread,
|
||||
m_thread.GetStackFrameAtIndex(0).get(),
|
||||
true);
|
||||
|
||||
m_should_stop = wp_loc_sp->ShouldStop (&context);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
|
||||
|
||||
if (log)
|
||||
log->Printf ("Process::%s could not find watchpoint location id: %lld...",
|
||||
__FUNCTION__, GetValue());
|
||||
|
||||
m_should_stop = true;
|
||||
}
|
||||
m_should_stop_is_valid = true;
|
||||
return m_should_stop;
|
||||
}
|
||||
|
||||
virtual const char *
|
||||
GetDescription ()
|
||||
{
|
||||
|
@ -351,10 +387,10 @@ public:
|
|||
return m_description.c_str();
|
||||
}
|
||||
|
||||
|
||||
|
||||
private:
|
||||
std::string m_description;
|
||||
bool m_should_stop;
|
||||
bool m_should_stop_is_valid;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -99,6 +99,7 @@ ThreadPlanBase::ShouldStop (Event *event_ptr)
|
|||
return false;
|
||||
|
||||
case eStopReasonBreakpoint:
|
||||
case eStopReasonWatchpoint:
|
||||
if (stop_info_sp->ShouldStop(event_ptr))
|
||||
{
|
||||
// If we are going to stop for a breakpoint, then unship the other plans
|
||||
|
|
Loading…
Reference in New Issue