리눅스 커널을 vi로 분석하기 위한 태크닉 기술


설정파일


vimrc


2019-01-08 version

vimrc




1. ctags + cscope 설치하기

apt-get install ctags -y
apt-get install cscope -y


TIP: 리눅스 커널의 경우 아키텍쳐를 설정하여 tag를 생성하게 할 수 있음.

스크립트 있는지 확인: "ls -al ./scripts/tags.sh"


2. vim + 플러그인 설치 및 설정하기


http://www.vim.org/scripts/index.php 에서 제공하는 Plugin을 다룬다.


vim 플러그인은 대부분 vundle이라는 plugin manager에 의해서 관리 된다.

이것으로 인해서 plugin 추가 설치 삭제 등이 매우 간편해 졌다.


vim 환경설정 파일만 있어도 필요한 플러그인을 자동으로 검색하여 설치해주기 때문에

작업 컴퓨터의 재구성이 매우 편해졌다.


vim과 git 설치


sudo apt-get install vim -y

sudo apt-get install git -y


디렉터리 생성

mkdir ~/.vim

mkdir ~/.vim/bundle


Plugin Manager Download (vundle)

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

# 영문 메뉴얼 사이트가서 매번 최신 link를 확인해 보는 것이 좋음 (2020.1.16일 업데이트 주소)


영문 메뉴얼 사이트: Click


Vundle 사용법 한글 블로그: Click


vi ~/.vimrc 내용 추가



set rtp+=~/.vim/bundle/Vundle.vim

call vundle#begin()


Plugin 'gmarik/Vundle.vim'

Plugin 'The-NERD-Tree' #계층 별로 파일을 보고 접근할 수 있다.

Plugin 'Source-Explorer-srcexpl.vim' 

Plugin 'SrcExpl' #커서가 지시하는 변수들의 정보를 보여줌

Plugin 'taglist.vim' #ctags를 사용하여 소스코드 파일에서 함수, 전역 변수 리스트를 확인할 수 있는 강력한 사이드바를 제공

Plugin 'AutoComplPop' #자동완성 플러긴

Plugin 'snipMate' #for, while과 같은 예약어를 입력할 경우 snip code를 자동으로 제공해 준다. ~/.vim/snippets 에 제공 기준이 있음.

call vundle#end()


 -- 자동완성과 관련된 코드 --
"========== AutoCompletePop ==========
function! InsertTabWrapper()
    let col=col('.')-1
    if !col||getline('.')[col-1]!~'\k'
        return "\<TAB>"
    else
        if pumvisible()
            return "\<C-N>"
        else
            return "\<C-N>\<C-P>"
        end 
    endif
endfunction

inoremap <TAB> <c-r>=InsertTabWrapper()<cr>
hi Pmenu ctermbg=blue
hi PmenuSel ctermbg=yellow ctermbg=black
hi PmenuSbar ctermbg=blue




vim에서 명령 모드 ":" 에서 아래 명령어를 수행

:PluginInstall

#BundleInstall에서 PluginInstall로 명령어가 변경됨.


하단에 Done이 출력 되면 설정한 모든 Plugin이 설치된 것이다.







□ ctags를 이용한 방법

 

ctags의 정의: ctags는 프로그래밍 소스코드에서 태그(전역변수 선언, 함수 정의, 매크로 선언)들의 데이터베이스(tags 파일)를 생성하는 유닉스 명령이다.

 

ctags에서 인식하는 파일 종류

Assembler, ASP, Awk, C, C++, BETA, Cobol, Eiffel, Fortran, Java, Lisp, Lua, Make, Pascal, Perl

PHP, PL/SQL, Python, REXX, Ruby, Scheme, Shell scripts( Bourne/Korn/Z ), S-Lang, Tcl

Vera, Verilog, Vim, VACC/Bison

 

vim에 tags 파일을 등록하는 방법

--단일 지정

:set tags=./tags

--복수 지정

:set tags=./tags,(콤마) 

//매번 해주어도 되고, vimrc에 등록을 해도 된다.

 

 

tj명령은 tag jump의 약자이다. 이 명령어를 실행하면 태크 데이터베이스

파일(tags)에서 start_kernel 태크를 찾아 리스트로 보여주게 된다.

 

:tj start_kernel


창을 분할 해서 오픈 한다.

 

:sts [태크]


스택에 넣었다가 빼면서 이동 한다.


컨트롤 + ] , 컨트롤 + t

 

[ctags 명령 요약]

:ta [태그] or Ctrl+] or :ts[태그] or :tj [태그] //[tag]가 정의된 위치를 나열하고 선택한 위치로 점프, 현재 위치는 스택에 push된다.

:po or Ctrl+t // 스택 top에 저장된 위치를 pop하고 그 위치로 점프

:sts [태그] or :stj [태그] // [태그]가 정의된 위치를 나열하고 선택한 위치로 창을 수평 분할해 새로 생성된 창에 표시

:tn // tj or ts로 점프 했을때 그 선택적으로 점프할 수 있는 목록이 많을 경우 다음 태그로 이동 한다.

:tp // tj or ts로 점프 했을때 그 선택적으로 점프할 수 있는 목록이 많을 경우 이전 태그로 이동 한다.

:tr // tj or ts로 점프 했을때 그 선택적으로 점프할 수 있는 목록이 많을 경우 처음 태그로 이동 한다.

:tl // tj or ts로 점프 했을때 그 선택적으로 점프할 수 있는 목록이 많을 경우 끝 태그로 이동 한다.

 

:pts [태그] // sts랑 매우 유사하지만 커서가 현재 창에 있다.

:ptj [태그] // 미리보기 윈도우에 태그가 정의된 형식을 보여줌. ( 그닥 차이를 못느끼겠다.)

:ptn // ptj나 pts로 점프했을 때 다음 태그로 점프

:ptp // ptj나 pts로 점프했을 때 이전 태그로 점프

:ptr // ptj나 pts로 점프햇을 때 처음 태그로 점프

:ptl // ptj나 pts로 점프했을 때 마지막 태그로 점프

 

 

vim 내장 스크립트 작성

 

홈 디렉터리의 .vimrc 파일을 열어 다음과 같은 행을 추가한다.

 "ctags macro setting
 if version >= 500 // vim 버전이 5.0 이상일 때만 적용하게 만들 었다.
 func! Sts()
       let st = expand("<cword>") // let을 이용해서 st라는 변수를 생성 한다.
          exe "sts ".st // exe를 이용해서 뒤에나온 명령어를 출력 한다. .st를 출력한다.
 endfunc
 nmap ,st :call Sts()<cr> // ,st와 Sts()함수를 매핑 하였다. 
 
 func! Tj()
       let tj = expand("<cword>")
          exe "tj ".tj
 endfunc
 nmap ,tj :call Tj()<cr>
 endif

 


□ CSCOPE를 사용하는 것 

 

ctags로 찾을 수 있는 C, C++ 태그 종류

classes

macro definitions (and # undef names)

enumerators

function definitions

enumeration names

class, struct, or union members

namespaces

function prototypes and declarations [off]

structure names

typedefs

union names

vriable definitions

extern and forward variable declarations [off]

 

위와 같은 종류로는 결국 지역변수나 전역변수가 사용된 곳이나 함수가 사용된 곳을 찾기 힘들다.

 

ctags가 단지 vim이 사용하는 태그 데이터베이스만 만드는 프로그램임에 비해 cscope는 원래부터 C소스를 분석하기 위해 만들어졌다. 그래서 cscope는 vim 없이 자체적으로 동작 가능하며, C 소스를 분석할 때 유용하게 사용할 수 있다.

 

cscope로 분석 가능한 소스 파일에는

Assembly, C, C++, Lex, Yacc등이 있다.

 

이 cscope 또한 심볼 데이터베이스 파일을 만들어야 한다.

 

이것을 매번 입력하기 힘드니 스크립트 파일을 만든다.

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/local/bin

 

스크립트 파일을 언제든지 실행 할수 있게 해준다.

 

이제 mkcscope.sh를 실행하면 database를 생성하게 된다.

그 다음 Ctrl+d를 이용해서 빠져 나간다.

 

이제 앞으로 cscope를 사용할 것이라고 vim에게 알려주어야 한다.

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

set csprg=/usr/bin/cscope

set csto=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

 

 

vim에 스크립트를 등록하자.

 65 func! Css()
 66       let css = expand("<cword>")
 67          new
 68             exe "cs find s ".css
 69                if getline(1) == ""
 70                      exe "q!"
 71                         endif
 72                         endfunc
 73                         nmap ,css :call Css()<cr>
 74
 75                         func! Csc()
 76       let csc = expand("<cword>")
 77          new
 78             exe "cs find c ".csc
 79                if getline(1) == ""
 80                      exe "q!"
 81                         endif
 82                         endfunc
 83                         nmap ,csc :call Csc()<cr>
 84
 85                         func! Csd()
 86       let csd = expand("<cword>")
 87          new
 88             exe "cs find d ".csd
 89                if getline(1) == ""
 90                      exe "q!"
 91                         endif
 92                         endfunc
 93                         nmap ,csd :call Csd()<cr>
 94
 95                         func! Csg()
 96       let csg = expand("<cword>")
 97          new
 98             exe "cs find g ".csg
 99                if getline(1) == ""
100                      exe "q!"
101                         endif
102                         endfunc
103                         nmap ,csg :call Csg()<cr>

 

이렇게 ctags와 cscope를 2개 동시에 사용하면 된다.

일단은 그냥 ctags만 쓰다가 ctags가 찾지 못할 때만 cscope를 쓰자. 왜냐하면 cscope가 더 느리기 때문이다.

즉, 함수나 변수가 사용된 곳을 찾을 때와 같은 경우에만 cscope를 사용하자.

□ vim과 조합하는 기타 기능.

 

http://www.vim.rog/scripts 사이트에서 taglist.vim 스크립트를 받아와 ~/.vim/plugin 디렉토리에 설치한다.


그 다음 명령모드에서 :Tlist를 해보면 스크린샷과 같은 편리한 기능이 나오는것을 볼 수 있다.





vim의 유용한 단축키들


자동완성 기능

Ctrl+p //위로 검색해서 자동완성

Ctrl+n //아래로 검색해서 자동완성

 

해더파일 바로 읽어오기

Ctrl + wf

 

빠른 괄호 탐색 기능

{ }의 부분에서 % 기호를 누른다.

 



+ Recent posts