| # Embedded Python Interpreter | |
| The embedded python interpreter can be accessed in a variety of ways from | |
| within LLDB. The easiest way is to use the lldb command script with no | |
| arguments at the lldb command prompt: | |
| ```python3 | |
| (lldb) script | |
| Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D. | |
| >>> 2+3 | |
| 5 | |
| >>> hex(12345) | |
| '0x3039' | |
| >>> | |
| ``` | |
| This drops you into the embedded python interpreter. When running under the | |
| script command, lldb sets some convenience variables that give you quick access | |
| to the currently selected entities that characterize the program and debugger | |
| state. In each case, if there is no currently selected entity of the | |
| appropriate type, the variable's IsValid method will return false. These | |
| variables are: | |
| | Variable | Type | Equivalent | Description | | |
| |----------|------|------------|-------------| | |
| | `lldb.debugger` | `lldb.SBDebugger` | `SBTarget.GetDebugger` | Contains the debugger object whose `script` command was invoked. The `lldb.SBDebugger` object owns the command interpreter and all the targets in your debug session. There will always be a Debugger in the embedded interpreter. | | |
| | `lldb.target` | `lldb.SBTarget` | `SBDebugger.GetSelectedTarget` `SBProcess.GetTarget` | Contains the currently selected target - for instance the one made with the `file` or selected by the `target select <target-index>` command. The `lldb.SBTarget` manages one running process, and all the executable and debug files for the process. | | |
| | `lldb.process` | `lldb.SBProcess` | `SBTarget.GetProcess` `SBThread.GetProcess` | Contains the process of the currently selected target. The `lldb.SBProcess` object manages the threads and allows access to memory for the process. | | |
| | `lldb.thread` | `lldb.SBThread` | `SBProcess.GetSelectedThread` `SBFrame.GetThread` | Contains the currently selected thread. The `lldb.SBThread` object manages the stack frames in that thread. A thread is always selected in the command interpreter when a target stops. The `thread select <thread-index>` command can be used to change the currently selected thread. So as long as you have a stopped process, there will be some selected thread. | | |
| | `lldb.frame` | `lldb.SBFrame` | `SBThread.GetSelectedFrame` | Contains the currently selected stack frame. The `lldb.SBFrame` object manage the stack locals and the register set for that stack. A stack frame is always selected in the command interpreter when a target stops. The `frame select <frame-index>` command can be used to change the currently selected frame. So as long as you have a stopped process, there will be some selected frame. | | |
| While extremely convenient, these variables have a couple caveats that you | |
| should be aware of. First of all, they hold the values of the selected objects | |
| on entry to the embedded interpreter. They do not update as you use the LLDB | |
| API's to change, for example, the currently selected stack frame or thread. | |
| Moreover, they are only defined and meaningful while in the interactive Python | |
| interpreter. There is no guarantee on their value in any other situation, hence | |
| you should not use them when defining Python formatters, breakpoint scripts and | |
| commands (or any other Python extension point that LLDB provides). For the | |
| latter you'll be passed an `SBDebugger`, `SBTarget`, `SBProcess`, `SBThread` or | |
| `SBFrame` instance and you can use the functions from the "Equivalent" column | |
| to navigate between them. | |
| As a rationale for such behavior, consider that lldb can run in a multithreaded | |
| environment, and another thread might call the "script" command, changing the | |
| value out from under you. | |
| To get started with these objects and LLDB scripting, please note that almost | |
| all of the lldb Python objects are able to briefly describe themselves when you | |
| pass them to the Python print function: | |
| ```python3 | |
| (lldb) script | |
| Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D. | |
| >>> print(lldb.debugger) | |
| Debugger (instance: "debugger_1", id: 1) | |
| >>> print(lldb.target) | |
| a.out | |
| >>> print(lldb.process) | |
| SBProcess: pid = 58842, state = stopped, threads = 1, executable = a.out | |
| >>> print(lldb.thread) | |
| thread #1: tid = 0x2265ce3, 0x0000000100000334 a.out`main at t.c:2:3, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 | |
| >>> print(lldb.frame) | |
| frame #0: 0x0000000100000334 a.out`main at t.c:2:3 | |
| ``` |