Author: jmolenda
Date: Thu Dec 15 20:48:39 2016
New Revision: 289913

URL: http://llvm.org/viewvc/llvm-project?rev=289913&view=rev
Log:
Fix a bug when using a StructuredData darwin-log plugin
where we would insert a breakpoint into a system library
but never remove it, so the second time we ran the binary
there would be two breakpoints and the debugger would
stop there.

<rdar://problem/29654974> 

Modified:
    
lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp
    lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.h
    lldb/trunk/source/Target/Process.cpp

Modified: 
lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp?rev=289913&r1=289912&r2=289913&view=diff
==============================================================================
--- 
lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp 
(original)
+++ 
lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp 
Thu Dec 15 20:48:39 2016
@@ -1405,6 +1405,20 @@ void StructuredDataDarwinLog::ModulesDid
   EnableNow();
 }
 
+// 
-----------------------------------------------------------------------------
+// public destructor
+// 
-----------------------------------------------------------------------------
+
+StructuredDataDarwinLog::~StructuredDataDarwinLog() {
+  if (m_breakpoint_id != LLDB_INVALID_BREAK_ID) {
+    ProcessSP process_sp(GetProcess());
+    if (process_sp) {
+      process_sp->GetTarget().RemoveBreakpointByID(m_breakpoint_id);
+      m_breakpoint_id = LLDB_INVALID_BREAK_ID;
+    }
+  }
+}
+
 #pragma mark -
 #pragma mark Private instance methods
 
@@ -1415,7 +1429,8 @@ void StructuredDataDarwinLog::ModulesDid
 StructuredDataDarwinLog::StructuredDataDarwinLog(const ProcessWP &process_wp)
     : StructuredDataPlugin(process_wp), m_recorded_first_timestamp(false),
       m_first_timestamp_seen(0), m_is_enabled(false),
-      m_added_breakpoint_mutex(), m_added_breakpoint() {}
+      m_added_breakpoint_mutex(), m_added_breakpoint(),
+      m_breakpoint_id(LLDB_INVALID_BREAK_ID) {}
 
 // 
-----------------------------------------------------------------------------
 // Private static methods
@@ -1734,6 +1749,7 @@ void StructuredDataDarwinLog::AddInitCom
 
   // Set our callback.
   breakpoint_sp->SetCallback(InitCompletionHookCallback, nullptr);
+  m_breakpoint_id = breakpoint_sp->GetID();
   if (log)
     log->Printf("StructuredDataDarwinLog::%s() breakpoint set in module %s,"
                 "function %s (process uid %u)",

Modified: 
lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.h
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.h?rev=289913&r1=289912&r2=289913&view=diff
==============================================================================
--- 
lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.h 
(original)
+++ 
lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.h 
Thu Dec 15 20:48:39 2016
@@ -74,6 +74,8 @@ public:
 
   void ModulesDidLoad(Process &process, ModuleList &module_list) override;
 
+  ~StructuredDataDarwinLog();
+
 private:
   // -------------------------------------------------------------------------
   // Private constructors
@@ -129,6 +131,7 @@ private:
   bool m_is_enabled;
   std::mutex m_added_breakpoint_mutex;
   bool m_added_breakpoint;
+  lldb::user_id_t m_breakpoint_id;
 };
 }
 

Modified: lldb/trunk/source/Target/Process.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=289913&r1=289912&r2=289913&view=diff
==============================================================================
--- lldb/trunk/source/Target/Process.cpp (original)
+++ lldb/trunk/source/Target/Process.cpp Thu Dec 15 20:48:39 2016
@@ -889,6 +889,7 @@ void Process::Finalize() {
   m_public_run_lock.SetStopped();
   m_private_run_lock.TrySetRunning(); // This will do nothing if already locked
   m_private_run_lock.SetStopped();
+  m_structured_data_plugin_map.clear();
   m_finalize_called = true;
 }
 


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to