본문 바로가기

Linux

cscope

출처 :  http://chaotic21c.egloos.com/9741409 


ctags와 더불어 vim을 아주 강력하게 만들어 주는 프로그램이다..^^

ctags만으로는 local variable이나 global variable들이 사용된 곳,
또는 함수가 사용된 곳은 찾기 힘들단다.. 요럴때 사용하기 위한 놈...

현재 시스템에서 사용할 수 있는 지 없는지 확인은..
$vim --version
해서 나오는 내용 중에 '+ cscope' 가 있으면 사용가능..
'- cscope'로 나오면..vim을 다시 빌드해야 한다...ㅡㅡ;;

난 아무짓도 안 했는데도 +로 나온거보면 디폴트인가부다...^^;

암튼...

우선 소스의 상위 디렉토리에서 사용할 파일들의 path 파일을 만들어줘야 한다.
$find . \( -name '*.c' -o -name '*.h' \) -print > cscope.files
$cscope -i cscope.files
까지 마치면 cscope.out이라는 심볼 데이터베이스 파일을 생성한다.

이를 사용하기 위해 .vimrc에 아래 내용을 추가하자..
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb

if filereadable ("./cscope.out")
    cs add cscope.out
else
    cs add [디폴트로 사용할 cscope.out의 path]
endif
set csverb

이제 vim에서 :cs find 커맨드로 심볼을 찾아보자~~ ^^*


출처 : http://blog.naver.com/ikariksj/140024963956

1. ctags 란 ? 
   = >  ctags는 프로그래밍 소스 코드의 태그 (전역변수 선언, 함수 정의, 메크로 정의)들의
          데이터 베이스(tags파일)을 생성하는 명령어입니다. 
          커널 소스 분석등 작업에서 탁월한 성능을 발휘합니다

2. ctags 버전 확인하기

    = > (쉘에서)  $ctags --version 이라고 입력한다 설치 돼어 있는경우 버전 정보가 나옵니다
    cannat commond find  => 깔려 있지 않을시 에러 출력 
    ( 대부분 기본리눅스에서 디폴트로 깔려 있지 않을것이다 처음 설치시 전체 설치 또는..
      선택 설치로 ctags를 설치 한경우라면 몰라도 디폴트로는 거의 안깔려 있습니다.
      특히 ubuntu 의 경우 원래 데스크탑용으로 개발 돼고 있어서.. 개발 툴이 하나도 안깔려 있기
      때문에 별또 설치를 필요로 합니다 ) 

3. ctags 설치하기 
    => ubuntu 의 경우 레드헷 이나 페도라 등 다른 리눅스에 비해 비교적 쉽게 설치할수 있습니다
        레드헷일 경우 rpm 버전을 따로 다운 받아 설치 해야 하는 방면 데비안 계열 명령어
        apt-get으로 간편하게 설치가 가능합니다

    ubuntu 설치 하기
       (쉘에서) $apt-get install  ctags  (자동으로 최신 버전으로 설치 됩니다 )

    redhat 설치하기 http://sourceforge.net/projects/ctags (rpm 버전을 다운 받은후) 
        (쉘에서) $rpm -ivf 다운받은 rpm 파일명 (으로 설치 하실수 있습니다)

    설치 완료 후 2번 과정 버전을 확인 하면 버전 정보가 재대로 나오면 재대로 설치가 되었습니다.
    레드헷 일 경우 lib.so 에러가 발생할수 있는데 버전이 안맞는 것을 깔면.. 설치가 재대로
    돼지 않는 문제점이 발생합니다 위 링크에서 최신버전 5.6.1 의 경우 페도라 5 용 이므로
    레드헷일 경우 5.0 버전 이나 찾아보시고 하위 지원 돼는 버전을 설치 해야 합니다..
    확인 결과 5.0.1 은 재대로 설치가 가능하더라고요.. 

4. tags 파일 만들기
    = > 우선 커널이 있는 폴더로 이동 합니다
           $cd /usr/src/linux/  <== ( 전 linux로 심볼릭 링크가 돼어 있습니다 안돼어 있다면
           심볼릭 링크를 만드셔도 돼고 직접 경로를 다 입력 하셔도 상관없습니다)
           심볼릭 링크 만들기 -> ln -s  /usr/src/커널폴더명 linux
           커널 폴더로 이동했으면 ctags -R 을 입력하여 tags 파일을 생성합니다
           시간이 좀 걸리는데 ls로  tags 파일이 생성 된걸 확인 합니다

          $cd /usr/include 폴더로 이동 합니다
           마찬가지로 ctags -R 명령으로 include 폴더도 tags 파일을 생성 합니다
           정상적으로 파일이 생성 되었다면 다음 단계로 넘어갑니다

5. ctags 설정 하기
    = > 설치 가 완료 되고 tags파일이 생성 되었다면 작업이 거의 끝난거나 마찬 가지 입니다.
           매번 vi 에서 ex모드 에서 입력하는거도 한계가 있으므로 .vimrc 파일에 
           tags 를 설정 해두는게 편합니다
           vimrc 파일에 다음 라인을 입력 한후 저장합니다
           set tags=./tags,/usr/src/linux/tags,/usr/include/tags
           (linux 의 경우 심볼릭 링크 한경우)  직접 폴더를 입력 하신분은 경롱에 맞게 설정 합니다


사용하기           
=====================================================
여기 까지 했다면 설치 및 설정은 완료 되었습니다..

이제 사용 하는거만 남았는데 
복잡하게 책에는 여러 옵션이 많지만 보통 잘안쓰는 옵션들은.. 거의 쓸일이 없고..
자주 쓰는 것만 다루겠습니다.

ex 모드 -> vi 에서 : 을 눌러서 명령을 입력 하는 모드를 말합니다 
ex 모드에서 :tj 함수명 이나 구조체명 (왜 tj 인가 ?  tags jump 약어)
(찾고자 하는 함수명이나 구조체 이름등을 입력 하면 관력 이름 함수나 구조제..정보가 나타 납니다 )
보통 한두가개 아닌경우 스페이스바를 누르면 목록이 더나오며 d 를 누를 경우 한페이지씩..
보여 줍니다 나갈때는 q로 나갈수 있습니다 그럼 <CR> 이 나오는데 여기서 찾은 함수나 구조체
번호를 입력 하면 자동으로 점프합니다

다른 방법으로 가는 방법은 커널 소스를 vi열어서 분석하다가 함수 원형이나 구조체 이름에서
ctrl + ] 를 누르면 자동으로 태그를 찾아 갑니다 
이전으로 다시 돌아 올때는 ctrl + t 를 사용 해서 돌아 올수 있습니다 

ex모드 : sts 함수명 , 구조체명 
위에서 설명한 tj와 비슷 하지만 한가지 다른점이 수평창분활을 해서 결과를 보여 줍니다

이외 명령이 더 있지만 실제 이거만 알아도 충분 합니다 나머지 이전으로 돌아가기 이런건..
거의 실제 사용 되지도 않습니다 위에 설명한 4가지 방법이 주로 쓰는 방법입니다.

 

[tip] 헤더 파일 바로 읽어 오기

#include <linux/kernel.h> <- 헤더파일 이름에 커서를 위치 한후

Ctrl + wf 를 누르면 창이 수평 분할되어 헤더파일이 열립니다


====================================================



cscope 를 이용한 2%로 채우기
    ctags만으로도 커널소스와 소규모 프로젝트롤 분석하는데 부족함은 없지만..
    2%로 부족한게 있다 ctags만으로는 지역변수나 전역변수가 사용된곳 은 찾기가 힘들다 
    이때 cscope 사용하면 됩니다

cscope 설치 하기 
    ubuntu = > $apt-get install cscope 로 간단히 설치 할수 있다 (데비안 계열의 강점)
    redhat 
    (다운 로드)
    wget http://belnet.dl.sourceforge.net/sourceforge/cscope/cscope-15.3-1.i386.rpm 
    설치 하기
    $rpm -ivf cscope-15.3-1.i386.rpm

cscope 설정 하기
   
cscope 설정은 좀 손이 많이 갑니다 (ctags에 비해...)
    우선 mkcscope.sh 파일을 만들어야 합니다 
   ============ mkcscope.sh 파일 내용 ================
    #!/bin/sh
    rm -rf cscope.files cscope.files

    find . \( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name
 '*.S' \) -print > cscope.files

    cscope -i cscope.files
    ============================================
    파일 생성 후 파일 퍼미션 설정
    $chmod 755 mkcscope.sh
    $mv mkcscope.sh /usr/bin
    디렉토리 이동 
    
$cd /usr/src/linux (심볼릭 링크 아닐시 전체 경로)
    mkcscope.sh 실행  하면 빌드 돼면서 데이터가 만들어 집니다 
    빌드 종료시 값을 입력 하는게 나오는데 ctrl + d를 눌러서 종료 합니다.
    
    이후 .vimrc 파일에 다음 내용을 추가 합니다 
    =============================================
    set csprg=/usr/bin/cscope
    set csto=0(숫자 0)
    set cst
    set nocsverb

    if filereadable("./cscope.out")
       cs add cscope.out
    else 
       cs add /usr/src/linux/cscope.out
    endif
    set csverb
   ==============================================
   이제  설정은 끝이 났습니다 

   사용하기 ( cscope 의 명령 형식 )
    :cs find {질의종류} {심벌}
    ex) cs find s start_kernel

   
cscope 의 질의 종류
    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


cscope 를 활용 함으로써 더 완벽히 커널소스를 분석할수 있지만 ctags 만 사용하는거 보다
cscope 를 같이 사용 하니까 찾는데 시간이 더 오래 걸리는거 같네요..
.vimrc 파일에서 cscope 세팅 부분을 주석으로 해두고 사용하다가..
더 깊게 찾을 필요가 있을때 사용 하는게 더 편할듯 싶은데..
그냥 설정 된 체로 ctrl + ] 를 남발하면  ctags만 있을때는 더이상 찾을게 없으면
그냥 위치에서 멈처 있는데 cscope 가 세팅 돼어 있다면 계속 해서  파일을 검색해서
검색하는데 시간이 좀 걸려서..^^;; 거슬릴때가 있네요.. 

정리 할겸 만들어 봤는데 생각보다 시간이 오래 걸리는듯.. 
해보시고 안돼는거 있으면 댓글 달아 주세요..


기존 내용에서 추가 된 부분입니다..

Tlist 내용이 빠져서 다시 수정합니다..

뭐 크게 달라지는 내용은 없고요.. Tlist 가 먼지 모르는 분도 있을테니까요..

간단하게 Tlist 를 설명하지면 TagList 약자로써.. 이름에서 설명하는거 처럼..

해당 파일의 정의된 함수명,변수(#define), 등을 이름으로 효율적으로 보여주는 유틸리티 입니다.

ctag & cscope 와 연동해서 사용하면 무척 효율적이죠..

말로 설명하는게 감이 안오시는분은.. Visual C++에서요 Cpp 확장자로 작업하시면..

클레스 별로.. 함수 이름이 나와서 관리 할수 있잖아요.. 그거랑 똑같다고 보시면 돼요..

관련 문서는 인터넷에서 검색하면 쉽게 찾을수 있고요..

못찾겠다 싶은 분들은 제 게시판에 잘설명된게 있어서 퍼와서 올려 뒀어요.. 참고하세요..^^

http://blog.naver.com/ikariksj/140026617491

출처 : 
http://sosal.tistory.com/11 

~/.vimrc  :: ~는 사용자 home풀더. .vimrc 파일은 vim을 실행시킬때 자동으로 실행되는 파일입니다.
// .vimrc 내용 //

set tabstop=4     #  탭간격 4칸
set shiftwidth=2    #  >>나 <<사용시 들여쓰기 간격
set expandtab      # tab 문자를 공백문자로 변환
set softtabstop=2    # tab 간격을 공백으로 변환하면, 삭제시 두칸단위로 삭제
set visualbell     # 경고 비프음 대신 한번 번쩍이는 비쥬얼 벨로 경고 사용
set nobackup     # 백업 파일을 생성하지 않습니다.
set cindent        # c언어 스타일의 들여쓰기 사용
set autoident      # 자동 적인 들여쓰기 사용
set smartindent    # 좀 더 지능적인 들여쓰기 사용
set enc-euc-kr    # 인코딩 한글로 지정. 한글 삭제시 한글 단위로 삭제(2byte)
set incsearch      # 키워드를 입력할때마다 검색하는 점진검색 사용
syntax on        # 파일 종류에 따라 구문 강조
set background=dark  # 배경을 어두운 색으로 지정
colorscheme evening # VI 색상 테마를 evening으로 지정
set backspace=eol,start,indent # 줄의 끝, 시작, 들여쓰기에서 백스페이시 이전 줄과 연결
set history=1000     # VI 편집기록 1000 개 저장
set hlsearch     # 검색어 강조
set ignorecase    # 검색, 편집, 치환 시에 대소문자 구분 않는다.
set showmatch    # (),{}에서 닫는 괄호를 입력할때, 일치하는 괄호 보여줌

사실 위 내용에서 상당수는 putty에서 자동으로 인식하여 실행해줍니다.
.~rc 라는 파일을 잘 이용해 주시면 좀더 멋진 쉘 환경을 만들 수 있겠네요

==============================  ctags  ==============================

ctags :: 함수, 변수, 구조체 등 소스의 위치를 쉽게 찾고, 이동할 수 있는 리눅스 유틸

cC언어 소스 코드의 함수, 구조체 등을 tag 로 구성하는데, tag는
함수, 구조체 등의 정보들이 어떤 파일에 몇번째 줄에 있는지.. 와 같은 정보를
담고있는 데이터 베이를 담고있습니다.

설치 ::
apt-get install ctag // 데비안 리눅스..
rpm -ivh ctags*      // 레드햇 계열..
yum install ctags*  // CentOS, 페도라 등..

리눅스 커널 소스가 있는 디렉터리로 이동..
/usr/src/linux-2.6.14.6]# ctags -R   // -R옵션 :: 하위 디렉터리까지 검색
                    // ctags 를 이용한 커널 소스 검색
/usr/src/linux-2.6.14.6]# make tags // ctags -R 대신에 커널 소스 태그 생성 가능

-> 결과물 ::

-rw-rw-r--  1 sosal sosal 45196899  9월 29 18:47 tags

-- 태그 검색을 통한 vi 시작
struct task_struct가 있는 곳부터 vi를 실행시키자! 
/usr/src/linux-2.6.14.6]# vi -t task_struct // 반드시 tags 파일이 있는곳에서 실행
   


task_struct 구조체 안에 보니,  mm_struct가 있네요.
mm_struct가 어떻게 정의되어있는지 궁금하다면, 커서를 mm_struct로 이동한후
ctrl + ] (== ^]) 를 입력하면, tags 파일에서 해당 태그 정보를 찾아
해당 파일로 이동합니다.
뒤로 갈때는 ctrl + t (==^T) 를 입력하면 됩니다.
커널 코드에 대해서는 천천히 블로깅 할테니, 당황할 필요 없을꺼에요.

명령모드에서 태그로 이동하고 싶다면,
:ta task_struct   (== :tag task_struct)

ta는 태그db 에서 첫 번째로 검색된 결과로 이동하기 때문에,
원하는 것과 다른 결과를 얻을 수 있습니다.
두번쨰 검색 결과로 갈때는 
:tn ("tn는 tag next 의미")로 다음 검색 결과로 이동하고,
:tp ("tp는 tag previous ")로 다시 돌아갈 수 있습니다.

:ta [name] 명령어 대신에 :ts [name] 를 이용한다면, (ts는 " tag select ")
원하는 검색 결과를 한눈에 보고, 결과들 중 원하는 것을 선택할 수 있게 됩니다.

==== :ts schedule 입력시 모습 ====
==== :ts schedule 입력시 모습 ====
CPU 시간을 프로세스에게 할당하는 schedule을 관리하는 함수
schedule()는 4번임을 목록으로 확인할 수 있습니다.
4를 입력하고 Enter 를 치면, schedule()로 이동합니다..

== 간단한 ctags 명령어 목록 ==
:ta [name] :: name과 일치하는 태그 위치로 이동
ctrl + ]       :: 커서가 위치하고 있는 함수나 구조체의 정의로 이동
ctrl + t        :: 이전 위치로 돌아오기
:ts [name] :: name과 일치하는 태그 목록 출력
:ta /[name]:: name과 일치하는 태그 목록 출력
:tj [name]  :: 목록이 한개인 경우 이동, 여러개인 경우 목록 출력
:tn             :: 다음 태그로 이동 (tag next)
:tp             :: 이전 태그로 이동 (tag previous)
:tags         :: 이동한 태그 히스토리 목록 출력 
==============================

커널 소스에 대해 ctags를 이용하려면, 소스가 있는 위치.
(저에게는 /usr/src/linux-2.6.14.6) 로 이동해서 vi를 실행해야 하는 불편이 있는데,
어디서든지 (vi -t [name])을 입력하여 커널 소스를 볼 수 있게 하고 싶다면,
~/.vimrc 설정 파일의 내용을 추가해줍니다.

set tags+=/usr/src/linux-2.6.14.6/tags


cgtags 태그 데이터베이스를 이진검색으로 하기. .vimrc에

set tagbsearch

를 추가해 주시면, 검색 속도를 개선할 수 있습니다.
==============================  cscope  ==============================
ctags로 보는 코드들의 정의만으로는 알기 힘든 사용법들 (커널 안에서 활용법)을
알려 주는 도구. cscope입니다.

UNIX 환경에서 매우 비싼 코드 분석도구 Scope가 있는데,
이를 오픈소스로 구현해서 공개한 것이 cscope 입니다.

apt-get install cscope // 데비안 리눅스..
rpm -ivh cscope*      // 레드햇 계열..
yum install cscope*  // CentOS, 페도라 등..

cscope에서 데이터베이스를 구축할 파일 목록을 먼저 만들어야합니다.
데이터베이스 구축을 위한 파일명언 cscope.files 입니다.

/usr/src/linux-2.6.14.6]# find ./ -name *.[chS] -print > cscope.files

[cscope]를 실행합니다.

cscope는 두부분으로 나뉩니다. 윗부분은 결과물, 아랫부분은 검색부분입니다.
각 부분은 [tab] 키로 이동할 수 있습니다.

Find this C symbol: ctags와 마찬가지로 C심볼을 찾습니다. (변수, 함수, 매크로, 구조체 등)

Find this global definition: 전역 선언만 검색합니다.

Find functions called by this function: 한 함수에 의해 호출되는 또다른 함수들을 찾습니다.

Find functions calling this function: 한 함수를 호출하는 모든 함수를 찾습니다.
함수의 쓰임새나 어떤 경우에 호출되는지 알고 싶은 경우 유용하게 사용됩니다.

Find this text string: 텍스트 문자열을 검색

Change this text string: 문자열 검색하여 변경. (자신의 소스코드 수정 이외엔 잘 쓰이지 않습니다.)

Find this egrep pattern: 정규식을 이용하여 소스코드 검색.
예를 들어, 커널 내부에는 다양한 등록함수들이 있는데, 이들 함수를 모두 찾아내고 싶다면
[register_\w+]와 같이 입력하면 됩니다.

Find this file: 특정 이름을 포함한 파일을 모두 검색합니다.

Find files #including this file: 특정 헤더파일을 포함시키는 모든 소스코드 찾기.

Find all function definitions: 함수의 정의를 검색합니다.

======================  Vi , cscope의 연동  ======================
vi에서 cscope를 사용하기 위해서는 cscope 데이터베이스를 연결해야 합니다.
vi에서 [:cs add /usr/src/linux-2.6.14.6/cscope.out ] 를 실행해서 추가합니다.
cscope 데이터베이스 연결은 여러 개를 할 수 있는데, [:cs show] 로 확인할 수 있습니다.
연결된 데이터 베이스를 종료하려면 [:cs kill 0] 

:cs show :: 데이터베이스 확인
:cs help   // cscope 도움말 
검색 유형 설명 
 0 or s  C 심볼을 검색합니다.
 1 or g  정의를 검색합니다.
 2 or d  이 함수에 의해 호출되는 함수들을 검색합니다.
 3 or c  이 함수를 호출하는 함수들을 검색합니다.
 4 or t  텍스트 문자열을 검색합니다.
 5 or e  확장 정규식을 사용해서 검색합니다.
 
 7 or f  파일 이름을 검색합니다.
 8 or i  이 파일을 인클루드 하는 파일을 검색합니다.

위 표는 책을 참조했는데, 6번 칸이 없더라구요.. 찾아봐야겠습니다 ㅠ

:cs find 0 task_struct // C심볼 task_struct를 검색합니다.
cscope 의 검색 결과를 볼 수 있습니다.
space bar로 다음페이지를 볼 수 있고, 해당 번호를 입력하여 소스 코드로 이동할 수 있습니다.
:ta 또는 :tag 명령도 cscope를 이용하게 설정할 수 있습니다.
.vimrc에서 set cst 를 추가하세요. // 사용하지 않으려면 set nocst 

 

'Linux' 카테고리의 다른 글

[Kernel Config] Kconfig 명령  (0) 2012.02.17
vi vim 단축키  (0) 2012.02.01
[Linux] 디렉토리나, 파일 개수 세기  (0) 2012.01.31
find 활용  (0) 2012.01.05
LWN.net Ftrace Articles by Steven Rostedt  (0) 2011.11.17