lemo created this revision.
lemo added reviewers: zturner, clayborg, amccarth.

There was no way to find out what's wrong if SBProcess SBTarget::LoadCore(const 
char *core_file) failed. 
Additionally, the implementation was unconditionally setting sb_process, so it 
wasn't even possible to check if the return SBProcess is valid.

This change adds a new overload which surfaces the errors and also returns a 
valid SBProcess only if the core load succeeds:

SBProcess SBTarget::LoadCore(const char *core_file, SBError &error);


https://reviews.llvm.org/D48049

Files:
  include/lldb/API/SBTarget.h
  scripts/interface/SBTarget.i
  source/API/SBTarget.cpp

Index: source/API/SBTarget.cpp
===================================================================
--- source/API/SBTarget.cpp
+++ source/API/SBTarget.cpp
@@ -203,16 +203,26 @@
 }
 
 SBProcess SBTarget::LoadCore(const char *core_file) {
+  lldb::SBError error; // Ignored
+  return LoadCore(core_file, error);
+}
+
+SBProcess SBTarget::LoadCore(const char *core_file, lldb::SBError &error) {
   SBProcess sb_process;
   TargetSP target_sp(GetSP());
   if (target_sp) {
     FileSpec filespec(core_file, true);
     ProcessSP process_sp(target_sp->CreateProcess(
         target_sp->GetDebugger().GetListener(), "", &filespec));
     if (process_sp) {
-      process_sp->LoadCore();
-      sb_process.SetSP(process_sp);
+      error.SetError(process_sp->LoadCore());
+      if (error.Success())
+        sb_process.SetSP(process_sp);
+    } else {
+      error.SetErrorString("Failed to create the process");
     }
+  } else {
+    error.SetErrorString("SBTarget is invalid");
   }
   return sb_process;
 }
Index: scripts/interface/SBTarget.i
===================================================================
--- scripts/interface/SBTarget.i
+++ scripts/interface/SBTarget.i
@@ -77,7 +77,7 @@
 
     static const char *
     GetBroadcasterClassName ();
-    
+
     bool
     IsValid() const;
 
@@ -145,7 +145,7 @@
     ///     An optional listener that will receive all process events.
     ///     If \a listener is valid then \a listener will listen to all
     ///     process events. If not valid, then this target's debugger
-    ///     (SBTarget::GetDebugger()) will listen to all process events. 
+    ///     (SBTarget::GetDebugger()) will listen to all process events.
     ///
     /// @param[in] argv
     ///     The argument array.
@@ -175,7 +175,7 @@
     ///     The working directory to have the child process run in
     ///
     /// @param[in] launch_flags
-    ///     Some launch options specified by logical OR'ing 
+    ///     Some launch options specified by logical OR'ing
     ///     lldb::LaunchFlags enumeration values together.
     ///
     /// @param[in] stop_at_entry
@@ -203,7 +203,7 @@
     run to completion if no user interaction is required.
     ") Launch;
     lldb::SBProcess
-    Launch (SBListener &listener, 
+    Launch (SBListener &listener,
             char const **argv,
             char const **envp,
             const char *stdin_path,
@@ -213,7 +213,7 @@
             uint32_t launch_flags,   // See LaunchFlags
             bool stop_at_entry,
             lldb::SBError& error);
-            
+
     %feature("docstring", "
     //------------------------------------------------------------------
     /// Launch a new process with sensible defaults.
@@ -250,10 +250,10 @@
     executable.
     ") LaunchSimple;
     lldb::SBProcess
-    LaunchSimple (const char **argv, 
+    LaunchSimple (const char **argv,
                   const char **envp,
                   const char *working_directory);
-    
+
     lldb::SBProcess
     Launch (lldb::SBLaunchInfo &launch_info, lldb::SBError& error);
 
@@ -264,6 +264,10 @@
     /// @param[in] core_file
     ///     File path of the core dump.
     ///
+    /// @param[out] error
+    ///     An error explaining what went wrong if the operation fails.
+    ///     (Optional)
+    ///
     /// @return
     ///      A process object for the newly created core file.
     //------------------------------------------------------------------
@@ -275,11 +279,13 @@
     loads a new core file and returns the process object.
     ") LoadCore;
     lldb::SBProcess
-    LoadCore(const char *core_file);
-    
+    LoadCore (const char *core_file);
+
+    lldb::SBProcess
+    LoadCore (const char *core_file, lldb::SBError &error);
+
     lldb::SBProcess
     Attach (lldb::SBAttachInfo &attach_info, lldb::SBError& error);
-    
 
     %feature("docstring", "
     //------------------------------------------------------------------
@@ -363,7 +369,7 @@
                    const char *url,
                    const char *plugin_name,
                    SBError& error);
-    
+
     lldb::SBFileSpec
     GetExecutable ();
 
@@ -401,10 +407,10 @@
 
     lldb::ByteOrder
     GetByteOrder ();
-    
+
     uint32_t
     GetAddressByteSize();
-    
+
     const char *
     GetTriple ();
 
@@ -457,21 +463,21 @@
     ///     A logical OR of one or more FunctionNameType enum bits that
     ///     indicate what kind of names should be used when doing the
     ///     lookup. Bits include fully qualified names, base names,
-    ///     C++ methods, or ObjC selectors. 
+    ///     C++ methods, or ObjC selectors.
     ///     See FunctionNameType for more details.
     ///
     /// @return
-    ///     A lldb::SBSymbolContextList that gets filled in with all of 
+    ///     A lldb::SBSymbolContextList that gets filled in with all of
     ///     the symbol contexts for all the matches.
     //------------------------------------------------------------------
     ") FindFunctions;
     lldb::SBSymbolContextList
-    FindFunctions (const char *name, 
+    FindFunctions (const char *name,
                    uint32_t name_type_mask = lldb::eFunctionNameTypeAny);
-    
+
     lldb::SBType
     FindFirstType (const char* type);
-    
+
     lldb::SBTypeList
     FindTypes (const char* type);
 
@@ -497,7 +503,7 @@
     //------------------------------------------------------------------
     ") FindGlobalVariables;
     lldb::SBValueList
-    FindGlobalVariables (const char *name, 
+    FindGlobalVariables (const char *name,
                          uint32_t max_matches);
 
      %feature("docstring", "
@@ -515,7 +521,7 @@
     lldb::SBValue
     FindFirstGlobalVariable (const char* name);
 
-    
+
     lldb::SBValueList
     FindGlobalVariables(const char *name,
                         uint32_t max_matches,
@@ -544,26 +550,26 @@
 
     lldb::SBAddress
     ResolveLoadAddress (lldb::addr_t vm_addr);
-              
+
     lldb::SBAddress
     ResolvePastLoadAddress (uint32_t stop_id, lldb::addr_t vm_addr);
 
     SBSymbolContext
-    ResolveSymbolContextForAddress (const SBAddress& addr, 
+    ResolveSymbolContextForAddress (const SBAddress& addr,
                                     uint32_t resolve_scope);
 
      %feature("docstring", "
     //------------------------------------------------------------------
-    /// Read target memory. If a target process is running then memory  
+    /// Read target memory. If a target process is running then memory
     /// is read from here. Otherwise the memory is read from the object
     /// files. For a target whose bytes are sized as a multiple of host
     /// bytes, the data read back will preserve the target's byte order.
     ///
     /// @param[in] addr
-    ///     A target address to read from. 
+    ///     A target address to read from.
     ///
     /// @param[out] buf
-    ///     The buffer to read memory into. 
+    ///     The buffer to read memory into.
     ///
     /// @param[in] size
     ///     The maximum number of host bytes to read in the buffer passed
@@ -589,23 +595,23 @@
     BreakpointCreateByLocation (const lldb::SBFileSpec &file_spec, uint32_t line, lldb::addr_t offset);
 
     lldb::SBBreakpoint
-    BreakpointCreateByLocation (const lldb::SBFileSpec &file_spec, uint32_t line, 
+    BreakpointCreateByLocation (const lldb::SBFileSpec &file_spec, uint32_t line,
                                 lldb::addr_t offset, SBFileSpecList &module_list);
 
     lldb::SBBreakpoint
     BreakpointCreateByName (const char *symbol_name, const char *module_name = NULL);
 
     lldb::SBBreakpoint
     BreakpointCreateByName (const char *symbol_name,
                             uint32_t func_name_type,           // Logical OR one or more FunctionNameType enum bits
-                            const SBFileSpecList &module_list, 
+                            const SBFileSpecList &module_list,
                             const SBFileSpecList &comp_unit_list);
 
     lldb::SBBreakpoint
     BreakpointCreateByName (const char *symbol_name,
                             uint32_t func_name_type,           // Logical OR one or more FunctionNameType enum bits
                             lldb::LanguageType symbol_language,
-                            const SBFileSpecList &module_list, 
+                            const SBFileSpecList &module_list,
                             const SBFileSpecList &comp_unit_list);
 
 %typemap(in) (const char **symbol_name, uint32_t num_names) {
@@ -670,7 +676,7 @@
     lldb::SBBreakpoint
     BreakpointCreateByRegex (const char *symbol_name_regex,
                              lldb::LanguageType symbol_language,
-                             const SBFileSpecList &module_list, 
+                             const SBFileSpecList &module_list,
                              const SBFileSpecList &comp_unit_list);
 
     lldb::SBBreakpoint
@@ -708,7 +714,7 @@
     lldb::SBBreakpoint
     FindBreakpointByID (break_id_t break_id);
 
-  
+
     bool FindBreakpointsByName(const char *name, SBBreakpointList &bkpt_list);
 
     void DeleteBreakpointName(const char *name);
@@ -726,35 +732,35 @@
 
      %feature("docstring", "
     //------------------------------------------------------------------
-    /// Read breakpoints from source_file and return the newly created 
+    /// Read breakpoints from source_file and return the newly created
     /// breakpoints in bkpt_list.
     ///
     /// @param[in] source_file
     ///    The file from which to read the breakpoints
-    /// 
+    ///
     /// @param[out] bkpt_list
     ///    A list of the newly created breakpoints.
     ///
     /// @return
     ///     An SBError detailing any errors in reading in the breakpoints.
     //------------------------------------------------------------------
     ") BreakpointsCreateFromFile;
     lldb::SBError
-    BreakpointsCreateFromFile(SBFileSpec &source_file, 
+    BreakpointsCreateFromFile(SBFileSpec &source_file,
                               SBBreakpointList &bkpt_list);
 
      %feature("docstring", "
     //------------------------------------------------------------------
-    /// Read breakpoints from source_file and return the newly created 
+    /// Read breakpoints from source_file and return the newly created
     /// breakpoints in bkpt_list.
     ///
     /// @param[in] source_file
     ///    The file from which to read the breakpoints
     ///
     /// @param[in] matching_names
     ///    Only read in breakpoints whose names match one of the names in this
     ///    list.
-    /// 
+    ///
     /// @param[out] bkpt_list
     ///    A list of the newly created breakpoints.
     ///
@@ -779,7 +785,7 @@
     ") BreakpointsCreateFromFile;
     lldb::SBError
     BreakpointsWriteToFile(SBFileSpec &dest_file);
-      
+
      %feature("docstring", "
     //------------------------------------------------------------------
     /// Write breakpoints listed in bkpt_list to dest_file.
@@ -800,42 +806,42 @@
     //------------------------------------------------------------------
     ") BreakpointsCreateFromFile;
     lldb::SBError
-    BreakpointsWriteToFile(SBFileSpec &dest_file, 
+    BreakpointsWriteToFile(SBFileSpec &dest_file,
                            SBBreakpointList &bkpt_list,
                            bool append = false);
 
     uint32_t
     GetNumWatchpoints () const;
-    
+
     lldb::SBWatchpoint
     GetWatchpointAtIndex (uint32_t idx) const;
-    
+
     bool
     DeleteWatchpoint (lldb::watch_id_t watch_id);
-    
+
     lldb::SBWatchpoint
     FindWatchpointByID (lldb::watch_id_t watch_id);
-    
+
     bool
     EnableAllWatchpoints ();
-    
+
     bool
     DisableAllWatchpoints ();
-    
+
     bool
     DeleteAllWatchpoints ();
 
     lldb::SBWatchpoint
-    WatchAddress (lldb::addr_t addr, 
-                  size_t size, 
-                  bool read, 
+    WatchAddress (lldb::addr_t addr,
+                  size_t size,
+                  bool read,
                   bool write,
                   SBError &error);
-             
+
 
     lldb::SBBroadcaster
     GetBroadcaster () const;
-              
+
      %feature("docstring", "
     //------------------------------------------------------------------
     /// Create an SBValue with the given name by treating the memory starting at addr as an entity of type.
@@ -859,20 +865,20 @@
 
     lldb::SBValue
     CreateValueFromData (const char *name, lldb::SBData data, lldb::SBType type);
-  
+
     lldb::SBValue
     CreateValueFromExpression (const char *name, const char* expr);
-              
+
     %feature("docstring", "
     Disassemble a specified number of instructions starting at an address.
     Parameters:
        base_addr       -- the address to start disassembly from
        count           -- the number of instructions to disassemble
        flavor_string   -- may be 'intel' or 'att' on x86 targets to specify that style of disassembly
-    Returns an SBInstructionList.") 
+    Returns an SBInstructionList.")
     ReadInstructions;
     lldb::SBInstructionList
-    ReadInstructions (lldb::SBAddress base_addr, uint32_t count);    
+    ReadInstructions (lldb::SBAddress base_addr, uint32_t count);
 
     lldb::SBInstructionList
     ReadInstructions (lldb::SBAddress base_addr, uint32_t count, const char *flavor_string);
@@ -883,7 +889,7 @@
        base_addr -- used for symbolicating the offsets in the byte stream when disassembling
        buf       -- bytes to be disassembled
        size      -- (C++) size of the buffer
-    Returns an SBInstructionList.") 
+    Returns an SBInstructionList.")
     GetInstructions;
     lldb::SBInstructionList
     GetInstructions (lldb::SBAddress base_addr, const void *buf, size_t size);
@@ -895,17 +901,17 @@
        flavor    -- may be 'intel' or 'att' on x86 targets to specify that style of disassembly
        buf       -- bytes to be disassembled
        size      -- (C++) size of the buffer
-    Returns an SBInstructionList.") 
+    Returns an SBInstructionList.")
     GetInstructionsWithFlavor;
     lldb::SBInstructionList
     GetInstructionsWithFlavor (lldb::SBAddress base_addr, const char *flavor_string, const void *buf, size_t size);
-    
+
     lldb::SBSymbolContextList
     FindSymbols (const char *name, lldb::SymbolType type = eSymbolTypeAny);
 
     bool
     GetDescription (lldb::SBStream &description, lldb::DescriptionLevel description_level);
-    
+
     lldb::addr_t
     GetStackRedZoneSize();
 
@@ -934,12 +940,12 @@
             '''A helper object that will lazily hand out lldb.SBModule objects for a target when supplied an index, or by full or partial path.'''
             def __init__(self, sbtarget):
                 self.sbtarget = sbtarget
-        
+
             def __len__(self):
                 if self.sbtarget:
                     return int(self.sbtarget.GetNumModules())
                 return 0
-        
+
             def __getitem__(self, key):
                 num_modules = self.sbtarget.GetNumModules()
                 if type(key) is int:
@@ -982,11 +988,11 @@
                 else:
                     print("error: unsupported item type: %s" % type(key))
                 return None
-        
+
         def get_modules_access_object(self):
             '''An accessor function that returns a modules_access() object which allows lazy module access from a lldb.SBTarget object.'''
             return self.modules_access (self)
-        
+
         def get_modules_array(self):
             '''An accessor function that returns a list() that contains all modules in a lldb.SBTarget object.'''
             modules = []
@@ -1017,13 +1023,13 @@
 
         __swig_getmethods__["broadcaster"] = GetBroadcaster
         if _newclass: broadcaster = property(GetBroadcaster, None, doc='''A read only property that an lldb object that represents the broadcaster (lldb.SBBroadcaster) for this target.''')
-        
+
         __swig_getmethods__["byte_order"] = GetByteOrder
         if _newclass: byte_order = property(GetByteOrder, None, doc='''A read only property that returns an lldb enumeration value (lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid) that represents the byte order for this target.''')
-        
+
         __swig_getmethods__["addr_size"] = GetAddressByteSize
         if _newclass: addr_size = property(GetAddressByteSize, None, doc='''A read only property that returns the size in bytes of an address for this target.''')
-        
+
         __swig_getmethods__["triple"] = GetTriple
         if _newclass: triple = property(GetTriple, None, doc='''A read only property that returns the target triple (arch-vendor-os) for this target as a string.''')
 
Index: include/lldb/API/SBTarget.h
===================================================================
--- include/lldb/API/SBTarget.h
+++ include/lldb/API/SBTarget.h
@@ -165,6 +165,7 @@
                          bool stop_at_entry, lldb::SBError &error);
 
   SBProcess LoadCore(const char *core_file);
+  SBProcess LoadCore(const char *core_file, lldb::SBError &error);
 
   //------------------------------------------------------------------
   /// Launch a new process with sensible defaults.
@@ -718,9 +719,9 @@
   // Finds all breakpoints by name, returning the list in bkpt_list.  Returns
   // false if the name is not a valid breakpoint name, true otherwise.
   bool FindBreakpointsByName(const char *name, SBBreakpointList &bkpt_list);
-  
+
   void GetBreakpointNames(SBStringList &names);
-  
+
   void DeleteBreakpointName(const char *name);
 
   bool EnableAllBreakpoints();
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to