2010-02-09 158 views

回答

5

是的。以非發佈模式構建LLVM(默認)。它需要比發佈版本更長的時間,但是您可以使用gdb來調試生成的目標文件。

請注意一點:我必須將我的Linux機箱升級到3GB的內存才能使LLVM調試模式鏈接時間合理。

+0

但我可以調試llvm通行證? LLVM通常通過opt運行,所以我不知道如何使用gdb來運行它。你能告訴我命令嗎? – 2010-02-10 07:35:06

+0

您可以運行例如「gdb/usr/local/bin/opt」並輸入「run <你的命令行>」。 – 2010-02-10 11:48:56

+1

http://llvm.org/docs/WritingAnLLVMPass.html#debughints – name 2010-09-28 14:38:15

0

繼理查德Penningtons諮詢+添加反引號爲​​我工作:

gdb /usr/local/bin/opt 

然後鍵入

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

注:(失蹤REP)我會評論,但不能

2

首先確保LLVM編譯時啓用了調試選項,這基本上是默認設置。如果你沒有使用非默認選項編譯LLVM,那麼你的當前版本應該沒問題。

所有LLVM通行證都使用LLVM的opt(優化器)工具運行。將通道編譯爲共享對象文件,即文件build/lib,然後由opt工具加載。要調試或逐步完成傳遞,我們必須在開始執行.so文件之前暫停LLVM,因爲無法在共享對象文件中放置斷點。相反,我們可以在之前暫停代碼它調用通行證。

我們打算把一個斷點llvm/lib/IR/Pass.cpp

這裏是如何做到這一點:

  1. 導航到構建/ bin和開放終端輸入gdb opt。如果你編譯llvm時添加了調試符號,那麼gdb會花費一些時間來加載調試符號,否則gdb會說loading debugging symbols ... (no debugging symbols found)

  2. 現在我們需要在Pass.cppvoid Pass::preparePassManager(PMStack &)方法中設置一個斷點。這可能是加載傳球所涉及的第一個(或第一個)方法。 您可以通過在終端中鍵入break llvm::Pass::preparePassManager來完成此操作。

  3. 運行通行證。我有一個名爲trial.bc一個位碼文件和相同LLVMHello.so通,所以我用

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

    GDB運行它現在會停在Pass::preparePassManager並從這裏我們可以使用step和next來跟蹤執行。

+0

嗨,我想我在構建LLVM時沒有添加調試符號。我仍然可以使用gdb進行調試嗎?這對調試有什麼限制嗎? – algoProg 2016-12-20 16:59:49

+0

不應該有任何問題。 – 2016-12-21 03:34:07