En Mac OS X hubo una decisión de que el vinculador (ld
) no procesara toda la información de depuración cuando vincula su programa. La información de depuración suele ser 10 veces más grande que el ejecutable del programa, por lo que hacer que el enlazador procese toda la información de depuración e incluirla en el binario ejecutable fue un grave perjuicio para los tiempos de enlace. Para el desarrollo iterativo, compilar, vincular, compilar, vincular, depurar, compilar enlace, esto fue un verdadero éxito.
En su lugar, el compilador genera la información de depuración DWARF en los archivos .s, el ensamblador lo genera en los archivos .o, y el enlazador incluye un "mapa de depuración" en el binario ejecutable que informa a los usuarios los símbolos fueron reubicados durante el enlace.
Un consumidor (haciendo la depuración de archivos .o) carga el mapa de depuración desde el ejecutable y procesa todo el DWARF en los archivos .o según sea necesario, reasignando los símbolos según las instrucciones del mapa de depuración.
dsymutil
se puede considerar como un enlazador de información de depuración. Realiza este mismo proceso: lea el mapa de depuración, cargue el DWARF de los archivos .o, reubique todas las direcciones, y luego emite un solo binario de todos los DWARF en sus direcciones finales y vinculadas. Este es el paquete dSYM.
Una vez que tiene un paquete dSYM, tiene un DWARF normal antiguo que cualquier herramienta de lectura enana (que puede tratar con archivos binarios Mach-O) puede procesar.
Hay un refinamiento adicional que hace que todo este trabajo, los UUID incluidos en los binarios de Mach-O. Cada vez que el enlazador crea un binario, emite un UUID de 128 bits en el comando de carga LC_UUID (v. otool -hlv
o dwarfdump --uuid
). Esto identifica de manera única ese archivo binario. Cuando dsymutil
crea el dSYM, incluye ese UUID. Los depuradores solo asociarán un dSYM y un ejecutable si tienen UUID coincidentes, sin marcas de tiempo de mod de archivo dudosas ni nada de eso.
También podemos usar los UUID para ubicar los dSYM para binarios. Aparecen en informes de fallos, incluimos un importador de Spotlight que puede usar para buscarlos, p. mdfind "com_apple_xcode_dsym_uuids == E21A4165-29D5-35DC-D08D-368476F85EE1"
si el dSYM se encuentra en una ubicación indexada de Spotlight. Incluso puede tener un repositorio de dSYM para su empresa y un programa que puede recuperar el dSYM correcto dado un UUID - tal vez una pequeña base de datos mysql o algo así - para que ejecute el depurador en un ejecutable aleatorio y tenga al instante toda la depuración información para ese ejecutable. Hay algunas cosas bonitas que puedes hacer con los UUID.
Pero de todos modos, para responder a su pregunta de origen: El binario sin comprimir tiene el mapa de depuración, los archivos .o tienen el DWARF, y cuando se ejecuta dsymutil
, estos se combinan para crear el paquete dSYM.
Si quiere ver las entradas del mapa de depuración, haga nm -pa executable
y todas están allí. Están en la forma de los viejos registros de la lista de apuñalamientos (el vinculador ya sabía cómo procesar las puñaladas, así que era más fácil usarlas), pero verás cómo funciona sin muchos problemas, tal vez refiéraste a la documentación de algunas estacas si eres incierto.
¿Cómo sabe 'dsymutil' dónde están los archivos .o? No veo ninguna opción en la página de manual para contarlo. También necesito compilar el binario '-g3', y si es así, ¿puedo quitarlo después de' dsymutil''d? Gracias. – mxcl
Hay entradas de "depuración de mapa" en el ejecutable antes de que se elimine con los nombres de archivo de los archivos .o. 'nm -pa binario | grep OSO' los listará. Están en la forma del antiguo formato de depuración de amenazas (porque el enlazador ya sabía cómo manejar ese formato). Después de haber creado su dSYM, puede quitarlos del ejecutable. No debería necesitar usar '-g3' en la plataforma Mac,' -g' debería ser suficiente. Creo que las salidas '-g3' preprocesan la información macro pero lldb no lee eso en Mac OS X (y no sé si el sonido incluso lo emite). –
Gracias por esta respuesta detallada y útil. – mxcl