lemo created this revision.

The main change is to avoid setting the process state as running when debugging 
core/minidumps (details in the bug).

Also included a few small, related fixes around how the errors propagate in 
this case.


https://reviews.llvm.org/D37651

Files:
  include/lldb/Target/Process.h
  source/Commands/CommandObjectThread.cpp
  source/Plugins/Process/elf-core/ProcessElfCore.cpp
  source/Plugins/Process/elf-core/ProcessElfCore.h
  source/Plugins/Process/minidump/ProcessMinidump.cpp
  source/Plugins/Process/minidump/ProcessMinidump.h
  source/Target/Process.cpp

Index: source/Target/Process.cpp
===================================================================
--- source/Target/Process.cpp
+++ source/Target/Process.cpp
@@ -1615,6 +1615,15 @@
                                                   LIBLLDB_LOG_PROCESS));
   if (log)
     log->Printf("Process::Resume -- locking run lock");
+  if (!CanResume()) {
+    Status error;
+    error.SetErrorStringWithFormat(
+        "error: %s does not support resuming processes",
+        GetPluginName().GetCString());
+    if (log)
+      log->Printf("Process::Resume: -- plugin does not support resuming.");
+    return error;
+  }
   if (!m_public_run_lock.TrySetRunning()) {
     Status error("Resume request failed - process still running.");
     if (log)
@@ -1629,6 +1638,15 @@
                                                   LIBLLDB_LOG_PROCESS));
   if (log)
     log->Printf("Process::ResumeSynchronous -- locking run lock");
+  if (!CanResume()) {
+    Status error;
+    error.SetErrorStringWithFormat(
+        "error: %s does not support resuming processes",
+        GetPluginName().GetCString());
+    if (log)
+      log->Printf("Process::Resume: -- plugin does not support resuming.");
+    return error;
+  }
   if (!m_public_run_lock.TrySetRunning()) {
     Status error("Resume request failed - process still running.");
     if (log)
Index: source/Plugins/Process/minidump/ProcessMinidump.h
===================================================================
--- source/Plugins/Process/minidump/ProcessMinidump.h
+++ source/Plugins/Process/minidump/ProcessMinidump.h
@@ -65,6 +65,10 @@
 
   void RefreshStateAfterStop() override;
 
+  Status DoResume() override;
+
+  bool CanResume() const override { return false; }
+
   bool IsAlive() override;
 
   bool WarnBeforeDetach() const override;
Index: source/Plugins/Process/minidump/ProcessMinidump.cpp
===================================================================
--- source/Plugins/Process/minidump/ProcessMinidump.cpp
+++ source/Plugins/Process/minidump/ProcessMinidump.cpp
@@ -25,6 +25,7 @@
 #include "lldb/Utility/LLDBAssert.h"
 #include "lldb/Utility/Log.h"
 
+#include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Threading.h"
 
@@ -143,6 +144,10 @@
 
 Status ProcessMinidump::DoDestroy() { return Status(); }
 
+Status ProcessMinidump::DoResume() {
+  llvm::report_fatal_error("ProcessMinidump::DoResume() not supported");
+}
+
 void ProcessMinidump::RefreshStateAfterStop() {
   if (!m_active_exception)
     return;
Index: source/Plugins/Process/elf-core/ProcessElfCore.h
===================================================================
--- source/Plugins/Process/elf-core/ProcessElfCore.h
+++ source/Plugins/Process/elf-core/ProcessElfCore.h
@@ -84,11 +84,17 @@
 
   void RefreshStateAfterStop() override;
 
+  lldb_private::Status DoResume() override;
+
+  bool CanResume() const override { return false; }
+
   //------------------------------------------------------------------
   // Process Queries
   //------------------------------------------------------------------
   bool IsAlive() override;
 
+  bool WarnBeforeDetach() const override { return false; }
+
   //------------------------------------------------------------------
   // Process Memory
   //------------------------------------------------------------------
Index: source/Plugins/Process/elf-core/ProcessElfCore.cpp
===================================================================
--- source/Plugins/Process/elf-core/ProcessElfCore.cpp
+++ source/Plugins/Process/elf-core/ProcessElfCore.cpp
@@ -28,6 +28,7 @@
 #include "lldb/Utility/Log.h"
 
 #include "llvm/BinaryFormat/ELF.h"
+#include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/Threading.h"
 
 #include "Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h"
@@ -219,7 +220,7 @@
   ArchSpec core_arch(m_core_module_sp->GetArchitecture());
   target_arch.MergeFrom(core_arch);
   GetTarget().SetArchitecture(target_arch);
- 
+
   SetUnixSignals(UnixSignals::Create(GetArchitecture()));
 
   // Ensure we found at least one thread that was stopped on a signal.
@@ -291,6 +292,10 @@
 
 Status ProcessElfCore::DoDestroy() { return Status(); }
 
+lldb_private::Status ProcessElfCore::DoResume() {
+  llvm::report_fatal_error("ProcessElfCore::DoResume() not supported");
+}
+
 //------------------------------------------------------------------
 // Process Queries
 //------------------------------------------------------------------
@@ -730,7 +735,7 @@
   core_file->GetArchitecture(arch);
 
   ArchSpec target_arch = GetTarget().GetArchitecture();
-  
+
   if (target_arch.IsMIPS())
     return target_arch;
 
Index: source/Commands/CommandObjectThread.cpp
===================================================================
--- source/Commands/CommandObjectThread.cpp
+++ source/Commands/CommandObjectThread.cpp
@@ -94,7 +94,7 @@
     bool all_threads = false;
     if (command.GetArgumentCount() == 0) {
       Thread *thread = m_exe_ctx.GetThreadPtr();
-      if (!HandleOneThread(thread->GetID(), result))
+      if (!thread || !HandleOneThread(thread->GetID(), result))
         return false;
       return result.Succeeded();
     } else if (command.GetArgumentCount() == 1) {
@@ -775,6 +775,12 @@
       else
         error = process->Resume();
 
+      if(!error.Success()) {
+        result.AppendMessage(error.AsCString());
+        result.SetStatus(eReturnStatusFailed);
+        return false;
+      }
+
       // There is a race condition where this thread will return up the call
       // stack to the main command handler
       // and show an (lldb) prompt before HandlePrivateEvent (from
Index: include/lldb/Target/Process.h
===================================================================
--- include/lldb/Target/Process.h
+++ include/lldb/Target/Process.h
@@ -997,6 +997,10 @@
   Status ResumeSynchronous(Stream *stream);
 
   //------------------------------------------------------------------
+  /// Allows subclasses to decide if resuming execution is supported.
+  virtual bool CanResume() const { return true; }
+
+  //------------------------------------------------------------------
   /// Halts a running process.
   ///
   /// This function is not meant to be overridden by Process
@@ -1267,13 +1271,7 @@
   /// @see Thread:Step()
   /// @see Thread:Suspend()
   //------------------------------------------------------------------
-  virtual Status DoResume() {
-    Status error;
-    error.SetErrorStringWithFormat(
-        "error: %s does not support resuming processes",
-        GetPluginName().GetCString());
-    return error;
-  }
+  virtual Status DoResume()  = 0;
 
   //------------------------------------------------------------------
   /// Called after resuming a process.
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to