[Lldb-commits] [lldb] r334439 - Add a new SBTarget::LoadCore() overload which surfaces errors if the load fails
Leonard Mosescu via lldb-commits
lldb-commits at lists.llvm.org
Mon Jun 11 14:19:27 PDT 2018
Author: lemo
Date: Mon Jun 11 14:19:26 2018
New Revision: 334439
URL: http://llvm.org/viewvc/llvm-project?rev=334439&view=rev
Log:
Add a new SBTarget::LoadCore() overload which surfaces errors if the load fails
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);
Differential Revision: https://reviews.llvm.org/D48049
Modified:
lldb/trunk/include/lldb/API/SBTarget.h
lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py
lldb/trunk/scripts/interface/SBTarget.i
lldb/trunk/source/API/SBTarget.cpp
Modified: lldb/trunk/include/lldb/API/SBTarget.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBTarget.h?rev=334439&r1=334438&r2=334439&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBTarget.h (original)
+++ lldb/trunk/include/lldb/API/SBTarget.h Mon Jun 11 14:19:26 2018
@@ -165,6 +165,7 @@ public:
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 @@ public:
// 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();
Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py?rev=334439&r1=334438&r2=334439&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py Mon Jun 11 14:19:26 2018
@@ -59,6 +59,24 @@ class MiniDumpNewTestCase(TestBase):
self.dbg.SetOutputFileHandle(None, False)
self.dbg.SetErrorFileHandle(None, False)
+ def test_loadcore_error_status(self):
+ """Test the SBTarget.LoadCore(core, error) overload."""
+ self.dbg.CreateTarget(None)
+ self.target = self.dbg.GetSelectedTarget()
+ error = lldb.SBError()
+ self.process = self.target.LoadCore("linux-x86_64.dmp", error)
+ self.assertTrue(self.process, PROCESS_IS_VALID)
+ self.assertTrue(error.Success())
+
+ def test_loadcore_error_status_failure(self):
+ """Test the SBTarget.LoadCore(core, error) overload."""
+ self.dbg.CreateTarget(None)
+ self.target = self.dbg.GetSelectedTarget()
+ error = lldb.SBError()
+ self.process = self.target.LoadCore("non-existent.dmp", error)
+ self.assertFalse(self.process, PROCESS_IS_VALID)
+ self.assertTrue(error.Fail())
+
def test_process_info_in_minidump(self):
"""Test that lldb can read the process information from the Minidump."""
# target create -c linux-x86_64.dmp
Modified: lldb/trunk/scripts/interface/SBTarget.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/interface/SBTarget.i?rev=334439&r1=334438&r2=334439&view=diff
==============================================================================
--- lldb/trunk/scripts/interface/SBTarget.i (original)
+++ lldb/trunk/scripts/interface/SBTarget.i Mon Jun 11 14:19:26 2018
@@ -77,7 +77,7 @@ public:
static const char *
GetBroadcasterClassName ();
-
+
bool
IsValid() const;
@@ -145,7 +145,7 @@ public:
/// 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 @@ public:
/// 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 @@ public:
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 @@ public:
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 @@ public:
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 @@ public:
/// @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.
//------------------------------------------------------------------
@@ -276,10 +280,12 @@ public:
") LoadCore;
lldb::SBProcess
LoadCore(const char *core_file);
-
+
lldb::SBProcess
- Attach (lldb::SBAttachInfo &attach_info, lldb::SBError& error);
-
+ LoadCore(const char *core_file, lldb::SBError &error);
+
+ lldb::SBProcess
+ Attach(lldb::SBAttachInfo &attach_info, lldb::SBError& error);
%feature("docstring", "
//------------------------------------------------------------------
@@ -363,7 +369,7 @@ public:
const char *url,
const char *plugin_name,
SBError& error);
-
+
lldb::SBFileSpec
GetExecutable ();
@@ -401,10 +407,10 @@ public:
lldb::ByteOrder
GetByteOrder ();
-
+
uint32_t
GetAddressByteSize();
-
+
const char *
GetTriple ();
@@ -457,21 +463,21 @@ public:
/// 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 @@ public:
//------------------------------------------------------------------
") FindGlobalVariables;
lldb::SBValueList
- FindGlobalVariables (const char *name,
+ FindGlobalVariables (const char *name,
uint32_t max_matches);
%feature("docstring", "
@@ -515,7 +521,7 @@ public:
lldb::SBValue
FindFirstGlobalVariable (const char* name);
-
+
lldb::SBValueList
FindGlobalVariables(const char *name,
uint32_t max_matches,
@@ -544,26 +550,26 @@ public:
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,7 +595,7 @@ public:
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
@@ -598,14 +604,14 @@ public:
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 @@ public:
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 @@ public:
lldb::SBBreakpoint
FindBreakpointByID (break_id_t break_id);
-
+
bool FindBreakpointsByName(const char *name, SBBreakpointList &bkpt_list);
void DeleteBreakpointName(const char *name);
@@ -726,12 +732,12 @@ public:
%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.
///
@@ -740,12 +746,12 @@ public:
//------------------------------------------------------------------
") 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
@@ -754,7 +760,7 @@ public:
/// @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 @@ public:
") BreakpointsCreateFromFile;
lldb::SBError
BreakpointsWriteToFile(SBFileSpec &dest_file);
-
+
%feature("docstring", "
//------------------------------------------------------------------
/// Write breakpoints listed in bkpt_list to dest_file.
@@ -800,42 +806,42 @@ public:
//------------------------------------------------------------------
") 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 @@ public:
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 @@ public:
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 @@ public:
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 @@ public:
'''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 @@ public:
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 @@ public:
__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.''')
Modified: lldb/trunk/source/API/SBTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTarget.cpp?rev=334439&r1=334438&r2=334439&view=diff
==============================================================================
--- lldb/trunk/source/API/SBTarget.cpp (original)
+++ lldb/trunk/source/API/SBTarget.cpp Mon Jun 11 14:19:26 2018
@@ -203,6 +203,11 @@ SBStructuredData SBTarget::GetStatistics
}
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) {
@@ -210,9 +215,14 @@ SBProcess SBTarget::LoadCore(const char
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;
}
More information about the lldb-commits
mailing list