FREEDOM. FRIENDS. FEATURES. FIRST.
페도라 한국 사용자 모임

소스 분석툴 ctags/cscope/kscope 이용방법

게시판 Tech/Tip 소스 분석툴 ctags/cscope/kscope 이용방법

  • This topic has 0개 답변, 1명 참여, and was last updated 10 years, 5 months 전에 by 인베인. This post has been viewed 20 times
  • 만든이
    게시글
  • #12151
    인베인
    참가자
    • 게시글141
    • 댓글379
    • 총합520
    • ★★
    @leemgs

     ★소스 분석 툴 ctags/cscope/kscope 이용
     =====================================
           2010.08.10

    ■ 1. Ctags와 Cscope란?

    ### ctags는 특정 키워드가 정의된 위치로 이동할 수 있다.
    ctags는 프로그래밍 소스 코드이 태그(전역변수 선언, 함수 정의, 매크로 선언)들의
    데이터베이스(tags파일)을 생성하는 유닉스 명령어이다.
    ctag는 관련 파일들에서 함수/변수/타입/구조체/매크로 등에 대한 tag를 기록해놓고
    쉽게 찾아가게 해줍니다.프로그래밍을 하다보면 특정 define 헤더 파일이 있을때 이
    헤더파일의 내용을 보고자 하는 경우가 있는데 ctag를 이용하면 상당히 편리하다.
    -지원언어: Assembler, AWK, ASP, BETA, Bourne/Korn/Z Shell, C, C++, C#,
              COBOL, Eiffel, Erlang, Fortran, Java, Lisp, Lua, Makefile,
              Pascal, Perl, PHP, PL/SQL, Python, REXX, Ruby, Scheme,
              S-Lang, SML (Standard ML), Tcl, Vera, Verilog, Vim, and YACC
    -지원 O S: UNIX, MSDOS, Windows 95/98/NT/2000/XP, OS/2, QNX, Amiga, QDOS,
              RISC OS, VMS, Macintosh
    - 지원 툴: VIM , UltraEdit , VmWorkX
    - VIM 명령어 =>  :tag   or   ^]

    ###  cscope는 대화식 C소스 분석 도구이다.
    ctags만으로는 지역변수나 전역변수가 사용된 곳 , 함수가 사용된 곳은 찾기 힘들다.
    이때는 cscope를 사용하면 된다.
    cscope는  cscope.out이라는 symbol 테이블을 작성하고
    이것을 이용하여 해당 키워드를 찾는다.

    ctags는 해당 키워드가 정의된 곳만 찾아가지만, cscope는 사용된 곳 모두를 찾을 수 있다.

    http://ctags.sourceforge.net/
    http://cscope.sourceforge.net/

    ■ 2. ctag에 대해
    2.1 리눅스 커널소스를 ctags로 분석 방법
    #> cd /usr/src/linux.2.6.32
    #> make tags  ----------> 소스 트리 DB(tags 파일)가 생성됨.
    #> cd /usr/src/linux.2.6.32
    #> vi ./include/linux/sched.h
       주의사항) vim으로 파일을 열때  tags파일이 있는 디렉토리에서 파일을 오픈해야함.
    #> vi  ~/.vimrc
    #단일지정 예제
    set tags=./tags
    #복수지정예제
    set tags=./tags,/usr/src/linux-2.x/tags,/usr/include/tags

    2.2 일반 프로그램소스를  cscope으로 분석 방법
    일반프로그램의 루트디렉토리에서 아래와 같이 명령을 실행하면 된다.
    #> ctags -R  .    

    2.3 ctag의 자주쓰는 명령어들
    가. 기본적인 명령어 모음
        . ctrl+] : 한단계 안쪽으로 들어감.
        . ctrl+t : 한단계 밖으로 나옴.
        . g]     : 커서에 있는 함수/변수 리스트로 보이기
        . po[p] : 현재 entry보다 count수 만큼 전의 entry로 이동 (예: 3po )
        . :[count]ta[g] : 현재 entry보다 count수 만큼 다음의 entry로 이동 (예: 2ta )
        . :tags         : 현재 tag stack을 보여주는 명령

    나. 추가적인 명령어 모음
        :tj keyword         찾고 싶은 keyword를 현재 cursor 위치에 놓을 수 없는 경우
        :ta keyword         찾고 싶은 keyword를 현재 cursor 위치에 놓을 수 없는 경우
        :sts[slect] ident   선택되는 것은 같으나 이동할때 윈도우가 나누어 짐.
        :tj[ump] ident      tselect와 같으나 하나만 매칭될경우 바로 이동.
        :stj[ump] ident     바로이동하면서 윈도우가 나누어 짐.
        :[count]tn[ext]     count만큼의 같은 matching을 가지는 곳으로 앞으로 이동.
        :[count]tp[revious] count만큼의 같은 matching을 가지는 곳으로 뒤로 이동.
        :tr[ewind]          처음 matching하는 곳으로 이동.
        :tl[ast]            마지막 matching하는 곳으로 이동.

    다. HELP 명령 사용방법
        :help tags
        :help g]
        :help :tjump
        :help :sts

    ■ 3. cscope에 대해
    3.1  리눅스 커널소스를 cscope으로 분석 방법
    #> cd /usr/src/linux.2.6.32
    #> make cscope  ----------> Cscope DB(cscope.files, cscope,out)가 생성됨.
    #> cd /usr/src/linux.2.6.32
    #> vi ./include/linux/sched.h
        : cs find s start_kernel

    3.2 일반 프로그램소스를  cscope으로 분석 방법
    #> find ./ -name '*.[chCHsSxX]' > cscope.files
    #> cscope -b

    3.3 대화식으로 분석방법

    대화식으로 실행하고자 한다면,  #> cscope -i cscope.files 실행한후
    대화식의 창이 나타나면,
    거기서 원하는 키워드에 대한 검색을 하고 해당 위치로 이동가능.
    (상당히 직관적이므로 그냥 보면 알 수 있다.)
    :set csprg=/usr/bin/cscope
    :set csto=0
    :set cst
    :set nocsverb
    :cs add cscsope.out

    cscope는 ctags와 다르게 db파일의 복수지정이 불가능하다.

    3.4 cscope 문법
    .작성문법 --> :cs find {querytype} {symbol}
    .작성예제 --> :cs find s                 start_kernel
    .querytype 정보
      0 or s : find this c symbol
      1 or g : find this definition
      2 or d : find functions called by this function
      3 or c : find functions calling this function
      4 or t : find assignments to
      6 or e : find this egrep pattern
      7 or f : find this file
      8 or i : find files #including this file

    ■ 4. cscope, ctags 를 하나로 묶어서 활용하기
    #> vi tagsconf.sh
    ----------------------------------------------------------------------
    #!/bin/sh
    ctags -R  .
    find ./ -name '*.[chCHsSxX]' > cscope.files
    cscope -b
    ----------------------------------------------------------------------

    ■ 5. 리눅스용 SourceInsight - KScope 활용방법  

    http://kscope.sf.net
    KScope의 소개에 보면 나온것 처럼 이 툴은 통합 IDE개발툴이 아니라 포커스가 소스 분석 및
    에디트에 특화된 툴이며, CScope의 KDE 툴이다.(기본으로 CScope를 사용한다)
    기능은 SourceInsight가 제공하는 기능 왠만한 건 다 제공한다.
    하지만 퀵뷰와 같은 해당 메소드나 자료형을 아래 탭형식 패널에 출력이 되는 기능은
    없다.
     
    * Kscope가 지원하는 기능
     - Get all references to a symbol
     - Find the definition of a symbol
     - Find all functions called by or calling to a function
     - Find an EGrep pattern
     - Find all files #including some file
     - etc.  

    * Kscope 소스 설치하기

    fc5#> gunzip kscope-VER.tar.gz
    fc5#> tar xvf kscope-VER.tar
    fc5#> ./configure
    fc5#> make
    fc5#> make install

    * Kscope 프로젝트 생성 방법
    fc5#> kscopeapp
    Project - Create Project - Deatails tab
    - Name : kernelname (cscope관련 파일이 생성될 디렉토리명)
    - Path : Kernel Source Directory (위의 Name 디렉토리명이 생성될 부모 디렉토리명)
    - Source Root(Optional): / (초기입력값 그대로 놔둠.)

    Options 탭을 클릭한후에 [X] Kernel project (-k) 을 체크하도록 한다.
    Create을 클릭한다.
    Project Files 창이 뜬다. Add List의 [Tree]을 선택하도록 한다.
    해당 커널 소스 디렉토리를  선택한다.
    "Would you like to add 19,503 files to your project?" 창이 뜨면 "Yes"을 클릭한다.
    창이 사라지고 다시 "Project Files"창이 뜨면 "OK"을 클릭한다.
    "Please wait while Kscope builds the database" 창이 뜨면서 **%가 완료되면,
    이제 Kscope를 사용하면 된다.

    이상.

    * 오픈소스는 Open Innovationa & 윈윈전략을 도모할 지언정 절대 공짜(무료)임을 뜻하지 않는다.치

  • 답변은 로그인 후 가능합니다.