리눅스 커널을 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 태크를 찾아 리스트로 보여주게 된다.
창을 분할 해서 오픈 한다.
스택에 넣었다가 빼면서 이동 한다.
[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
빠른 괄호 탐색 기능
{ }의 부분에서 % 기호를 누른다.