Back to Fastled

LLDB Debugging Guide

docs/agents/lldb-debugging.md

3.10.34.5 KB
Original Source

LLDB Debugging Guide

Overview

The clang-tool-chain package includes LLDB debugger support for interactive debugging and crash analysis. However, the existing crash handler already provides excellent stack traces that are often sufficient for debugging.

Available Tools

The clang-tool-chain package provides:

  • clang-tool-chain-lldb - LLDB debugger wrapper
  • clang-tool-chain-lldb-check-python - Check Python bindings status
  • Raw LLDB executable at: ~/.clang-tool-chain/lldb/win/x86_64/bin/lldb.exe

Usage

Basic Usage

bash
# Interactive debugging
uv run clang-tool-chain-lldb executable.exe

# Automated crash analysis (--print mode)
uv run clang-tool-chain-lldb --print executable.exe

# Interactive LLDB session (no executable)
uv run clang-tool-chain-lldb

Help

bash
uv run clang-tool-chain-lldb --help

Current Stack Trace Support

IMPORTANT: FastLED already has built-in crash handlers that provide excellent stack traces with:

  • Function names with full signature
  • Source file paths and line numbers
  • Instruction addresses and offsets
  • Module names (exe/dll)
  • Complete call stack (19+ frames)
  • Loaded module list

Example Stack Trace Output

#7  0x00007ffadf7d1d2c [fl_test.dll] function_c() + 84
    (Line 9 of "../../tests/fl\test.cpp" starts at address 0x180001d2c)
#8  0x00007ffadf7d1cc7 [fl_test.dll] function_b() + 15
    (Line 13 of "../../tests/fl\test.cpp" starts at address 0x180001cc2)
#9  0x00007ffadf7d1ca7 [fl_test.dll] function_a() + 15
    (Line 17 of "../../tests/fl\test.cpp" starts at address 0x180001ca2)

LLDB Integration Challenges

Crash Handler Interference

The existing crash handlers catch signals before LLDB can intercept them, which means:

  • LLDB's --print mode cannot capture crashes automatically
  • The process exits before LLDB can generate a backtrace
  • The built-in crash handler provides stack traces instead

Potential Solutions (Not Yet Implemented)

  1. Disable crash handler via environment variable (requires implementation)
  2. Configure LLDB exception handling before crash handler (limited success)
  3. Use LLDB interactively with breakpoints (manual process)

When to Use LLDB

LLDB is most useful for:

  • Interactive debugging: Setting breakpoints, stepping through code, inspecting variables
  • Pre-crash inspection: Examining program state before a crash occurs
  • Complex debugging scenarios: Thread analysis, watchpoints, conditional breakpoints

When NOT to Use LLDB

The built-in crash handler is sufficient for:

  • Post-mortem analysis: Stack traces from crashes
  • Unit test failures: Automated test runs with stack traces
  • CI/CD debugging: Non-interactive environments

Test Framework Integration

The FastLED test framework (uv run test.py) automatically:

  • Compiles tests with debug symbols (in debug mode)
  • Captures crash stack traces via built-in crash handler
  • Reports crashes with full file/line information

To compile tests in debug mode:

bash
uv run test.py <test_name> --cpp --build-mode debug

LLDB Command Reference

Common LLDB commands for debugging (migrated from GDB):

TaskGDB CommandLLDB Command
Run programgdb <program>uv run clang-tool-chain-lldb <program>
Backtracebtbt
Full backtracebt fullbt all
Select frameframe <n>frame select <n>
Print variableprint <var>print <var> or p <var>
Show localsinfo localsframe variable
Show argsinfo argsframe variable
Registersinfo registersregister read
Memory dumpx/<format> <addr>memory read <addr>
Set breakpointbreak <location>breakpoint set -n <function> or b <file>:<line>
Continuecontinue or ccontinue or c
Step overnext or nnext or n
Step intostep or sstep or s
Step outfinishfinish

References

Conclusion

The built-in crash handler provides stack traces that are sufficient for most debugging needs. LLDB is available if you need interactive debugging, but the automatic crash analysis mode is currently blocked by the existing crash handler.

For typical unit test debugging, rely on the existing stack traces. For complex interactive debugging, use LLDB directly with breakpoints.