Linux/Linux_technic

커널 분석기 Vi + ctags + cscope

sosal 2009. 10. 1. 14:19
반응형

vi.
~/.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 > Linux_technic' 카테고리의 다른 글

Object file - ELF 파일  (0) 2009.10.23
od - 바이너리 파일 덤프  (0) 2009.10.23
File - 파일종류 확인  (0) 2009.10.22
Boot loader - LILO와 GRUB  (0) 2009.09.27
01. Linux 기본 명령어, 권한  (1) 2009.09.26