1//===-- SWIG Interface for SBProcess ----------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9namespace lldb {
10
11%feature("docstring",
12"Represents the process associated with the target program.
13
14SBProcess supports thread iteration. For example (from test/lldbutil.py),
15
16# ==================================================
17# Utility functions related to Threads and Processes
18# ==================================================
19
20def get_stopped_threads(process, reason):
21    '''Returns the thread(s) with the specified stop reason in a list.
22
23    The list can be empty if no such thread exists.
24    '''
25    threads = []
26    for t in process:
27        if t.GetStopReason() == reason:
28            threads.append(t)
29    return threads
30
31...
32"
33) SBProcess;
34class SBProcess
35{
36public:
37    enum
38    {
39        eBroadcastBitStateChanged   = (1 << 0),
40        eBroadcastBitInterrupt      = (1 << 1),
41        eBroadcastBitSTDOUT         = (1 << 2),
42        eBroadcastBitSTDERR         = (1 << 3),
43        eBroadcastBitProfileData    = (1 << 4),
44        eBroadcastBitStructuredData = (1 << 5)
45    };
46
47    SBProcess ();
48
49    SBProcess (const lldb::SBProcess& rhs);
50
51    ~SBProcess();
52
53    static const char *
54    GetBroadcasterClassName ();
55
56    const char *
57    GetPluginName ();
58
59    const char *
60    GetShortPluginName ();
61
62    void
63    Clear ();
64
65    bool
66    IsValid() const;
67
68    explicit operator bool() const;
69
70    lldb::SBTarget
71    GetTarget() const;
72
73    lldb::ByteOrder
74    GetByteOrder() const;
75
76    %feature("autodoc", "
77    Writes data into the current process's stdin. API client specifies a Python
78    string as the only argument.") PutSTDIN;
79    size_t
80    PutSTDIN (const char *src, size_t src_len);
81
82    %feature("autodoc", "
83    Reads data from the current process's stdout stream. API client specifies
84    the size of the buffer to read data into. It returns the byte buffer in a
85    Python string.") GetSTDOUT;
86    size_t
87    GetSTDOUT (char *dst, size_t dst_len) const;
88
89    %feature("autodoc", "
90    Reads data from the current process's stderr stream. API client specifies
91    the size of the buffer to read data into. It returns the byte buffer in a
92    Python string.") GetSTDERR;
93    size_t
94    GetSTDERR (char *dst, size_t dst_len) const;
95
96    size_t
97    GetAsyncProfileData(char *dst, size_t dst_len) const;
98
99    void
100    ReportEventState (const lldb::SBEvent &event, SBFile out) const;
101
102    void
103    ReportEventState (const lldb::SBEvent &event, FileSP BORROWED) const;
104
105    void
106    AppendEventStateReport (const lldb::SBEvent &event, lldb::SBCommandReturnObject &result);
107
108    %feature("docstring", "
109    Remote connection related functions. These will fail if the
110    process is not in eStateConnected. They are intended for use
111    when connecting to an externally managed debugserver instance.") RemoteAttachToProcessWithID;
112    bool
113    RemoteAttachToProcessWithID (lldb::pid_t pid,
114                                 lldb::SBError& error);
115
116    %feature("docstring",
117    "See SBTarget.Launch for argument description and usage."
118    ) RemoteLaunch;
119    bool
120    RemoteLaunch (char const **argv,
121                  char const **envp,
122                  const char *stdin_path,
123                  const char *stdout_path,
124                  const char *stderr_path,
125                  const char *working_directory,
126                  uint32_t launch_flags,
127                  bool stop_at_entry,
128                  lldb::SBError& error);
129
130    //------------------------------------------------------------------
131    // Thread related functions
132    //------------------------------------------------------------------
133    uint32_t
134    GetNumThreads ();
135
136    %feature("autodoc", "
137    Returns the INDEX'th thread from the list of current threads.  The index
138    of a thread is only valid for the current stop.  For a persistent thread
139    identifier use either the thread ID or the IndexID.  See help on SBThread
140    for more details.") GetThreadAtIndex;
141    lldb::SBThread
142    GetThreadAtIndex (size_t index);
143
144    %feature("autodoc", "
145    Returns the thread with the given thread ID.") GetThreadByID;
146    lldb::SBThread
147    GetThreadByID (lldb::tid_t sb_thread_id);
148
149    %feature("autodoc", "
150    Returns the thread with the given thread IndexID.") GetThreadByIndexID;
151    lldb::SBThread
152    GetThreadByIndexID (uint32_t index_id);
153
154    %feature("autodoc", "
155    Returns the currently selected thread.") GetSelectedThread;
156    lldb::SBThread
157    GetSelectedThread () const;
158
159    %feature("autodoc", "
160    Lazily create a thread on demand through the current OperatingSystem plug-in, if the current OperatingSystem plug-in supports it.") CreateOSPluginThread;
161    lldb::SBThread
162    CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context);
163
164    bool
165    SetSelectedThread (const lldb::SBThread &thread);
166
167    bool
168    SetSelectedThreadByID (lldb::tid_t tid);
169
170    bool
171    SetSelectedThreadByIndexID (uint32_t index_id);
172
173    //------------------------------------------------------------------
174    // Queue related functions
175    //------------------------------------------------------------------
176    uint32_t
177    GetNumQueues ();
178
179    lldb::SBQueue
180    GetQueueAtIndex (uint32_t index);
181
182    //------------------------------------------------------------------
183    // Stepping related functions
184    //------------------------------------------------------------------
185
186    lldb::StateType
187    GetState ();
188
189    int
190    GetExitStatus ();
191
192    const char *
193    GetExitDescription ();
194
195    %feature("autodoc", "
196    Returns the process ID of the process.") GetProcessID;
197    lldb::pid_t
198    GetProcessID ();
199
200    %feature("autodoc", "
201    Returns an integer ID that is guaranteed to be unique across all process instances. This is not the process ID, just a unique integer for comparison and caching purposes.") GetUniqueID;
202    uint32_t
203    GetUniqueID();
204
205    uint32_t
206    GetAddressByteSize() const;
207
208    %feature("docstring", "
209    Kills the process and shuts down all threads that were spawned to
210    track and monitor process.") Destroy;
211    lldb::SBError
212    Destroy ();
213
214    lldb::SBError
215    Continue ();
216
217    lldb::SBError
218    Stop ();
219
220    %feature("docstring", "Same as Destroy(self).") Destroy;
221    lldb::SBError
222    Kill ();
223
224    lldb::SBError
225    Detach ();
226
227    %feature("docstring", "Sends the process a unix signal.") Signal;
228    lldb::SBError
229    Signal (int signal);
230
231    lldb::SBUnixSignals
232    GetUnixSignals();
233
234    %feature("docstring", "
235    Returns a stop id that will increase every time the process executes.  If
236    include_expression_stops is true, then stops caused by expression evaluation
237    will cause the returned value to increase, otherwise the counter returned will
238    only increase when execution is continued explicitly by the user.  Note, the value
239    will always increase, but may increase by more than one per stop.") GetStopID;
240    uint32_t
241    GetStopID(bool include_expression_stops = false);
242
243    void
244    SendAsyncInterrupt();
245
246    %feature("autodoc", "
247    Reads memory from the current process's address space and removes any
248    traps that may have been inserted into the memory. It returns the byte
249    buffer in a Python string. Example:
250
251    # Read 4 bytes from address 'addr' and assume error.Success() is True.
252    content = process.ReadMemory(addr, 4, error)
253    new_bytes = bytearray(content)") ReadMemory;
254    size_t
255    ReadMemory (addr_t addr, void *buf, size_t size, lldb::SBError &error);
256
257    %feature("autodoc", "
258    Writes memory to the current process's address space and maintains any
259    traps that might be present due to software breakpoints. Example:
260
261    # Create a Python string from the byte array.
262    new_value = str(bytes)
263    result = process.WriteMemory(addr, new_value, error)
264    if not error.Success() or result != len(bytes):
265        print('SBProcess.WriteMemory() failed!')") WriteMemory;
266    size_t
267    WriteMemory (addr_t addr, const void *buf, size_t size, lldb::SBError &error);
268
269    %feature("autodoc", "
270    Reads a NULL terminated C string from the current process's address space.
271    It returns a python string of the exact length, or truncates the string if
272    the maximum character limit is reached. Example:
273
274    # Read a C string of at most 256 bytes from address '0x1000'
275    error = lldb.SBError()
276    cstring = process.ReadCStringFromMemory(0x1000, 256, error)
277    if error.Success():
278        print('cstring: ', cstring)
279    else
280        print('error: ', error)") ReadCStringFromMemory;
281
282    size_t
283    ReadCStringFromMemory (addr_t addr, void *char_buf, size_t size, lldb::SBError &error);
284
285    %feature("autodoc", "
286    Reads an unsigned integer from memory given a byte size and an address.
287    Returns the unsigned integer that was read. Example:
288
289    # Read a 4 byte unsigned integer from address 0x1000
290    error = lldb.SBError()
291    uint = ReadUnsignedFromMemory(0x1000, 4, error)
292    if error.Success():
293        print('integer: %u' % uint)
294    else
295        print('error: ', error)") ReadUnsignedFromMemory;
296
297    uint64_t
298    ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &error);
299
300    %feature("autodoc", "
301    Reads a pointer from memory from an address and returns the value. Example:
302
303    # Read a pointer from address 0x1000
304    error = lldb.SBError()
305    ptr = ReadPointerFromMemory(0x1000, error)
306    if error.Success():
307        print('pointer: 0x%x' % ptr)
308    else
309        print('error: ', error)") ReadPointerFromMemory;
310
311    lldb::addr_t
312    ReadPointerFromMemory (addr_t addr, lldb::SBError &error);
313
314
315    // Events
316    static lldb::StateType
317    GetStateFromEvent (const lldb::SBEvent &event);
318
319    static bool
320    GetRestartedFromEvent (const lldb::SBEvent &event);
321
322    static size_t
323    GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event);
324
325    static const char *
326    GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx);
327
328    static lldb::SBProcess
329    GetProcessFromEvent (const lldb::SBEvent &event);
330
331    static bool
332    GetInterruptedFromEvent (const lldb::SBEvent &event);
333
334    static lldb::SBStructuredData
335    GetStructuredDataFromEvent (const lldb::SBEvent &event);
336
337    static bool
338    EventIsProcessEvent (const lldb::SBEvent &event);
339
340    static bool
341    EventIsStructuredDataEvent (const lldb::SBEvent &event);
342
343    lldb::SBBroadcaster
344    GetBroadcaster () const;
345
346    bool
347    GetDescription (lldb::SBStream &description);
348
349    uint32_t
350    GetNumSupportedHardwareWatchpoints (lldb::SBError &error) const;
351
352    uint32_t
353    LoadImage (lldb::SBFileSpec &image_spec, lldb::SBError &error);
354
355    %feature("autodoc", "
356    Load the library whose filename is given by image_spec looking in all the
357    paths supplied in the paths argument.  If successful, return a token that
358    can be passed to UnloadImage and fill loaded_path with the path that was
359    successfully loaded.  On failure, return
360    lldb.LLDB_INVALID_IMAGE_TOKEN.") LoadImageUsingPaths;
361    uint32_t
362    LoadImageUsingPaths(const lldb::SBFileSpec &image_spec,
363                        SBStringList &paths,
364                        lldb::SBFileSpec &loaded_path,
365                        SBError &error);
366
367    lldb::SBError
368    UnloadImage (uint32_t image_token);
369
370    lldb::SBError
371    SendEventData (const char *event_data);
372
373    %feature("autodoc", "
374    Return the number of different thread-origin extended backtraces
375    this process can support as a uint32_t.
376    When the process is stopped and you have an SBThread, lldb may be
377    able to show a backtrace of when that thread was originally created,
378    or the work item was enqueued to it (in the case of a libdispatch
379    queue).") GetNumExtendedBacktraceTypes;
380
381    uint32_t
382    GetNumExtendedBacktraceTypes ();
383
384    %feature("autodoc", "
385    Takes an index argument, returns the name of one of the thread-origin
386    extended backtrace methods as a str.") GetExtendedBacktraceTypeAtIndex;
387
388    const char *
389    GetExtendedBacktraceTypeAtIndex (uint32_t idx);
390
391    lldb::SBThreadCollection
392    GetHistoryThreads (addr_t addr);
393
394    bool
395    IsInstrumentationRuntimePresent(lldb::InstrumentationRuntimeType type);
396
397    lldb::SBError
398    SaveCore(const char *file_name);
399
400    lldb::SBTrace
401    StartTrace(SBTraceOptions &options, lldb::SBError &error);
402
403    lldb::SBError
404    GetMemoryRegionInfo(lldb::addr_t load_addr, lldb::SBMemoryRegionInfo &region_info);
405
406    lldb::SBMemoryRegionInfoList
407    GetMemoryRegions();
408
409    %feature("autodoc", "
410    Get information about the process.
411    Valid process info will only be returned when the process is alive,
412    use IsValid() to check if the info returned is valid.
413
414    process_info = process.GetProcessInfo()
415    if process_info.IsValid():
416        process_info.GetProcessID()") GetProcessInfo;
417    lldb::SBProcessInfo
418    GetProcessInfo();
419
420    STRING_EXTENSION(SBProcess)
421
422#ifdef SWIGPYTHON
423    %pythoncode %{
424        def __get_is_alive__(self):
425            '''Returns "True" if the process is currently alive, "False" otherwise'''
426            s = self.GetState()
427            if (s == eStateAttaching or
428                s == eStateLaunching or
429                s == eStateStopped or
430                s == eStateRunning or
431                s == eStateStepping or
432                s == eStateCrashed or
433                s == eStateSuspended):
434                return True
435            return False
436
437        def __get_is_running__(self):
438            '''Returns "True" if the process is currently running, "False" otherwise'''
439            state = self.GetState()
440            if state == eStateRunning or state == eStateStepping:
441                return True
442            return False
443
444        def __get_is_stopped__(self):
445            '''Returns "True" if the process is currently stopped, "False" otherwise'''
446            state = self.GetState()
447            if state == eStateStopped or state == eStateCrashed or state == eStateSuspended:
448                return True
449            return False
450
451        class threads_access(object):
452            '''A helper object that will lazily hand out thread for a process when supplied an index.'''
453            def __init__(self, sbprocess):
454                self.sbprocess = sbprocess
455
456            def __len__(self):
457                if self.sbprocess:
458                    return int(self.sbprocess.GetNumThreads())
459                return 0
460
461            def __getitem__(self, key):
462                if type(key) is int and key < len(self):
463                    return self.sbprocess.GetThreadAtIndex(key)
464                return None
465
466        def get_threads_access_object(self):
467            '''An accessor function that returns a modules_access() object which allows lazy thread access from a lldb.SBProcess object.'''
468            return self.threads_access (self)
469
470        def get_process_thread_list(self):
471            '''An accessor function that returns a list() that contains all threads in a lldb.SBProcess object.'''
472            threads = []
473            accessor = self.get_threads_access_object()
474            for idx in range(len(accessor)):
475                threads.append(accessor[idx])
476            return threads
477
478        def __iter__(self):
479            '''Iterate over all threads in a lldb.SBProcess object.'''
480            return lldb_iter(self, 'GetNumThreads', 'GetThreadAtIndex')
481
482        def __len__(self):
483            '''Return the number of threads in a lldb.SBProcess object.'''
484            return self.GetNumThreads()
485
486
487        threads = property(get_process_thread_list, None, doc='''A read only property that returns a list() of lldb.SBThread objects for this process.''')
488        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]).''')
489        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.''')
490        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.''')
491        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.''')
492        id = property(GetProcessID, None, doc='''A read only property that returns the process ID as an integer.''')
493        target = property(GetTarget, None, doc='''A read only property that an lldb object that represents the target (lldb.SBTarget) that owns this process.''')
494        num_threads = property(GetNumThreads, None, doc='''A read only property that returns the number of threads in this process as an integer.''')
495        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.''')
496        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.).''')
497        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.''')
498        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.''')
499        broadcaster = property(GetBroadcaster, None, doc='''A read only property that an lldb object that represents the broadcaster (lldb.SBBroadcaster) for this process.''')
500    %}
501#endif
502
503};
504
505}  // namespace lldb
506