==============
About dpu-lldb
==============
`LLDB `_ `is a next generation, high-performance debugger. It is built as a set of reusable components which highly leverage existing libraries in the larger LLVM Project, such as the Clang expression parser and LLVM disassembler.`
For GDB users, here is a document to easily find the corresponding LLDB command from a GDB one: `GDB to LLDB command map `_
As seen in the :doc:`PROGRAMMING section<03_ProgrammingWithUpmemDpu>`, ``dpu-lldb`` can be used to execute DPU binaries.
To be able to debug with as much information as possible, debug symbols are enabled by default in ``dpu-upmem-dpurte-clang``. Make sure not to disabled them when debugging (using ``-g0`` by example).
Also, note that debugging a program compiled in high optimization level can sometimes be tricky because:
* Some variables may not be available because of the compiler optimizations
* Stepping through the code can feel random because the compiler has reorganized the code for better efficiency.
For VSCode users, we distribute the ``lldb-vscode`` binary. It is a wrapper around lldb that implements the Visual Studio Code Debug Adapter Protocol.
``dpu-lldb-vscode`` and ``dpu-lldb-attach-dpu-vscode`` are also provided to debug DPU programs.
dpu-lldb supported commands
===========================
Here is a non-exhaustive list of lldb commands supported for a DPU program:
* ``process launch``: Start a DPU program
* ``process continue``: Resume a DPU program
* ``process interrupt``: Stop a DPU program
* ``thread list``: List all the threads of a DPU and where each thread is at
* ``thread select``: Select a thread as the currently active thread
* ``thread step-in``: Source level single step in current thread
* ``thread step-over``: Source level single step in current thread, stepping over calls
* ``thread step-inst``: Single step one instruction in current thread
* ``thread step-inst-over``: Single step one instruction in current thread, stepping over calls
* ``thread step-out``: Finish executing the function of the currently selected frame and return to its call site
* ``thread until``: Run the current or specified thread until it reaches a given line number or address or leaves the current function
* ``thread backtrace``: Show the stack of the current thread
* ``frame select``: Select a frame by index from within the current thread and make it the current frame
* ``frame info``: List information about the currently selected frame in the current thread
* ``frame select --relative=`` or ``up ``: Go up "n" frames in the stack (1 frame by default)
* ``frame select --relative=-`` or ``down ``: Go down "n" frames in the stack (1 frame by default)
* ``frame variable``: Show frame variables
* ``target variable``: Read global variables for the DPU program
* ``breakpoint set|list|delete``: Manage breakpoint in the DPU program
* ``register read``: Dump the contents of one or more register values from the current frame
* ``register write``: Modify a single register value
* ``memory read``: Read from the memory of the DPU program
* ``memory write``: Write to the memory of the DPU program
* ``disassemble``: Disassemble specified instructions of the DPU program
Note that for every command, a help is available in ``dpu-lldb`` by running your command preceding by ``help``, for example:
``help process launch``
Memory mapping
==============
All the memories of the DPU are mapped in a single address space for ``dpu-lldb``:
* WRAM: ``0x00000000`` - ``0x00010000``
* MRAM: ``0x08000000`` - ``0x0c000000``
* IRAM: ``0x80000000`` - ``0x80008000``
To read or write in the WRAM or the MRAM, use the ``memory read|write`` command.
To read the IRAM, use the ``disassemble`` command.
``memory read|write`` can also by used to read or write the IRAM but it will be in a binary format (not instruction format).