2010-02-09 15 views

risposta

5

Sì. Costruisci LLVM in modalità non a rilascio (impostazione predefinita). Ci vuole un po 'più tempo di una versione di rilascio, ma puoi usare gdb per eseguire il debug del file oggetto risultante.

Una nota di cautela: ho dovuto aggiornare il mio box Linux a 3 GB di memoria per rendere ragionevoli i tempi di collegamento in modalità debug LLVM.

+0

Ma è possibile eseguire il debug di un llvm pass? I passaggi LLVM vengono solitamente eseguiti utilizzando opt, quindi non so come usare gdb per eseguirlo. Puoi dirmi il comando? –

+0

È possibile eseguire ad es. "gdb/usr/local/bin/opt" e digita "esegui ". –

+1

http://llvm.org/docs/WritingAnLLVMPass.html#debughints – name

0

seguendo Richard Penningtons consiglio aggiungendo backticks + funziona per me:

gdb /usr/local/bin/opt 

quindi digitare

run `opt -load=/pathTo/LLVMHello.so -hello </pathTo/your.bc> /dev/null` 

Nota: (. Mancante rep) avrei commentato, ma non poteva

2

Per prima cosa assicurati che LLVM sia compilato con le opzioni di debug abilitate, che è fondamentalmente l'impostazione predefinita. Se non hai compilato LLVM con opzioni non predefinite, la tua build attuale dovrebbe andare bene.

Tutti i passaggi LLVM vengono eseguiti utilizzando lo strumento opt (ottimizzatore) di LLVM. I pass vengono compilati in file di oggetti condivisi, ad esempio il file LLVMHello.so in build/lib e quindi caricati dallo strumento opt. Per eseguire il debug o il passaggio attraverso il passaggio, è necessario arrestare LLVM prima che inizi l'esecuzione del file .so perché non esiste un modo per inserire un punto di interruzione in un file oggetto condiviso. Invece, possiamo inserire un'interruzione nel codice prima del invoca il passaggio.

che andremo a mettere un punto di interruzione in llvm/lib/IR/Pass.cpp

Ecco come fare:

  1. Naviga per costruire/bin e terminale aperto e digitare gdb opt. Se hai compilato llvm con i simboli di debug aggiunti, gdb impiegherà del tempo per caricare i simboli di debug, altrimenti gdb dirà loading debugging symbols ... (no debugging symbols found).

  2. Ora è necessario impostare un punto di interruzione nel metodo void Pass::preparePassManager(PMStack &) in Pass.cpp. Questo è probabilmente il primo (o uno dei primi) metodi coinvolti nel caricamento del passaggio. È possibile farlo digitando break llvm::Pass::preparePassManager nel terminale.

  3. Esecuzione del pass. Ho un file di codice binario che chiamato trial.bc e lo stesso LLVMHello.so passaggio così ho eseguito con

    run -load ~/llvm/build/lib/LLVMHello.so -hello < ~/llvmexamples/trial.bc > /dev/null 
    

    gdb sarà ora fermarsi a Pass::preparePassManager e da qui possiamo usare passo successivo e per tracciare l'esecuzione.

+0

Ciao, penso di non aver aggiunto i simboli di debug durante la creazione di LLVM. Posso ancora usare gdb per il debug? Avrà qualche limitazione sul debug? – algoProg

+0

Non ci dovrebbero essere problemi. –