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:
Johnny Chen 2011-09-21 22:47:15 +00:00
parent 8a529dc10a
commit fd158f411a
5 changed files with 51 additions and 8 deletions

View File

@ -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);

View File

@ -53,7 +53,7 @@ public:
// ----------------------------------------------
// eStopReasonBreakpoint BreakpointSiteID
// eStopReasonSignal Signal number
// eStopReasonWatchpoint WatchpointSiteID
// eStopReasonWatchpoint WatchpointLocationID
// eStopReasonPlanComplete No significance
uint64_t

View File

@ -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;
}

View File

@ -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;
};

View File

@ -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