2012-03-30 32 views
9

Tôi đang xem xét việc tạo biểu đồ cuộc gọi cho hạt nhân Linux bao gồm các con trỏ hàm (xem câu hỏi trước của tôi Static call graph generation for the Linux kernel để biết thêm thông tin). Tôi đã nói với LLVM nên phù hợp với mục đích này, tuy nhiên tôi không thể tìm thấy thông tin có liên quan trên llvm.orgLàm thế nào để sử dụng LLVM để tạo biểu đồ cuộc gọi?

Bất kỳ trợ giúp nào, bao gồm các con trỏ đến tài liệu liên quan, sẽ được đánh giá cao.

Trả lời

12

Trước tiên, bạn phải biên dịch hạt nhân của bạn thành LLVM IR (thay vì tệp đối tượng gốc). Sau đó, sử dụng llvm-ld, kết hợp tất cả các tệp đối tượng IR vào một mô-đun lớn duy nhất. Nó có thể là một điều khá khó khăn để làm, bạn sẽ phải sửa đổi các makefiles rất nhiều, nhưng tôi tin rằng nó là doable.

Bây giờ bạn có thể thực hiện phân tích của mình. Biểu đồ cuộc gọi đơn giản có thể được tạo bằng công cụ opt với thông số -dot-callgraph. Nó không có khả năng xử lý con trỏ hàm, vì vậy bạn có thể muốn sửa đổi nó.

Theo dõi tất cả các đường dẫn dữ liệu có thể mang con trỏ hàm của bạn là một thách thức, và trong trường hợp chung, không thể thực hiện (nếu có con trỏ đến số nguyên, nếu con trỏ được lưu trữ trong cấu trúc dữ liệu phức tạp, v.v.) Đối với phần lớn các trường hợp cụ thể, bạn có thể thử triển khai giải thích trừu tượng toàn cầu để ước tính tất cả các đường dẫn lưu lượng dữ liệu có thể có cho con trỏ của bạn. Nó sẽ không chính xác, tất nhiên, nhưng sau đó bạn sẽ nhận được ít nhất một xấp xỉ thận trọng.

+2

Bạn thực sự không muốn tạo một dấu chấm cho 8 triệu dòng mã. Nó sẽ bao gồm một sân tennis, nếu dấu chấm có thể vẽ nó, mà nó không thể. Ngoài ra, đây là một câu trả lời tuyệt vời cho câu trả lời cho câu hỏi khác của OP: -} với sự nhấn mạnh đặc biệt về những con trỏ chức năng thú vị. –

+0

@IraBaxter, chắc chắn bạn không muốn * hiển thị * một dấu chấm cho bất kỳ thứ gì lớn hơn "hello, world!". Nhưng bạn có thể muốn sử dụng tệp .dot đó để phân tích thêm. Tôi thường phân tích cú pháp các tệp .dot và lưu chúng vào cơ sở dữ liệu. –

+0

Cảm ơn bạn đã chỉ ra công cụ 'opt'. Có, Ira, tôi không xem xét việc tạo ra một biểu diễn đồ họa của biểu đồ cuộc gọi. Có nó ở bất kỳ định dạng phân tích nào là OK, định dạng dấu chấm nào đủ điều kiện. Liên quan đến các con trỏ hàm, tôi đã được thông báo rằng LLVM có thể thực hiện một số điểm phân tích cho các con trỏ hàm. Tôi không tự mình thực hiện điều này một cách rõ ràng. – addalbx

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