100 lines
5.5 KiB
OpenEdge ABL
100 lines
5.5 KiB
OpenEdge ABL
STRING_EXTENSION_OUTSIDE(SBProcess)
|
|
%extend lldb::SBProcess {
|
|
#ifdef SWIGPYTHON
|
|
%pythoncode %{
|
|
def WriteMemoryAsCString(self, addr, str, error):
|
|
'''
|
|
WriteMemoryAsCString(self, addr, str, error):
|
|
This functions the same as `WriteMemory` except a null-terminator is appended
|
|
to the end of the buffer if it is not there already.
|
|
'''
|
|
if not str or len(str) == 0:
|
|
return 0
|
|
if not str[-1] == '\0':
|
|
str += '\0'
|
|
return self.WriteMemory(addr, str, error)
|
|
|
|
def __get_is_alive__(self):
|
|
'''Returns "True" if the process is currently alive, "False" otherwise'''
|
|
s = self.GetState()
|
|
if (s == eStateAttaching or
|
|
s == eStateLaunching or
|
|
s == eStateStopped or
|
|
s == eStateRunning or
|
|
s == eStateStepping or
|
|
s == eStateCrashed or
|
|
s == eStateSuspended):
|
|
return True
|
|
return False
|
|
|
|
def __get_is_running__(self):
|
|
'''Returns "True" if the process is currently running, "False" otherwise'''
|
|
state = self.GetState()
|
|
if state == eStateRunning or state == eStateStepping:
|
|
return True
|
|
return False
|
|
|
|
def __get_is_stopped__(self):
|
|
'''Returns "True" if the process is currently stopped, "False" otherwise'''
|
|
state = self.GetState()
|
|
if state == eStateStopped or state == eStateCrashed or state == eStateSuspended:
|
|
return True
|
|
return False
|
|
|
|
class threads_access(object):
|
|
'''A helper object that will lazily hand out thread for a process when supplied an index.'''
|
|
def __init__(self, sbprocess):
|
|
self.sbprocess = sbprocess
|
|
|
|
def __len__(self):
|
|
if self.sbprocess:
|
|
return int(self.sbprocess.GetNumThreads())
|
|
return 0
|
|
|
|
def __getitem__(self, key):
|
|
if isinstance(key, int):
|
|
count = len(self)
|
|
if -count <= key < count:
|
|
key %= count
|
|
return self.sbprocess.GetThreadAtIndex(key)
|
|
return None
|
|
|
|
def get_threads_access_object(self):
|
|
'''An accessor function that returns a modules_access() object which allows lazy thread access from a lldb.SBProcess object.'''
|
|
return self.threads_access (self)
|
|
|
|
def get_process_thread_list(self):
|
|
'''An accessor function that returns a list() that contains all threads in a lldb.SBProcess object.'''
|
|
threads = []
|
|
accessor = self.get_threads_access_object()
|
|
for idx in range(len(accessor)):
|
|
threads.append(accessor[idx])
|
|
return threads
|
|
|
|
def __iter__(self):
|
|
'''Iterate over all threads in a lldb.SBProcess object.'''
|
|
return lldb_iter(self, 'GetNumThreads', 'GetThreadAtIndex')
|
|
|
|
def __len__(self):
|
|
'''Return the number of threads in a lldb.SBProcess object.'''
|
|
return self.GetNumThreads()
|
|
|
|
def __int__(self):
|
|
return self.GetProcessID()
|
|
|
|
threads = property(get_process_thread_list, None, doc='''A read only property that returns a list() of lldb.SBThread objects for this process.''')
|
|
thread = property(get_threads_access_object, None, doc='''A read only property that returns an object that can access threads by thread index (thread = lldb.process.thread[12]).''')
|
|
is_alive = property(__get_is_alive__, None, doc='''A read only property that returns a boolean value that indicates if this process is currently alive.''')
|
|
is_running = property(__get_is_running__, None, doc='''A read only property that returns a boolean value that indicates if this process is currently running.''')
|
|
is_stopped = property(__get_is_stopped__, None, doc='''A read only property that returns a boolean value that indicates if this process is currently stopped.''')
|
|
id = property(GetProcessID, None, doc='''A read only property that returns the process ID as an integer.''')
|
|
target = property(GetTarget, None, doc='''A read only property that an lldb object that represents the target (lldb.SBTarget) that owns this process.''')
|
|
num_threads = property(GetNumThreads, None, doc='''A read only property that returns the number of threads in this process as an integer.''')
|
|
selected_thread = property(GetSelectedThread, SetSelectedThread, doc='''A read/write property that gets/sets the currently selected thread in this process. The getter returns a lldb.SBThread object and the setter takes an lldb.SBThread object.''')
|
|
state = property(GetState, None, doc='''A read only property that returns an lldb enumeration value (see enumerations that start with "lldb.eState") that represents the current state of this process (running, stopped, exited, etc.).''')
|
|
exit_state = property(GetExitStatus, None, doc='''A read only property that returns an exit status as an integer of this process when the process state is lldb.eStateExited.''')
|
|
exit_description = property(GetExitDescription, None, doc='''A read only property that returns an exit description as a string of this process when the process state is lldb.eStateExited.''')
|
|
broadcaster = property(GetBroadcaster, None, doc='''A read only property that an lldb object that represents the broadcaster (lldb.SBBroadcaster) for this process.''')
|
|
%}
|
|
#endif
|
|
}
|