使用gdb調試llvm pass是否可行?我在llvm網站上找不到任何文檔。使用gdb調試llvm pass
回答
是的。以非發佈模式構建LLVM(默認)。它需要比發佈版本更長的時間,但是您可以使用gdb來調試生成的目標文件。
請注意一點:我必須將我的Linux機箱升級到3GB的內存才能使LLVM調試模式鏈接時間合理。
繼理查德Penningtons諮詢+添加反引號爲我工作:
gdb /usr/local/bin/opt
然後鍵入
run `opt -load=/pathTo/LLVMHello.so -hello </pathTo/your.bc> /dev/null`
注:(失蹤REP)我會評論,但不能
首先確保LLVM編譯時啓用了調試選項,這基本上是默認設置。如果你沒有使用非默認選項編譯LLVM,那麼你的當前版本應該沒問題。
所有LLVM通行證都使用LLVM的opt
(優化器)工具運行。將通道編譯爲共享對象文件,即文件build/lib
,然後由opt
工具加載。要調試或逐步完成傳遞,我們必須在開始執行.so
文件之前暫停LLVM,因爲無法在共享對象文件中放置斷點。相反,我們可以在之前暫停代碼它調用通行證。
我們打算把一個斷點llvm/lib/IR/Pass.cpp
這裏是如何做到這一點:
導航到構建/ bin和開放終端輸入
gdb opt
。如果你編譯llvm時添加了調試符號,那麼gdb會花費一些時間來加載調試符號,否則gdb會說loading debugging symbols ... (no debugging symbols found)
。現在我們需要在
Pass.cpp
的void Pass::preparePassManager(PMStack &)
方法中設置一個斷點。這可能是加載傳球所涉及的第一個(或第一個)方法。 您可以通過在終端中鍵入break llvm::Pass::preparePassManager
來完成此操作。運行通行證。我有一個名爲
trial.bc
一個位碼文件和相同LLVMHello.so
通,所以我用run -load ~/llvm/build/lib/LLVMHello.so -hello < ~/llvmexamples/trial.bc > /dev/null
GDB運行它現在會停在
Pass::preparePassManager
並從這裏我們可以使用step和next來跟蹤執行。
嗨,我想我在構建LLVM時沒有添加調試符號。我仍然可以使用gdb進行調試嗎?這對調試有什麼限制嗎? – algoProg 2016-12-20 16:59:49
不應該有任何問題。 – 2016-12-21 03:34:07
- 1. LLVM indvars pass
- 2. llvm inliner pass不起作用
- 3. 使用gdb調試回調
- 4. 使用Eclipse調試LLVM
- 5. 用gdb調試
- 6. 使用GDB調試模板
- 7. 使用gdb來調試C++
- 8. 使用gdb調試pthreads
- 9. 使用gdb調試qemu
- 10. 使用gdb調試conio.h
- 11. 如何使用GDB調試
- 12. 使用GDB調試Android
- 13. 使用GDB調試iPhone
- 14. 使用GDB進行調試
- 15. 使用gdb調試Java .jar
- 16. 使用GDB調試進程
- 17. 調試LLVM IR
- 18. 用gdb調試C
- 19. 使用GDB調試iOS應用程序
- 20. gdb - 用管道調試
- 21. 用Eclipse CDT和GDB調試
- 22. 如何使用gdb調試GUI程序
- 23. Golang使用GDB進行調試?
- 24. 使用gdb和objdump進行調試
- 25. 使用GDB調試netlink通信
- 26. 使用gdb調試kext:死鎖
- 27. 使用gdb調試wget命令
- 28. 使用ndk-gdb進行Android NDK調試
- 29. 使用gdb調試chroot程序
- 30. php5 - 使用gdb調試CRC不匹配
但我可以調試llvm通行證? LLVM通常通過opt運行,所以我不知道如何使用gdb來運行它。你能告訴我命令嗎? – 2010-02-10 07:35:06
您可以運行例如「gdb/usr/local/bin/opt」並輸入「run <你的命令行>」。 – 2010-02-10 11:48:56
http://llvm.org/docs/WritingAnLLVMPass.html#debughints – name 2010-09-28 14:38:15