tutorial gcc gdb clang llvm lldb

gcc - tutorial - lldb android



¿Es posible depurar un programa compilado de gcc usando lldb o depurar un programa compilado de clang usando gdb? (1)

(Prefacio: soy bastante nuevo en C / C ++ y realmente no sé cómo funciona realmente la depuración en el código nativo).

Algunas fuentes dicen que gdb y lldb pueden depurar cualquier programa compilado en código máquina . Otros dicen que para depurar con gdb debe compilar en gcc con el indicador -g . La documentación para gcc sugiere que esto es opcional y que, de hecho, si lo usa, puede causar problemas para los depuradores que no sean gdb. Clang también tiene un indicador -g y la documentación básicamente dice "Generar información de depuración".

Entonces, ¿estos depuradores están restringidos a sus propias cadenas de herramientas (GNU y LLVM), o son de alguna manera independientes del compilador utilizado?


En teoría, debería poder depurar un programa construido por GCC con lldb y un programa construido con LLVM con gdb. En ambos casos, debe compilar con -g .

Esto se debe a que ambos compiladores generan archivos de objetos en el mismo formato (por ejemplo, en Linux, ambos generarán archivos ELF con información de depuración DWARF ) y ambos depuradores saben cómo analizar ese formato.

En la práctica, ambos compiladores introducen algunos datos en la información de depuración que solo su depurador respectivo sabe cómo consumir. Sin embargo:

  1. Los datos generados por LLVM no deberían obstaculizar gdb de ninguna manera.
  2. Los datos generados por GCC no deberían obstaculizar el lldb, pero si lo hace, puede solicitar específicamente a gcc que no agregue datos no estándar . Por ejemplo, en Linux, usar -gdwarf-2 sobre -g solo debería generar DWARF estándar.

Tenga en cuenta que también puede depurar programas sin información de depuración (no compilados con -g ), pero estará limitado a información de bajo nivel en el depurador (código de ensamblaje, memoria y registros) y no podrá ver construcciones de alto nivel como números de línea, nombres de funciones, asignación entre nombres de variables y su contenido, etc.