2010-02-09 36 views

Trả lời

5

Có. Xây dựng LLVM ở chế độ không phát hành (mặc định). Phải mất nhiều thời gian hơn bản phát hành bản phát hành, nhưng bạn có thể sử dụng gdb để gỡ lỗi tệp đối tượng kết quả.

Một lưu ý thận trọng: Tôi phải nâng cấp hộp Linux của mình lên 3GB bộ nhớ để làm cho thời gian liên kết chế độ gỡ lỗi LLVM hợp lý.

+0

Nhưng tôi có thể gỡ lỗi thẻ vượt qua không? LLVM vượt qua thường được chạy bằng cách sử dụng opt vì vậy tôi không biết làm thế nào để sử dụng gdb để chạy nó. Bạn có thể cho tôi biết lệnh không? –

+0

Bạn có thể chạy ví dụ: "gdb/usr/local/bin/opt" và nhập "chạy ". –

+1

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

0

Sau Richard Penningtons lời khuyên + thêm backticks làm việc cho tôi:

gdb /usr/local/bin/opt 

sau đó gõ

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

Lưu ý: (. Thiếu đại diện) tôi sẽ nhận xét, nhưng không thể

2

Trước tiên hãy đảm bảo LLVM được biên dịch với các tùy chọn gỡ lỗi được bật, về cơ bản là cài đặt mặc định. Nếu bạn không biên dịch LLVM với các tùy chọn không mặc định thì xây dựng hiện tại của bạn sẽ ổn.

Tất cả các thẻ LLVM được chạy bằng công cụ opt (trình tối ưu hóa) của LLVM. Các thẻ được biên dịch thành các tệp đối tượng được chia sẻ, tức là, tệp LLVMHello.so trong build/lib và sau đó được tải bằng công cụ opt. Để gỡ lỗi hoặc bước qua vượt qua chúng ta phải ngăn chặn LLVM trước khi nó bắt đầu thực hiện tệp .so vì không có cách nào để đặt điểm ngắt trong tệp đối tượng được chia sẻ. Thay vào đó, chúng tôi có thể đặt lệnh ngắt trong mã trước khi nó gọi đường chuyền.

Chúng ta sẽ đặt một breakpoint trong llvm/lib/IR/Pass.cpp

Dưới đây là làm thế nào để làm điều đó:

  1. Navigate to xây dựng/bin và thiết bị đầu cuối mở và gõ gdb opt. Nếu bạn biên dịch llvm với các biểu tượng gỡ lỗi được thêm vào thì gdb sẽ mất một thời gian để tải các biểu tượng gỡ lỗi, nếu không gdb sẽ nói loading debugging symbols ... (no debugging symbols found).

  2. Bây giờ, chúng tôi cần đặt điểm ngắt tại phương pháp void Pass::preparePassManager(PMStack &) trong Pass.cpp. Đây có lẽ là phương pháp đầu tiên (hoặc một trong những phương pháp đầu tiên) liên quan đến việc tải mật khẩu. Bạn có thể thực hiện việc này bằng cách nhập break llvm::Pass::preparePassManager vào thiết bị đầu cuối.

  3. Chạy thẻ. Tôi có một tập tin bitcode gọi trial.bc và cùng LLVMHello.so vượt qua vì vậy tôi chạy nó với

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

    gdb bây giờ sẽ dừng lại ở Pass::preparePassManager và từ đây trở đi chúng tôi có thể sử dụng bước và tiếp theo để theo dõi việc thực hiện.

+0

Xin chào, tôi nghĩ rằng tôi đã không thêm các biểu tượng gỡ lỗi trong khi xây dựng LLVM. Tôi vẫn có thể sử dụng gdb để gỡ lỗi? Liệu có bất kỳ hạn chế nào về gỡ lỗi? – algoProg

+0

Không có vấn đề gì. –

Các vấn đề liên quan