컨텐츠 바로가기

Doxygen과 graphviz를 이용한 call graph 생성

http://wlan.egloos.com/10805691

1. 서론

세상에는 다양한 소스분석 도구(툴)들이 존재합니다. gprof같은 프로그램은 실행화일을 실행시키면서 수행과정 중에 거쳐가는 함수들의 목록을 얻을 수 있고, doxygen과 같은 static call graph생성 도구는 가능한 모든 수행 경로를 분석하여 그래프를 그려줍니다[1].
KLDP에도 소스분석에 대한 여러 의견들을 볼 수 있는데요. 어떤 분은 vi와 ctags의 조합으로도 소스 분석을 훌륭하게 할 수 있다고도 하고, source navigator나 source insight같은 GUI 환경이 좋다고도 합니다[2]. [2]는 2000/2001년에 걸쳐 작성된 글이지만, 많은 시사점을 제시해 주는 것 같습니다.
고스톱 오픈 프로젝트[3]를 진행하면서 좋은 레퍼런스를 찾던 중에 PokerTH[5]라는 네트워크 게임과 깔끔한 UI를 지원하는 포커 오픈 소스 게임을 찾게 되었고, 이걸 분석하면 고스톱 개발에 많은 도움이 될 것 같다는 생각이 들더군요. 하지만, 방대한 소스의 양과 한번도 사용해 본적이 없는 STL 기반의 boost 라이브러리를 빈번하게 사용하는 코드는 저를 단 번에 질리게 만들더라구요. 그래서, 위에 언급한 소스분석 도구에 대해 공부하게 된 것이지요.
구글링을 통한 조사 끝에 doxygen과 graphviz를 이용해서 소스코드를 분석해 보기로 결심하였고, 그 결과를 이 글을 통해 여러분과 공유하고자 합니다. 많은 분들이 doxygen의 사용법에 대해 글을 올려주셨지만[4], 저같은 초보자도 한 번에 성공할 수 있는 문서를 만들어 보고자 합니다.

서론이 길었습니다만, Doxygen은 소스코드를 가지고 문서를 만들어 주는 툴입니다. graphviz를 이용하면 부가적으로 class의 상속관계나 함수 호출 경로를 분석할 수 있습니다. 아쉽게도 저는 main에서 시작하는 전체 호출 구조를 얻는 방법은 아직 찾지 못했습니다. C++로 작성된 코드라서 그런 걸까요?


2. Doxygen과 graphviz설치


제 OS는 ubuntu 11.04이고요. doxygen과 graphviz는 Ubuntu Software Center를 통해 설치했습니다. 너무 쉽습니다.
마치 스마트 폰을 사용하듯이... 다른 OS를 사용하시는 분은 별도로 설치방법을 찾아주세요.. 죄송..


3. PokerTH 소스에 대한 문서와 call graph 생성하기

PokerTH의 소스는 [5]에서 받았습니다. 우선 다운 받은 PokerTH를 풀고 src 폴더로 이동하고 아래와 같이 입력합니다.

src $ doxygen -g pokerth.doxy

"pokerth.doxy"는 임의의 화일 이름을 지정해 주시면 됩니다.
이것은 src 폴더를 어떻게 문서로 만들 것인지를 정의해 주는 설정화일입니다. 기본으로 생성되는 화일은 거의 아무런 정보도 주지 않는 아주 보수적인 설정으로 되어 있습니다.
소스코드를 분석하는 사람의 입장에서는 문서를 만드는데 시간이 오래 걸리더라도 가능한 많은 정보를 보고 싶어하기 때문에 주석을 읽어보시면서 가능한 많은 정보를 볼 수 있도록 설정을 수정해 주셔야 합니다.

PROJECT_NAME           = PokerTH
PROJECT_NUMBER         = 0.1
OUTPUT_DIRECTORY       = ./doxygen
CREATE_SUBDIRS         = YES
MULTILINE_CPP_IS_BRIEF = YES
EXTRACT_ALL            = YES
EXTRACT_PRIVATE        = YES
EXTRACT_STATIC         = YES
RECURSIVE              = YES
SOURCE_BROWSER         = YES
GENERATE_TREEVIEW      = YES
HAVE_DOT               = YES
UML_LOOK               = YES
CALL_GRAPH             = YES
CALLER_GRAPH           = YES
DOT_PATH               = /usr/bin/dot
DOT_GRAPH_MAX_NODES    = 100

위 내용을 myconfig 라는 이름으로 저장하시고 아래 스크립트를 실행하시면 해당 내용이 설정화일(pokerth.doxy)에 적용됩니다.

cat myconfig |
while read a; do
  key=`echo $a | awk '{print $1}'`
  sed -i -e "/^$key/ c\
    $a" pokerth.doxy
done


이후

src $ doxygen pokerth.doxy

를 실행하시면 OUTPUT_DIRECTORY로 지정한 ./doxygen 아래에 html과 latex 두 폴더가 생기며 그 아래에 문서들이 들어갑니다.



4. 결론

아직 이걸로 본격적인 소스코드 분석에 들어가지 않아 doxygen과 graphviz이 생성해 준 문서의 유효성에 대해서는 말씀을 못드리겠습니다만, 대충 훑어보면 비주얼이 괜찮습니다. 다음에는 gprof를 사용해 보고 글을 올려볼 계획입니다.

[1] http://en.wikipedia.org/wiki/Call_graph
[2] 소스코드 분석에 왕도는 있다?, http://kldp.org/node/67385
[3] http://code.google.com/p/opengostop/
[4] Doxygen + Graphviz + DoxyComment 소스코드 문서화, http://blog.pages.kr/367
[5] http://www.pokerth.net/

트랙백

덧글|덧글 쓰기|신고