2010-02-09 10 views

Odpowiedz

5

Tak. Zbuduj LLVM w trybie niezwalniającym (domyślnie). Trwa to trochę dłużej niż kompilacja wydania, ale możesz użyć gdb do debugowania wynikowego pliku obiektu.

Jedna uwaga: musiałem uaktualnić moje Linux-a do 3GB pamięci, aby czas połączenia w trybie debugowania LLVM był rozsądny.

+0

Ale czy mogę debugować przepustkę LIVM? Przepustki LLVM są zwykle uruchamiane przy użyciu opcji opt, więc nie wiem, jak użyć gdb do uruchomienia. Czy możesz mi powiedzieć polecenie? –

+0

Możesz uruchomić np. "gdb/usr/local/bin/opt" i wpisz "uruchom ". –

+1

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

0

Po Richard Penningtons porady dodając odwrócone, pojedyncze apostrofy + działa na mnie:

gdb /usr/local/bin/opt 

następnie wpisz

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

Uwaga: (. Brakuje REP) bym skomentował, ale nie mógł

2

Najpierw upewnij się, że LLVM jest skompilowana z włączonymi opcjami debugowania, co jest w zasadzie ustawieniem domyślnym. Jeśli nie skompilowałeś LLVM z opcjami innymi niż domyślne, twoja obecna kompilacja powinna być w porządku.

Wszystkie przepustki LLVM są uruchamiane przy użyciu narzędzia LLVM opt (optymalizator). Przekazy są kompilowane do plików obiektów udostępnionych, tj. LLVMHello.so w pliku build/lib, a następnie ładowane za pomocą narzędzia opt. Aby debugować lub przejść przez przepustkę, musimy zatrzymać LLVM przed rozpoczęciem wykonywania pliku .so, ponieważ nie ma możliwości umieszczenia punktu przerwania w pliku obiektu współużytkowanego. Zamiast tego możemy umieścić przerwę w kodzie przed, która wywoła przepustkę.

Zamierzamy umieścić punkt przerwania w llvm/lib/IR/Pass.cpp

Oto jak to zrobić:

  1. Przejdź do budowy/bin i otwórz terminal i wpisać gdb opt. Jeśli skompilowałeś llvm z dodanymi symbolami debugowania, to gdb zajmie trochę czasu, aby załadować symbole debugowania, inaczej gdb powie loading debugging symbols ... (no debugging symbols found).

  2. Teraz musimy ustawić punkt przerwania w metodzie void Pass::preparePassManager(PMStack &) w Pass.cpp. Jest to prawdopodobnie pierwsza (lub jedna z pierwszych) metod związanych z ładowaniem przepustki. Możesz to zrobić, wpisując break llvm::Pass::preparePassManager w terminalu.

  3. Uruchamianie przebiegu. Mam plik bitcode nazwie trial.bc i taką samą LLVMHello.so przepustkę więc uruchomić go z

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

    gdb będzie teraz zatrzymać na Pass::preparePassManager i stąd możemy wykorzystać na krok i następny prześledzić wykonanie.

+0

Witam, myślę, że nie dodałem symboli debugowania podczas budowania LLVM. Czy nadal mogę używać gdb do debugowania? Czy to ma jakiekolwiek ograniczenia w debugowaniu? – algoProg

+0

Nie powinno być żadnych problemów. –