//===-- SWIG Interface for SBDebugger ---------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// namespace lldb { %feature("docstring", "SBDebugger is the primordial object that creates SBTargets and provides access to them. It also manages the overall debugging experiences. For example (from example/disasm.py), import lldb import os import sys def disassemble_instructions (insts): for i in insts: print i ... # Create a new debugger instance debugger = lldb.SBDebugger.Create() # When we step or continue, don't return from the function until the process # stops. We do this by setting the async mode to false. debugger.SetAsync (False) # Create a target from a file and arch print('Creating a target for \'%s\'' % exe) target = debugger.CreateTargetWithFileAndArch (exe, lldb.LLDB_ARCH_DEFAULT) if target: # If the target is valid set a breakpoint at main main_bp = target.BreakpointCreateByName (fname, target.GetExecutable().GetFilename()); print main_bp # Launch the process. Since we specified synchronous mode, we won't return # from this function until we hit the breakpoint at main process = target.LaunchSimple (None, None, os.getcwd()) # Make sure the launch went ok if process: # Print some simple process info state = process.GetState () print process if state == lldb.eStateStopped: # Get the first thread thread = process.GetThreadAtIndex (0) if thread: # Print some simple thread info print thread # Get the first frame frame = thread.GetFrameAtIndex (0) if frame: # Print some simple frame info print frame function = frame.GetFunction() # See if we have debug info (a function) if function: # We do have a function, print some info for the function print function # Now get all instructions for this function and print them insts = function.GetInstructions(target) disassemble_instructions (insts) else: # See if we have a symbol in the symbol table for where we stopped symbol = frame.GetSymbol(); if symbol: # We do have a symbol, print some info for the symbol print symbol # Now get all instructions for this symbol and print them insts = symbol.GetInstructions(target) disassemble_instructions (insts) registerList = frame.GetRegisters() print('Frame registers (size of register set = %d):' % registerList.GetSize()) for value in registerList: #print value print('%s (number of children = %d):' % (value.GetName(), value.GetNumChildren())) for child in value: print('Name: ', child.GetName(), ' Value: ', child.GetValue()) print('Hit the breakpoint at main, enter to continue and wait for program to exit or \'Ctrl-D\'/\'quit\' to terminate the program') next = sys.stdin.readline() if not next or next.rstrip('\n') == 'quit': print('Terminating the inferior process...') process.Kill() else: # Now continue to the program exit process.Continue() # When we return from the above function we will hopefully be at the # program exit. Print out some process info print process elif state == lldb.eStateExited: print('Didn\'t hit the breakpoint at main, program has exited...') else: print('Unexpected process state: %s, killing process...' % debugger.StateAsCString (state)) process.Kill() Sometimes you need to create an empty target that will get filled in later. The most common use for this is to attach to a process by name or pid where you don't know the executable up front. The most convenient way to do this is: target = debugger.CreateTarget('') error = lldb.SBError() process = target.AttachToProcessWithName(debugger.GetListener(), 'PROCESS_NAME', False, error) or the equivalent arguments for AttachToProcessWithID.") SBDebugger; class SBDebugger { public: static void Initialize(); static SBError InitializeWithErrorHandling(); static void Terminate(); static lldb::SBDebugger Create(); static lldb::SBDebugger Create(bool source_init_files); static lldb::SBDebugger Create(bool source_init_files, lldb::LogOutputCallback log_callback, void *baton); static void Destroy (lldb::SBDebugger &debugger); static void MemoryPressureDetected(); SBDebugger(); SBDebugger(const lldb::SBDebugger &rhs); ~SBDebugger(); bool IsValid() const; explicit operator bool() const; void Clear (); void SetAsync (bool b); bool GetAsync (); void SkipLLDBInitFiles (bool b); #ifdef SWIGPYTHON %pythoncode %{ def SetOutputFileHandle(self, file, transfer_ownership): "DEPRECATED, use SetOutputFile" if file is None: import sys file = sys.stdout self.SetOutputFile(SBFile.Create(file, borrow=True)) def SetInputFileHandle(self, file, transfer_ownership): "DEPRECATED, use SetInputFile" if file is None: import sys file = sys.stdin self.SetInputFile(SBFile.Create(file, borrow=True)) def SetErrorFileHandle(self, file, transfer_ownership): "DEPRECATED, use SetErrorFile" if file is None: import sys file = sys.stderr self.SetErrorFile(SBFile.Create(file, borrow=True)) %} #endif %extend { lldb::FileSP GetInputFileHandle() { return self->GetInputFile().GetFile(); } lldb::FileSP GetOutputFileHandle() { return self->GetOutputFile().GetFile(); } lldb::FileSP GetErrorFileHandle() { return self->GetErrorFile().GetFile(); } } SBError SetInputFile (SBFile file); SBError SetOutputFile (SBFile file); SBError SetErrorFile (SBFile file); SBError SetInputFile (FileSP file); SBError SetOutputFile (FileSP file); SBError SetErrorFile (FileSP file); SBFile GetInputFile (); SBFile GetOutputFile (); SBFile GetErrorFile (); lldb::SBCommandInterpreter GetCommandInterpreter (); void HandleCommand (const char *command); lldb::SBListener GetListener (); void HandleProcessEvent (const lldb::SBProcess &process, const lldb::SBEvent &event, SBFile out, SBFile err); void HandleProcessEvent (const lldb::SBProcess &process, const lldb::SBEvent &event, FileSP BORROWED, FileSP BORROWED); lldb::SBTarget CreateTarget (const char *filename, const char *target_triple, const char *platform_name, bool add_dependent_modules, lldb::SBError& sb_error); lldb::SBTarget CreateTargetWithFileAndTargetTriple (const char *filename, const char *target_triple); lldb::SBTarget CreateTargetWithFileAndArch (const char *filename, const char *archname); lldb::SBTarget CreateTarget (const char *filename); %feature("docstring", "The dummy target holds breakpoints and breakpoint names that will prime newly created targets." ) GetDummyTarget; lldb::SBTarget GetDummyTarget(); %feature("docstring", "Return true if target is deleted from the target list of the debugger." ) DeleteTarget; bool DeleteTarget (lldb::SBTarget &target); lldb::SBTarget GetTargetAtIndex (uint32_t idx); uint32_t GetIndexOfTarget (lldb::SBTarget target); lldb::SBTarget FindTargetWithProcessID (pid_t pid); lldb::SBTarget FindTargetWithFileAndArch (const char *filename, const char *arch); uint32_t GetNumTargets (); lldb::SBTarget GetSelectedTarget (); void SetSelectedTarget (lldb::SBTarget &target); lldb::SBPlatform GetSelectedPlatform(); void SetSelectedPlatform(lldb::SBPlatform &platform); %feature("docstring", "Get the number of currently active platforms." ) GetNumPlatforms; uint32_t GetNumPlatforms (); %feature("docstring", "Get one of the currently active platforms." ) GetPlatformAtIndex; lldb::SBPlatform GetPlatformAtIndex (uint32_t idx); %feature("docstring", "Get the number of available platforms." ) GetNumAvailablePlatforms; uint32_t GetNumAvailablePlatforms (); %feature("docstring", " Get the name and description of one of the available platforms. @param idx Zero-based index of the platform for which info should be retrieved, must be less than the value returned by GetNumAvailablePlatforms().") GetAvailablePlatformInfoAtIndex; lldb::SBStructuredData GetAvailablePlatformInfoAtIndex (uint32_t idx); lldb::SBSourceManager GetSourceManager (); // REMOVE: just for a quick fix, need to expose platforms through // SBPlatform from this class. lldb::SBError SetCurrentPlatform (const char *platform_name); bool SetCurrentPlatformSDKRoot (const char *sysroot); // FIXME: Once we get the set show stuff in place, the driver won't need // an interface to the Set/Get UseExternalEditor. bool SetUseExternalEditor (bool input); bool GetUseExternalEditor (); bool SetUseColor (bool use_color); bool GetUseColor () const; static bool GetDefaultArchitecture (char *arch_name, size_t arch_name_len); static bool SetDefaultArchitecture (const char *arch_name); lldb::ScriptLanguage GetScriptingLanguage (const char *script_language_name); static const char * GetVersionString (); static const char * StateAsCString (lldb::StateType state); static SBStructuredData GetBuildConfiguration(); static bool StateIsRunningState (lldb::StateType state); static bool StateIsStoppedState (lldb::StateType state); bool EnableLog (const char *channel, const char ** types); void SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton); void DispatchInput (const void *data, size_t data_len); void DispatchInputInterrupt (); void DispatchInputEndOfFile (); const char * GetInstanceName (); static SBDebugger FindDebuggerWithID (int id); static lldb::SBError SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name); static lldb::SBStringList GetInternalVariableValue (const char *var_name, const char *debugger_instance_name); bool GetDescription (lldb::SBStream &description); uint32_t GetTerminalWidth () const; void SetTerminalWidth (uint32_t term_width); lldb::user_id_t GetID (); const char * GetPrompt() const; void SetPrompt (const char *prompt); const char * GetReproducerPath() const; lldb::ScriptLanguage GetScriptLanguage() const; void SetScriptLanguage (lldb::ScriptLanguage script_lang); bool GetCloseInputOnEOF () const; void SetCloseInputOnEOF (bool b); lldb::SBTypeCategory GetCategory (const char* category_name); SBTypeCategory GetCategory (lldb::LanguageType lang_type); lldb::SBTypeCategory CreateCategory (const char* category_name); bool DeleteCategory (const char* category_name); uint32_t GetNumCategories (); lldb::SBTypeCategory GetCategoryAtIndex (uint32_t); lldb::SBTypeCategory GetDefaultCategory(); lldb::SBTypeFormat GetFormatForType (lldb::SBTypeNameSpecifier); lldb::SBTypeSummary GetSummaryForType (lldb::SBTypeNameSpecifier); lldb::SBTypeFilter GetFilterForType (lldb::SBTypeNameSpecifier); lldb::SBTypeSynthetic GetSyntheticForType (lldb::SBTypeNameSpecifier); STRING_EXTENSION(SBDebugger) %feature("docstring", "Launch a command interpreter session. Commands are read from standard input or from the input handle specified for the debugger object. Output/errors are similarly redirected to standard output/error or the configured handles. @param[in] auto_handle_events If true, automatically handle resulting events. @param[in] spawn_thread If true, start a new thread for IO handling. @param[in] options Parameter collection of type SBCommandInterpreterRunOptions. @param[in] num_errors Initial error counter. @param[in] quit_requested Initial quit request flag. @param[in] stopped_for_crash Initial crash flag. @return A tuple with the number of errors encountered by the interpreter, a boolean indicating whether quitting the interpreter was requested and another boolean set to True in case of a crash. Example: # Start an interactive lldb session from a script (with a valid debugger object # created beforehand): n_errors, quit_requested, has_crashed = debugger.RunCommandInterpreter(True, False, lldb.SBCommandInterpreterRunOptions(), 0, False, False)") RunCommandInterpreter; %apply int& INOUT { int& num_errors }; %apply bool& INOUT { bool& quit_requested }; %apply bool& INOUT { bool& stopped_for_crash }; void RunCommandInterpreter (bool auto_handle_events, bool spawn_thread, SBCommandInterpreterRunOptions &options, int &num_errors, bool &quit_requested, bool &stopped_for_crash); lldb::SBError RunREPL (lldb::LanguageType language, const char *repl_options); #ifdef SWIGPYTHON %pythoncode%{ def __iter__(self): '''Iterate over all targets in a lldb.SBDebugger object.''' return lldb_iter(self, 'GetNumTargets', 'GetTargetAtIndex') def __len__(self): '''Return the number of targets in a lldb.SBDebugger object.''' return self.GetNumTargets() %} #endif }; // class SBDebugger } // namespace lldb