Ú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.
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:
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:
(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¶
- Construir proyectos C++ con Bazel | C++那些事
- CMake: introducción y práctica | C++那些事
- Introducción a Conan, gestor de paquetes de C++ | C++那些事
- C++ Insights: observación en tiempo de compilación | C++那些事
- C++ Jupyter Notebook interactivo | C++那些事
- Convertir string a int en C++ | C++那些事
- dbg-macro, macro de depuración para C++ | C++那些事
- Explicación detallada de las opciones de compilación de GCC | C++那些事
- Depurar programas C++ con GDB | C++那些事
- Depuración con la extensión Python de GDB | C++那些事