Ir para o conteúdo

Ú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.

build --spawn_strategy=local

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:

build --spawn_strategy=local

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:

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

(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

Comentários