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 9 namespace lldb { 10 11 %feature("docstring", 12 "Represents the process associated with the target program. 13 14 SBProcess supports thread iteration. For example (from test/lldbutil.py), 15 16 # ================================================== 17 # Utility functions related to Threads and Processes 18 # ================================================== 19 20 def 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; 34 class SBProcess 35 { 36 public: 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 ®ion_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