2015-08-30 27 views
5

Ho un progetto semplice Voglio eseguire il debug per produrre la cartella dSYM con i simboli di debug.Perché una build da riga di comando in 2 fasi con clang non genera una directory dSYM?

Esecuzione:

clang++ -std=c++14 -stdlib=libc++ -g -o Lazy Lazy.cpp

Crea Lazy.dSYM come mi aspetto.

Tuttavia:

clang++ -std=c++14 -stdlib=libc++ -g -c Lazy.cpp 
clang++ -stdlib=libc++ -g -o Lazy Lazy.o 

non crea Lazy.dSYM (sembra che i simboli sono incorporati nel binario).

Purtroppo la build in due passaggi è ciò che fa il mio makefile modificato. Come posso generare Lazy.dSYM da una build di compilazione e collegamento in due fasi?

Io non necessario una directory dSYM, solo debug dei simboli, ma vorrei capire quando e perché è stato creato.

risposta

8

La creazione del pacchetto .dSYM viene eseguita da uno strumento denominato dsymutil. Quando Apple ha aggiunto il supporto per le informazioni di debug del DWARF, ha deciso di separare "collegamento eseguibile" da "collegamento di informazioni di debug". Come tale, il collegamento di informazioni di debug non viene eseguito dal normale linker, è fatto da dsymutil.

Per comodità, quando si crea un programma tutto in un solo passaggio, il compilatore invoca dsymutil per conto dell'utente. Questo perché sa di avere tutti gli input. Se si aggiunge l'opzione -v (a.k.a. --verbose) al comando di compilazione, verrà visualizzato il richiamo di dsymutil come ultimo passaggio.

In altri casi, tuttavia, non lo fa. Lascia il passo di collegamento delle informazioni di debug per l'utente da fare manualmente. Puoi farlo semplicemente il comando:

dsymutil <your_program> 

Ecco an article da un ingegnere Apple che ha aiutato a progettare e implementare il supporto di Apple per NANO spiegare il loro pensiero. Ha anche answered una domanda qui su Stack Overflow su questa roba.

+0

Molto chiaro, grazie. – jbcoe