Última atualização:2026-10-12
Depuração conjunta de Bazel e LLDB¶
Hoje, ao depurar, descobri que os arquivos compilados pelo bazel não davam mais para depurar no mac — só aparecia assembly.
* 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
Como resolver?
O padrão é standalone, e precisamos desabilitá-lo; aqui usamos local, o que significa que a saída será linkada com as dependências dela em vez de usar a estratégia standalone padrão.
Assim o código fica visível.
* 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) {
Explicação do princípio¶
Por que isso acontece? A estratégia de spawn standalone padrão do Bazel roda as ações de compilação dentro de uma sandbox; no macOS a implementação do sandbox (sandbox-exec) desvia os caminhos do debug info e a geração do dSYM, e o binário acaba com a tabela de símbolos quebrada — o LLDB só consegue te mostrar assembly.
Troque para:
Isso significa que as ações de compilação rodam direto na máquina local, sem entrar na sandbox; a informação de símbolos fica totalmente preservada e os breakpoints caem certinho nas linhas do código-fonte. Recomendo escrever direto no .bazelrc do projeto, de uma vez por todas:
(1) ao depurar, use bazel build -c dbg //... ou bazel run -c dbg para garantir -O0 -g;
(2) no Linux o sandbox padrão geralmente não afeta os símbolos de depuração; esse problema aparece principalmente no macOS;
(3) se ainda não vir o código-fonte, verifique o dSYM: dsymutil ./hello_world && lldb ./hello_world.
Com isso, Bazel + LLDB trabalham bem juntos. Pisou em outros buracos? Deixe nos comentários~
Tópicos relacionados¶
- Construindo projetos C++ com Bazel | C++那些事
- CMake: introdução e prática | C++那些事
- Introdução ao gerenciamento de pacotes C++ com Conan | C++那些事
- C++ Insights: observação em tempo de compilação | C++那些事
- C++ interativo com Jupyter Notebook | C++那些事
- Converter string para int em C++ | C++那些事
- Macro de depuração dbg-macro em C++ | C++那些事
- Opções de compilação do GCC em detalhes | C++那些事
- Depuração de programas C++ com GDB | C++那些事
- Depuração estendida com Python no GDB | C++那些事