Saltar a contenido

Última actualización:2026-10-12

Depuración conjunta de Bazel y LLDB

Hoy, al depurar, descubrí que los archivos compilados con bazel ya no se podían depurar en el mac: lo que salía era todo ensamblador.

* 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

¿Cómo se arregla?

El valor por defecto es standalone, y hay que desactivarlo; aquí usamos local, lo que significa que la salida se enlazará con sus dependencias en lugar de usar la estrategia standalone por defecto.

build --spawn_strategy=local

Con esto ya se ve el código.

* 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) {

Explicación del principio

¿Por qué pasa esto? La estrategia de spawn standalone por defecto de Bazel ejecuta las acciones de compilación dentro de una sandbox; en macOS la implementación del sandbox (sandbox-exec) desvía las rutas del debug info y la generación del dSYM, y el binario acaba con la tabla de símbolos rota, así que LLDB solo puede mostrarte ensamblador.

Cámbialo a:

build --spawn_strategy=local

Esto significa que las acciones de compilación se ejecutan directamente en la máquina local, sin entrar en la sandbox; la información de símbolos se conserva completa y los breakpoints caen en las líneas de código correctas. Recomiendo escribirlo directamente en el .bazelrc del proyecto, y asunto arreglado para siempre:

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

(1) al depurar, usa bazel build -c dbg //... o bazel run -c dbg para asegurar -O0 -g;

(2) en Linux el sandbox por defecto normalmente no afecta a los símbolos de depuración; este problema aparece sobre todo en macOS;

(3) si aún no ves el código fuente, revisa el dSYM: dsymutil ./hello_world && lldb ./hello_world.

Con esto, Bazel + LLDB ya colaboran a gusto. ¿Te has tropezado con otros hoyos? Añádelos en los comentarios~

Temas relacionados

Comentarios