2015-01-21 29 views
16

Tôi đang tìm cách tạo một đường dây điện thoại cho các dự án java từ dòng lệnh. Tôi đã khám phá một số dự án, mỗi lần giảm ngắn (hoặc trong sự hiểu biết của tôi, hoặc chức năng) của những gì tôi đang hướng tới. Một số hướng dẫn đơn giản về cách thực hiện điều này sẽ là tuyệt vời, một mục tiêu bổ sung là để có được một biểu diễn văn bản của biểu đồ này.Tạo biểu đồ cuộc gọi trực quan cho các dự án java từ dòng lệnh

Dưới đây là những gì tôi đã cố gắng:

Gọi đồ thị: https://github.com/gousiosg/java-callgraph

này mang lại cho tôi đầu ra văn bản mà tôi muốn, nhưng tôi không thể tìm thấy một chiều (sau khi xem xét thông qua các tài liệu trong một thời gian), để biến điều này thành đầu ra đồ thị (tệp hình ảnh).

Bồ hóng: http://sable.github.io/soot/

Sau khi dành một lượng lớn thời gian tìm kiếm thông qua các tài liệu hướng dẫn bồ hóng, mà dường như khá khó khăn để làm theo, tôi quản lý để có được bồ hóng để tạo bytecode. Tuy nhiên, tôi không thể tìm thấy bất kỳ hướng dẫn nào về cách tạo biểu đồ cuộc gọi từ nó. Tôi chỉ thấy trên trang chính rằng nó có thể làm điều này và tôi nhận được một số cuộc hội thoại qua email từ các tìm kiếm trên google của mình, tất cả chỉ là những câu hỏi không có câu trả lời. Tôi đang sử dụng bản dựng hàng đêm bằng lệnh:

java -cp soot-trunk.jar soot.Main -cp . -pp HelloWorld 

Trong trường hợp HelloWorld là tên tệp java của tôi, tôi nhận được đầu ra là tệp .class, nhưng tôi không thể xem cách nhận thực tế biểu đồ cuộc gọi. Đây là sau khi làm theo hướng dẫn tại đây: https://github.com/Sable/soot/wiki/Running-Soot. Khi tôi theo các liên kết về hình ảnh, chúng dường như là các liên kết bị hỏng rồi chuyển hướng trở lại trang chủ. Tôi có thể thấy một số thông tin về việc sử dụng cờ -cg trên trang dòng lệnh nhưng không thể nhận được bất kỳ thứ gì để hoạt động - tôi chỉ nhận được lỗi phân tích cú pháp tùy chọn, đề xuất một đối số không hợp lệ: https://ssebuild.cased.de/nightly/soot/doc/soot_options.htm#phase_5

Tìm kiếm stackoverflow - câu trả lời hiện có Tôi đã xem xét một số câu hỏi tương tự, chẳng hạn như: Static analysis of Java call graph Tuy nhiên, câu trả lời chỉ nói "sử dụng muội" hoặc "sử dụng biểu đồ cuộc gọi", tôi đã thử những điều này mà không có bất kỳ may mắn nào - mặc dù tôi gần nhất với biểu đồ cuộc gọi khi tôi có đầu ra văn bản.

Tôi thấy một số phần mềm dựa trên GUI và các plugin eclipse yêu cầu tạo biểu đồ cuộc gọi, nhưng tôi đang cố gắng làm việc này từ dòng lệnh.

Bất kỳ trợ giúp nào thực sự được đánh giá cao, hướng dẫn hoặc tập hợp lệnh bằng biểu đồ cuộc gọi hoặc Soot hoặc chương trình khác thực sự hữu ích. Có thể bạn cũng nên thực hiện bất kỳ hướng dẫn ngắn nào về tài liệu của mình có nhiều câu hỏi hơn câu trả lời khi tìm kiếm.

Để tham khảo, tôi hiện đang cố gắng với một lớp học rất đơn giản dưới đây:

public class HelloWorld { 

    public static void main(String[] args) { 
     foo(); 
    } 
    public static void foo(){ 
     System.out.println("Hello World"); 
    } 
} 

Trả lời

11

Nó giống như Call Graph sản xuất khá phong nha đầu ra. Hãy làm một PoC nhanh.

Tôi sẽ sử dụng kết quả mẫu được cung cấp bởi nhà phát triển Biểu đồ cuộc gọi.

 
org.apache.batik.dom.AbstractParentNode:appendChild org.apache.batik.dom.AbstractParentNode:fireDOMNodeInsertedEvent 6270 
org.apache.batik.dom.AbstractParentNode:fireDOMNodeInsertedEvent org.apache.batik.dom.AbstractDocument:getEventsEnabled 6280 
org.apache.batik.dom.AbstractParentNode:checkAndRemove org.apache.batik.dom.AbstractNode:getOwnerDocument 6280 
org.apache.batik.dom.util.DoublyIndexedTable:put org.apache.batik.dom.util.DoublyIndexedTable$Entry:DoublyIndexedTable$Entry 6682 
org.apache.batik.dom.util.DoublyIndexedTable:put org.apache.batik.dom.util.DoublyIndexedTable:hashCode 6693 
org.apache.batik.dom.AbstractElement:invalidateElementsByTagName org.apache.batik.dom.AbstractElement:getNodeType 7198 
org.apache.batik.dom.AbstractElement:invalidateElementsByTagName org.apache.batik.dom.AbstractDocument:getElementsByTagName 14396 
org.apache.batik.dom.AbstractElement:invalidateElementsByTagName org.apache.batik.dom.AbstractDocument:getElementsByTagNameNS 28792 

Có một số công cụ hiển thị biểu đồ có sẵn.Đơn giản nhất có thể là DOT (vui lòng kiểm tra liên kết, có một số công cụ tốt khác được liệt kê).

Để sử dụng DOT Tôi cần chuyển đổi dữ liệu một chút. Hãy nói rằng tôi muốn giữ ClassName: methodName và bỏ qua gói.

Đó là siêu dễ dàng, bạn có thể sử dụng bất kỳ công cụ để làm điều đó, nhưng tôi sẽ sử dụng sed: Kết quả

 
OUT=callgraph.dot 
echo "graph test {" > $OUT 
sed -E 's/[a-z]+\.//g; s/[0-9]+\/;/; s//-- /; s/[\$|\:]/_/g' callgraph.txt >> $OUT 
echo "}" >> $OUT 
dot -Tpng callgraph.dot -o callgraph.png 

đây được tạo ra:

 
graph test { 
AbstractParentNode_appendChild -- AbstractParentNode_fireDOMNodeInsertedEvent ; 
AbstractParentNode_fireDOMNodeInsertedEvent -- AbstractDocument_getEventsEnabled ; 
AbstractParentNode_checkAndRemove -- AbstractNode_getOwnerDocument ; 
DoublyIndexedTable_put -- DoublyIndexedTable_Entry_DoublyIndexedTable_Entry ; 
DoublyIndexedTable_put -- DoublyIndexedTable_hashCode ; 
AbstractElement_invalidateElementsByTagName -- AbstractElement_getNodeType ; 
AbstractElement_invalidateElementsByTagName -- AbstractDocument_getElementsByTagName ; 
AbstractElement_invalidateElementsByTagName -- AbstractDocument_getElementsByTagNameNS ; 
} 

DOT khá tử tế với làm như sau:

enter image description here

Tất cả các đồ thị được trích xuất từ ​​các dữ liệu ban đầu:

enter image description here

Xin lưu ý, bạn có thể điều chỉnh render như bạn muốn. DOT là một phần của graphviz là một bộ công cụ khá linh hoạt.

Có một ý tưởng chung đằng sau câu trả lời của tôi:

  • sử dụng bất kỳ công cụ phù hợp để tạo ra dấu vết
  • tìm một giải pháp tốt render
  • dành chút thời gian để có được chuyển đổi tự động đơn giản

BTW, hãy xem canviz

Canviz là một thư viện JavaScript để vẽ đồ thị Graphviz đến một trang web canvas trình duyệt. Về mặt kỹ thuật, Canviz là một trình renderer JavaScript xdot . Nó hoạt động trong hầu hết các trình duyệt hiện đại.

Chúc mừng mã hóa :)

+0

Cảm ơn bạn! Mặc dù tôi chưa có chút thời gian để thử điều này, nó trông giống như những gì tôi đang theo đuổi. Câu trả lời này chắc chắn sẽ giúp những người tương lai xem câu hỏi này vì nó được giải thích rõ ràng. Cảm ơn nhiều. – ThePerson

1

Ngoài ra còn có Wala: http://wala.sourceforge.net/wiki/index.php/Main_Page

Nó hỗ trợ xây dựng chiến lược graph nhiều cuộc gọi và đã có tích hợp với DOT. Nếu bạn làm theo hướng dẫn bắt đầu thứ, chúng đã chứa một số chương trình ví dụ hiển thị biểu đồ cuộc gọi một cách trực quan. Danh sách người dùng của họ cũng khá hỗ trợ.

Ở đây họ đề cập đến một ví dụ hiển thị đồ thị cuộc gọi:

http://wala.sourceforge.net/wiki/index.php/UserGuide:Getting_Started#Other_basic_examples

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