2012년 5월 17일 목요일

cscope 사용법

출처 : http://holuyaa.com/holu/55

1. 설치
~$ sudo apt-get install cscope

2. Kernel 분석을 위한 Symbol 생성 - 1
~$ pwd
~/linux-2.6.32.2

~$ make cscope

3. Kernel 분석을 위한 Symbol 생성 - 2
~$ pwd
~/linux-2.6.32.2

~$ cscope -R -b
    - -R은 Recursive 하게 하위 디렉토리까지 Symbol 생성을 한다는 의미
    - -b는 cscope GUI 실행하지 않고 Symbol 생성 하기
하지만 이 방법은 모든 파일을 Parsing 하기 때문에 불필요한 것까지 Parsing 이 된다. 그래서 보통 다음과 같은 
shell script를 생성하여 실행시켜준다.

#!/bin/bash
LNX=.
cd /  
find  $LNX                                                                            \
-path "$LNX/arch/*" ! -path "$LNX/arch/x86*" -prune -o               \
-path "$LNX/include/asm-*" ! -path "$LNX/include/asm-x86*" -prune -o       \
-path "$LNX/tmp*" -prune -o                                                       \
-path "$LNX/Documentation*" -prune -o                                            \
-path "$LNX/scripts*" -prune -o                                                   \
-path "$LNX/drivers*" -prune -o                                                   \
-name "*.[chxsS]" -print >$LNX/cscope.files
~$ pwd
~/linux-2.6.36.2

~$ ./cscope_script
~$ ls cscope.files
cscope.files

~$ cscope -b -q -k
    - -b cscope GUI 실행시키지 않고 Symbol 생성하기
    - -q 역순서 인덱스를 생성. 큰 프로젝트에서는 역순서 인덱스가 검색을 빠르게 함
    - -k 커널모드 설정. #include 로 들어간 모든 헤더파일들을 /usr/include 에서 찾지 않도록 함(이것은 주로 여기서 우리가 하는 것처럼 운영 체제 또는 C 라이브러리 소스 코드에 대해서 cscope를 사용하고 있을 때 주로 유용)

4. cscope 단독 사용법
~$ cscope -d
    -  cscope.out 파일이 존재하는 곳에서 실행시켜야 함
    -  화면은 크게 상단과 하단 두 부분으로 나뉘고 이동은 tab key 로 이동한다.
    - 상단은 검색 결과를 보여주고 하단은 검색입력을 한다.
    - 상단의 검색 결과는 번호를 입력하여 해당 파일을 열거나 화살표로 이동하여 엔터키를 입력하여 파일을 열면 된다.(디폴트는 vi 로 해당 파일이 열린다.)
    - 하단의 검색 입력 부분은 화살표 혹은 엔터 키로 이동한다.
    - cscope GUI 를 끝낼 때는 ctrl+d 를 입력하면 된다.

다음은 하단의 검색입력에 대한 설명이다.
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 : 정규식을 이용해서 소스코드 검색
Find this file : 특정이름을 포함한 파일을 모두 검색
Find files #including this file : 특정헤더를 포함시키는 모든 소스코드를 검색

5. vi(vim, gvim)에서 cscope 사용법
vim command mode 에서

:cs [명령]
    - 명령
        help : 도움말
                 예제 : :cs help / :cs

        add : 새 데이타 베이스 더하기
                 사용법 : add file|dir [pre-path]  [flags]
                 예제 : :cs add ./cscope.out

       show : 연결 보여주기
                사용법 : show
                예제 : :cs show

        kill : 연결 끊기
                사용법 : kill # (#은 연결된 데이타베이스 번호로 show 를 통해 확인 가능)
                예제 : :cs kill 0

        reset : 모든 연결 초기화
                 사용법 : reset
                예제 : :cs reset

        find : Query for a pattern
                 사용법 : find c|d|e|f|g|i|s|t name
                             0 또는 s        C 심볼 검색
                             1 또는 g        전역 선언만 검색
                             2 또는 d        이 함수에 의해 호출되는 함수들 검색
                             3 또는 c        이 함수를 호출하는 함수들 검색
                             4 또는 t         텍스트 문자열을 검색
                             5 또는 e        확장 정규식을 사용하여 검색
                             7 또는 f         파일 이름을 검색
                             8 또는 i         이 파일을 인클루드하는 파일 검색
                 예제: :cs find s start_kernel

:cn     다음 태그
:cp     이전 태그

매번 vim command mode 에서 :cs find ???? 를 입력하는 것은 번거로운 일이다. 더구나 검색어가 긴 경우 일일히 타이핑한다는 것은 더더욱 번거롭다.
cscope_maps.vim > 을 다운 받아서 다음 경로에 저장하자.
~$ pwd
~/.vim/plugin

~$ ls cscope_maps.vim
cscope_maps.vim

vim 는 cscope.out 이 존재하는 커널 코드의 루트 디렉토리에서 실행시키는 게 좋다.
~$ pwd
~/linux-2.6.36.2

~$ vim init/main.c
검색하고자 하는 함수명에 커서를 이동시켜 놓은 후
<C-\>s :cs find s    
<C-\>g :cs find g
<C-\>c :cs find c
<C-\>t :cs find t
<C-\>e :cs find e
<C-\>f :cs find f
<C-\>i :cs find i
<C-\>d :cs find d

C는 ctrl key를 \은 백슬러시 key 를 의미한다.
즉 <C-\>는 ctrl+\ 와 같은 의미이다.
<C-\>s 는 ctrl+\입력후 바로 s를 입력하라는 의미이며 이는 :cs find s와 동일하게 동작한다.
검색어는 커서가 위치하는 단어가 검색어가 단다.

<C-@>s
<C-@>g
<C-@>c
<C-@>t
<C-@>e
<C-@>f
<C-@>i
<C-@>d
나 같은 경우 <C-@> 는 ctrl + 2(q와w 키 위에 있는 숫자키) 를 입력하면 동작한다.(왜 그렇지????)
<C-\> 대신에 <C-@> 는 화면을 상하로 분리해서 상단에 검색결과에서 선택한 파일이 나타난다.

<C-@><C-@>s
<C-@><C-@>g
<C-@><C-@>c
<C-@><C-@>t
<C-@><C-@>e
<C-@><C-@>f
<C-@><C-@>i
<C-@><C-@>d
이것은 ctrl key 를 누른 상태에서 빠르게 2를 두 번 누르고 ctrl key 를 떼면서 s 를 누르는 식이다.
이렇게 하면 위에서는 상하로 분리되던 창이 이번엔 좌우로 분리되어 좌측에 검색결과에서 선택한 파일이 나타난다.

창간 이동은 <C-w><C-w> 이다.

vim 환경 설정 파일에 다음과 같이 입력하면 vim 에서 ":tags" 라는 명령을 사용할 수 있다.
~$ vim ~/.vimrc

#다음 라인 추가
set cst

댓글 없음:

댓글 쓰기