ctags와 더불어 vim을 아주 강력하게 만들어 주는 프로그램이다..^^
ctags만으로는 local variable이나 global variable들이 사용된 곳,
또는 함수가 사용된 곳은 찾기 힘들단다.. 요럴때 사용하기 위한 놈...
현재 시스템에서 사용할 수 있는 지 없는지 확인은..
$vim --version |
'- cscope'로 나오면..vim을 다시 빌드해야 한다...ㅡㅡ;;
난 아무짓도 안 했는데도 +로 나온거보면 디폴트인가부다...^^;
암튼...
우선 소스의 상위 디렉토리에서 사용할 파일들의 path 파일을 만들어줘야 한다.
$find . \( -name '*.c' -o -name '*.h' \) -print > cscope.files $cscope -i cscope.files |
이를 사용하기 위해 .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 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 파일에서 해당 태그 정보를 찾아
해당 파일로 이동합니다.
커널 코드에 대해서는 천천히 블로깅 할테니, 당황할 필요 없을꺼에요.
명령모드에서 태그로 이동하고 싶다면,
: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 입력시 모습 ====
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 의 검색 결과를 볼 수 있습니다.
:ta 또는 :tag 명령도 cscope를 이용하게 설정할 수 있습니다.
.vimrc에서 set cst 를 추가하세요. // 사용하지 않으려면 set nocst
[출처] ctags & cscope 설치 및 사용 |작성자 쿠마
'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 |