Последнее обновление: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 по умолчанию.
Так код снова становится виден.
* 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 остаётся показывать только ассемблер.
Переключитесь на:
Это значит, что действия компиляции выполняются прямо на локальной машине, без песочницы; символьная информация сохраняется целиком, и точки останова попадают точно в строки исходника. Рекомендую сразу прописать это в .bazelrc проекта — раз и навсегда:
(1) при отладке используйте bazel build -c dbg //... или bazel run -c dbg, чтобы гарантированно получить -O0 -g;
(2) на Linux песочница по умолчанию обычно не влияет на отладочные символы; проблема в основном проявляется на macOS;
(3) если исходники всё ещё не видны, проверьте dSYM: dsymutil ./hello_world && lldb ./hello_world.
После этого Bazel + LLDB отлично работают в связке. Наткнулись на другие грабли — дополняйте в комментариях~
Похожие темы¶
- Сборка проектов C++ с Bazel | C++那些事
- CMake: введение и практика | C++那些事
- Введение в управление пакетами Conan для C++ | C++那些事
- C++ Insights: взгляд на этап компиляции | C++那些事
- Интерактивные C++ Jupyter Notebook | C++那些事
- Преобразование C++ string в int | C++那些事
- Отладочный макрос dbg-macro для C++ | C++那些事
- Подробный разбор опций компиляции GCC | C++那些事
- Отладка программ на C++ с помощью GDB | C++那些事
- Расширенная отладка с помощью GDB Python | C++那些事