summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTamas Berghammer <tberghammer@google.com>2015-03-17 14:40:57 +0000
committerTamas Berghammer <tberghammer@google.com>2015-03-17 14:40:57 +0000
commiteadb2a9ed06c9a4686b26aaa0060710e57908d54 (patch)
tree28a116f7e24feaeecbeadad34c80c47f176e7d4a
parent8dc4e1007a365578fe4252402e7c5b7653555961 (diff)
downloadbcm5719-llvm-eadb2a9ed06c9a4686b26aaa0060710e57908d54.tar.gz
bcm5719-llvm-eadb2a9ed06c9a4686b26aaa0060710e57908d54.zip
Report stopped by trace if none of the watchpoint was hit
Some linux kernel reports a watchpoint hit after single stepping even when no watchpoint was hit. This CL looks for a watchpoint which was hit and reports a stop by trace if it haven't found any. Differential revision: http://reviews.llvm.org/D8081 llvm-svn: 232482
-rw-r--r--lldb/include/lldb/Host/common/NativeRegisterContext.h9
-rw-r--r--lldb/source/Host/common/NativeRegisterContext.cpp18
-rw-r--r--lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.h6
-rw-r--r--lldb/source/Plugins/Process/Linux/NativeThreadLinux.cpp49
4 files changed, 62 insertions, 20 deletions
diff --git a/lldb/include/lldb/Host/common/NativeRegisterContext.h b/lldb/include/lldb/Host/common/NativeRegisterContext.h
index e9c03e3c20a..b2d30c2a271 100644
--- a/lldb/include/lldb/Host/common/NativeRegisterContext.h
+++ b/lldb/include/lldb/Host/common/NativeRegisterContext.h
@@ -99,6 +99,15 @@ public:
virtual Error
ClearAllHardwareWatchpoints ();
+ virtual Error
+ IsWatchpointHit (uint8_t wp_index);
+
+ virtual Error
+ IsWatchpointVacant (uint32_t wp_index);
+
+ virtual lldb::addr_t
+ GetWatchpointAddress (uint32_t wp_index);
+
virtual bool
HardwareSingleStep (bool enable);
diff --git a/lldb/source/Host/common/NativeRegisterContext.cpp b/lldb/source/Host/common/NativeRegisterContext.cpp
index 42a9c91a63a..eec05948edf 100644
--- a/lldb/source/Host/common/NativeRegisterContext.cpp
+++ b/lldb/source/Host/common/NativeRegisterContext.cpp
@@ -303,6 +303,24 @@ NativeRegisterContext::ClearAllHardwareWatchpoints ()
return Error ("not implemented");
}
+Error
+NativeRegisterContext::IsWatchpointHit (uint8_t wp_index)
+{
+ return Error ("not implemented");
+}
+
+Error
+NativeRegisterContext::IsWatchpointVacant (uint32_t wp_index)
+{
+ return Error ("not implemented");
+}
+
+lldb::addr_t
+NativeRegisterContext::GetWatchpointAddress (uint32_t wp_index)
+{
+ return LLDB_INVALID_ADDRESS;
+}
+
bool
NativeRegisterContext::HardwareSingleStep (bool enable)
{
diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.h
index b671a322226..0e9d721959b 100644
--- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.h
+++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.h
@@ -46,10 +46,10 @@ namespace lldb_private
WriteAllRegisterValues (const lldb::DataBufferSP &data_sp) override;
Error
- IsWatchpointHit(uint8_t wp_index);
+ IsWatchpointHit(uint8_t wp_index) override;
Error
- IsWatchpointVacant(uint32_t wp_index);
+ IsWatchpointVacant(uint32_t wp_index) override;
bool
ClearHardwareWatchpoint(uint32_t wp_index) override;
@@ -66,7 +66,7 @@ namespace lldb_private
uint32_t watch_flags) override;
lldb::addr_t
- GetWatchpointAddress(uint32_t wp_index);
+ GetWatchpointAddress(uint32_t wp_index) override;
uint32_t
NumSupportedHardwareWatchpoints() override;
diff --git a/lldb/source/Plugins/Process/Linux/NativeThreadLinux.cpp b/lldb/source/Plugins/Process/Linux/NativeThreadLinux.cpp
index de7c8fc2620..3b60cca2e8f 100644
--- a/lldb/source/Plugins/Process/Linux/NativeThreadLinux.cpp
+++ b/lldb/source/Plugins/Process/Linux/NativeThreadLinux.cpp
@@ -382,36 +382,51 @@ NativeThreadLinux::SetStoppedByBreakpoint ()
void
NativeThreadLinux::SetStoppedByWatchpoint ()
{
+ Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
+ lldb::pid_t pid = LLDB_INVALID_PROCESS_ID;
+ if (log)
+ {
+ NativeProcessProtocolSP process_sp = m_process_wp.lock ();
+ if (process_sp)
+ pid = process_sp->GetID ();
+ }
+
const StateType new_state = StateType::eStateStopped;
MaybeLogStateChange (new_state);
m_state = new_state;
- m_stop_info.reason = StopReason::eStopReasonWatchpoint;
- m_stop_info.details.signal.signo = SIGTRAP;
-
- NativeRegisterContextLinux_x86_64 *reg_ctx =
- reinterpret_cast<NativeRegisterContextLinux_x86_64*> (GetRegisterContext().get());
- const uint32_t num_hw_watchpoints =
- reg_ctx->NumSupportedHardwareWatchpoints();
+ NativeRegisterContextSP reg_ctx = GetRegisterContext ();
+ const uint32_t num_hw_watchpoints = reg_ctx->NumSupportedHardwareWatchpoints ();
m_stop_description.clear ();
for (uint32_t wp_index = 0; wp_index < num_hw_watchpoints; ++wp_index)
- if (reg_ctx->IsWatchpointHit(wp_index).Success())
+ {
+ if (reg_ctx->IsWatchpointHit (wp_index).Success())
{
+ if (log)
+ log->Printf ("NativeThreadLinux:%s (pid=%" PRIu64 ", tid=%" PRIu64 ") watchpoint found with idx: %u",
+ __FUNCTION__, pid, GetID (), wp_index);
+
std::ostringstream ostr;
- ostr << reg_ctx->GetWatchpointAddress(wp_index) << " " << wp_index;
+ ostr << reg_ctx->GetWatchpointAddress (wp_index) << " " << wp_index;
m_stop_description = ostr.str();
+
+ m_stop_info.reason = StopReason::eStopReasonWatchpoint;
+ m_stop_info.details.signal.signo = SIGTRAP;
return;
}
- Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
- if (log)
- {
- NativeProcessProtocolSP m_process_sp = m_process_wp.lock ();
- lldb::pid_t pid = m_process_sp ? m_process_sp->GetID () : LLDB_INVALID_PROCESS_ID;
- log->Printf ("NativeThreadLinux: thread (pid=%" PRIu64 ", tid=%" PRIu64 ") "
- "stopped by a watchpoint, but failed to find it",
- pid, GetID ());
}
+
+ // The process reported a watchpoint was hit, but we haven't found the
+ // watchpoint. Assume that a stopped by trace is reported as a hardware
+ // watchpoint what happens on some linux kernels (e.g.: android-arm64
+ // platfrom-21).
+
+ if (log)
+ log->Printf ("NativeThreadLinux:%s (pid=%" PRIu64 ", tid=%" PRIu64 ") none of the watchpoint was hit.",
+ __FUNCTION__, pid, GetID ());
+
+ SetStoppedByTrace ();
}
bool
OpenPOWER on IntegriCloud