2015-01-21 1 views
16

커맨드 라인에서 자바 프로젝트 용 콜 그래프를 만들려고합니다. 몇 가지 프로젝트를 탐구했습니다. 매번 목표로 삼을 시점이 짧아졌습니다 (이해 또는 기능). 이 작업을 수행하는 방법에 대한 간단한 지침이 유용 할 것이고 추가 목표는이 그래프의 텍스트 표현을 얻는 것입니다. 여기 커맨드 라인에서 Java 프로젝트 용 시각적 호출 그래프 만들기

내가 시도 것입니다 :

콜 그래프 : https://github.com/gousiosg/java-callgraph

이 나에게 내가 원하는 텍스트 출력을 제공하지만이 문서를 통해보고 후 (방법을 찾을 수 없습니다 시각적 (이미지 파일) 그래프 출력으로 변환합니다.

는 그을음 : http://sable.github.io/soot/

따라 오히려 어려운 것 같다 매연 문서를 통해보고 시간의 엄청난 금액을 지출 후, 나는 바이트 코드를 생성하는 수트를 얻을 수 있었다. 그러나, 나는 그것에서 콜 그래프를 만드는 방법에 대한 가이드를 찾을 수 없습니다. 나는 그것이 할 수있는 주요 페이지에서만보고, 나는 Google 검색에서 몇 가지 전자 메일 대화를 얻을, 모두 대답없이 그냥 질문입니다. 나는 명령을 사용하여 야간 빌드를 사용하고 있습니다 :

java -cp soot-trunk.jar soot.Main -cp . -pp HelloWorld 
하여 HelloWorld 내 자바 파일의 이름입니다

, 나는의 .class 파일 출력을 얻을 수 있지만 실제 활용하는 방법을 볼 수 없습니다 콜 그래프. 이 안내서의 내용은 여기에 있습니다 : https://github.com/Sable/soot/wiki/Running-Soot. 시각화에 대한 링크를 따라 가면 링크가 깨져서 홈페이지로 리디렉션되는 것처럼 보입니다. 명령 줄 페이지에서 -cg 플래그를 사용하는 방법에 대한 정보를 볼 수 있지만 작동하려면 아무 것도 얻을 수 없습니다. - 잘못된 인수를 제안하는 옵션 구문 분석 오류가 발생합니다. https://ssebuild.cased.de/nightly/soot/doc/soot_options.htm#phase_5

검색 중 stackoverflow - 기존 답변 나는 다음과 같은 몇 가지 유사한 질문을 이미 보았습니다. Static analysis of Java call graph 그러나 대답은 "그을음 사용"또는 "콜 그래프 사용"이라고 말하면서 행운을 들이지 않고 이러한 시도를 해왔습니다. 그래프를 호출하면 텍스트가 출력됩니다.

일부 GUI 기반 소프트웨어와 이클립스 플러그인이 호출 그래프를 작성한다고하지만 명령 행에서이 작업을 수행하려고합니다.

어떤 도움이 정말 감사합니다, 가이드, 또는 전화 - 그래프 또는 그을음, 또는 다른 프로그램과 명령 집합이 정말 도움이 될 것입니다. 그것은 또한 그들의 설명서에 대한 그들의 짧은 튜토리얼 커밋 가치가있을 수 있습니다 검색 할 때 답변보다 더 많은 질문이 될 수 있습니다. 참고로

, 나는 현재 아래 매우 간단한 클래스를 시도하고있다 : 호출 그래프는 꽤 괜찮은 출력을 생성처럼

public class HelloWorld { 

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

답변

11

그것은 보이는 않습니다. PoC를 빨리 시작합시다.

콜 그래프 개발자가 제공 한 샘플 출력을 사용하겠습니다.

 
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 

사용할 수있는 그래프 렌더링 엔진이 여러 개 있습니다.가장 간단한 방법은 DOT입니다 (링크를 확인하십시오. 다른 좋은 도구가 나열되어 있습니다).

DOT을 사용하려면 데이터를 조금 변형해야합니다. ClassName : methodName을 유지하고 패키지를 건너 뛰고 싶다고 가정 해 봅시다.

그것은이다 아주 쉽게, 당신은 그렇게 할 어떤 도구를 사용할 수 있습니다,하지만 난 sed 사용합니다 :

 
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 렌더링 꽤 친절했다 : 여기

 
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 

가 생성되는 결과를 그 다음으로 :

enter image description here

모든 그래프는 초기 데이터에서 추출 : 당신이 원하는대로

enter image description here

는 조정할 수 렌더링, 유의하시기 바랍니다. DOT은 매우 유연한 도구 세트 인 graphviz의 일부입니다.

내 대답 뒤에 일반적인 생각이 :

  • 간단한 자동 변환을 얻기 위해 시간을 보내고 좋은 렌더링 솔루션을 찾을 수 추적을
  • 를 생성하는

    • 사용하는 적절한 도구는

    보기, canviz

    Canviz는 웹에 Graphviz 그래프를 그리기위한 JavaScript 라이브러리 브라우저 캔버스입니다. 보다 기술적으로 Canviz는 JavaScript xdot 렌더러입니다. 대부분의 최신 브라우저에서 작동합니다.

    해피 코딩 :)

  • +0

    감사합니다 : 여기

    그들은 콜 그래프를 표시하는 예를 언급! 아직 시도하지는 않았지만 정확히 내가 겪은 것처럼 보입니다. 이 대답은 의심 할 여지없이 잘 설명 될 것이므로이 질문을 보는 미래의 사람들을 도울 것입니다. 많은 감사합니다. – ThePerson

    1

    도 WALA있다 : 그것은 이미 여러 호출 그래프 건물 전략을 지원하고 http://wala.sourceforge.net/wiki/index.php/Main_Page

    DOT과의 통합이 있습니다. 처음 시작하기 가이드를 따르는 경우에는 이미 콜 그래프를 시각적으로 표시하는 여러 예제 프로그램이 이미 포함되어 있습니다. 사용자 목록도 상당히지지가됩니다.

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

    관련 문제