Перейти к содержанию

Последнее обновление:2026-10-12

Совместная отладка Bazel и LLDB

Сегодня, отлаживая код, я обнаружил, что файлы, собранные bazel, больше не отлаживаются на mac — вместо исходников сплошной ассемблер.

* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000fd0 hello_world`main
hello_world`main:
->  0x100000fd0 <+0>: pushq  %rbp
    0x100000fd1 <+1>: movq   %rsp, %rbp
    0x100000fd4 <+4>: subq   $0x60, %rsp
    0x100000fd8 <+8>: movl   $0x0, -0x4(%rbp)
(lldb) quit

Как это решить?

По умолчанию стоит standalone, и его нужно отключить; здесь используем local — это значит, что вывод будет линковаться со своими зависимостями, а не использовать стратегию standalone по умолчанию.

build --spawn_strategy=local

Так код снова становится виден.

* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000fdf hello_world`main at hello_world.cc:14:21
   11  
   12   int main() {
   13     // Create a thread pool
-> 14     auto threadPool = GetCpuThreadPool();
   15     if (!threadPool) {

Разбор принципа

Почему так происходит? Стратегия запуска standalone, используемая Bazel по умолчанию, выполняет компиляцию в песочнице; на macOS реализация песочницы (sandbox-exec) искажает пути отладочной информации и генерацию dSYM, и в итоге таблица символов в бинарнике оказывается битой — LLDB остаётся показывать только ассемблер.

Переключитесь на:

build --spawn_strategy=local

Это значит, что действия компиляции выполняются прямо на локальной машине, без песочницы; символьная информация сохраняется целиком, и точки останова попадают точно в строки исходника. Рекомендую сразу прописать это в .bazelrc проекта — раз и навсегда:

build --spawn_strategy=local
build --compilation_mode=dbg   # 调试构建记得带 -c dbg

(1) при отладке используйте bazel build -c dbg //... или bazel run -c dbg, чтобы гарантированно получить -O0 -g;

(2) на Linux песочница по умолчанию обычно не влияет на отладочные символы; проблема в основном проявляется на macOS;

(3) если исходники всё ещё не видны, проверьте dSYM: dsymutil ./hello_world && lldb ./hello_world.

После этого Bazel + LLDB отлично работают в связке. Наткнулись на другие грабли — дополняйте в комментариях~

Похожие темы

Комментарии