-
리눅스 커널 분석을 위한 vim, ctag, cscope, tagbar 세팅공부 2018. 2. 20. 00:12
리눅스 커널 분석을 위한 vim, ctag, cscope, tagbar 세팅
지난 주말 커널 분석 수업을 들으면서 언젠간 해봐야지 마음먹었을 때 알아두면 편할것 같아서 정리.
나는 원래 vim을 주 에디터로 쓰고 firefox에도 vim key binding을 해놓는 사람이라...
리눅스 커널을 분석하려면 결국 리눅스환경에서 작업해야하는데 vim 커스터마이징을 안하는 사람들을 위한 글 + 알게된 팁들 정리용이다.
작업 환경
내가 작업을 진행한 환경은
Ubuntu 16.04, vim 8.0
을 이용했고 분석한 커널버전은4.14.x
대이다.리눅스 커널 소스코드는 www.kernel.org에서 다운 받을 수 있다.
# jen6 at localhost.localdomain in ~/tmp [12:22:32] → wget 'https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.19.tar.xz' --2018-02-19 12:22:35-- https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.19.tar.xz Resolving cdn.kernel.org (cdn.kernel.org)... 151.101.229.176, 2a04:4e42:36::432 접속 cdn.kernel.org (cdn.kernel.org)|151.101.229.176|:443... 접속됨. HTTP request sent, awaiting response... 200 OK Length: 100845536 (96M) [application/x-xz] Saving to: ‘linux-4.14.19.tar.xz’ linux-4.14.19.tar.xz 100%[==========================================================>] 96.17M 17.3MB/s in 6.5s 2018-02-19 12:22:42 (14.9 MB/s) - ‘linux-4.14.19.tar.xz’ saved [100845536/100845536] # jen6 at localhost.localdomain in ~/tmp [12:22:42] → tar -xvf ./linux-4.14.19.tar.xz
vim vundle설치
vim vundle
은 vim의 플러그인을 설치 및 관리해주는 툴이다. 플러그인을 깔아서 커스터마이징 하다보면 어느순간 ide만큼 편해진다. 설치는 깃허브 링크로 들어가서 Quick start에 들어가 있는대로 설치를 한다.간단하게 설명하자면
~/.vim/bundle
위 경로와 같이 홈폴더에 다음과 같은 경로로 폴더를 만들어준다.vundle
을 클론 받는다git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
.vimrc
에 다음 내용을 추가해준다. 해당 내용은 간단하게 하기위해 주석과 필요없는걸 지웠다.Quick Start에 있는
vimrc
에 자세한 설정방법이 있음으로 해당 링크에 있는vimrc
를 복사하길 추천한다.set nocompatible " be iMproved, required filetype off " required set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " let Vundle manage Vundle, required Plugin 'VundleVim/Vundle.vim' Plugin 'tpope/vim-fugitive' Plugin 'git://git.wincent.com/command-t.git' Plugin 'rstacruz/sparkup', {'rtp': 'vim/'} " Plugin 'ascenator/L9', {'name': 'newL9'} " 이부분에 플러그인 설치할 부분을 넣어주면 된다. " All of your Plugins must be added before the following line call vundle#end() " required " 플러그인 설정 관련 부분은 vundle#end 밑에줄에 넣어주면 된다. filetype plugin indent on " required
vim
을 켜고:PluginInstall
을 쳐서 실행시켜주면 플러그인들이 설치된다.이후에도 플러그인을 추가했다면 4번 과정을 해주면 된다.
ctags
ctags 설치
ctags
는 소스코드 안에 있는 여러 함수나 변수, 구조체들을 미리 인덱싱 해놓은 후 분석할 때 해당 정의로 바로 이동할 수 있게 도와주는 툴이다. C언어 이외에도 다양한 언어를 지원함으로vim
을 주 에디터로 쓴다면 설치하면 좋은 툴이다.먼저
ctags
를 설치해준다.exuberant-ctags
는ctag
종류 중 하나로써vim
에서ctags
를 쓰기위해 기존 포맷에서 확장된 형태의 툴이다.# jen6 at localhost.localdomain in ~/tmp [12:24:03] → sudo apt-get install exuberant-ctags
ctags
를 쉽게 쓸 수 있게 해주는easytags
플러그인을 설치한다.vimrc
에 플러그인을 추가해준다.
Plugin 'xolox/vim-easytags' " 추가후 vim에서 :PluginInstall을 해준다.
- 그 후 다음 설정을
vimrc
에 추가해준다.
set tag=./tags;/ " easy-tag " tags를 비동기로 불러와준다. (필수) tag사이즈가 커지게 되면 vim이 블록되는 시간이 길어져서 답답하다 let g:easytags_async=1 " highlight를 켜면 좋지만 이것도 속도가 느려진다. let g:easytags_auto_highlight = 0 " struct의 멤버변수들도 추적이 된다. let g:easytags_include_members = 1 " 현재 프로젝트에서 쓰는 tags파일을 우선 로드하고 없을 경우 global tags를 로드한다. let g:easytags_dynamic_files = 1
ctags 사용법
먼저 프로젝트나 혹은 현재 폴더에 대해서
ctags
가 소스를 분석하도록 해야한다.현재 폴더만 소스를 분석하게 하려면
ctags *
을 이용하면 되고 하위 디렉토리까지 모두 분석을 하고 싶다면ctags -R .
을 이용하면 된다.easytags
를 설치했다면vim
에서:UpdateTags
를 하게되면 global tags를 업데이트 할 수 있다.이후
vim
에서 쓰이는 단축키 들이다.Ctrl + ]
- 함수, 구조체가 정의되어있는 곳으로 이동한다.Ctrl + t
- 이동하기 전 소스코드 위치로 돌아온다.
다른 명령어들도 있긴한데 이거 두 개만 알아도 쓸만하다. 다른 명령어가 궁금하다면 링크를 참조.
cscope
cscope
를 쓰기 이전에는 이 함수들이 어디서 쓰이는지 혹은 전역변수들이 어디서 쓰이는지를 찾아야하는 경우 터미널 창에서grep
을 이용해야 했었다.cscope
는 미리 소스코드에 대해 데이터베이스를 만들어 놓고 검색을 빠르고 편하게 할 수 있도록 도와주는 툴이다.cscope 설치
cscope
를 설치해준다# jen6 at localhost.localdomain in ~/tmp [23:02:28] → sudo apt-get install cscope
cscope
를vim
에서 편하게 쓸 수 있도록 도와주는quickr-cscope.vim
플러그인을 설치한다.Plugin 'ronakg/quickr-cscope.vim'
vimrc
에 자동으로cscope
데이터베이스를 로드해주는 함수를 추가한다.function! LoadCscope() let db = findfile("cscope.out", ".;") if (!empty(db)) let path = strpart(db, 0, match(db, "/cscope.out$")) set nocscopeverbose " suppress 'duplicate connection' error exe "cs add " . db . " " . path set cscopeverbose " else add the database pointed to by environment variable elseif $CSCOPE_DB != "" cs add $CSCOPE_DB endif endfunction au BufEnter /* call LoadCscope()
cscope 사용법
- C언어로 이루어진 프로젝트 폴더에서
cscope
를 이용해 먼저 데이터베이스를 만들어 준다.
# jen6 at localhost.localdomain in ~/research/linux-4.14.19/kernel [23:12:18] → cscope -RUbq
quick-cscope
를 설치했다면 단축키 바인딩이 되어있다.\s
- 커서에 해당하는 단어에 대한 모든 심볼을 찾아준다\g
- 커서에 있는 단어에 대한 정의(global definition)을 찾아준다\c
- 커서에 있는 함수명을 호출하는 부분을 찾아준다\f
- 커서에 있는 파일명에 대해 모든 파일을 찾아준다\i
- 커서에 있는 include하는 파일을 모두 찾아준다
혹시 창이 나눠져서 당황했다면
ctrl + ww
로 나뉘어진 창을 넘어다니면 된다.
키바인딩이나 커스터마이징을 하고싶다면 다음 링크를 참조하자.
자세한 사용법은
man cscope
직접 찾아봅시다.tagbar
현재 파일내에 있는 함수, 구조체 정의들을 옆에 빠로 한번에 볼 수 있게 해주고 점프 해준다.
tags
를 이용하는 기능인데 은근 자주 쓰게되고 ide같은 화면을 만들 수 있다.tagbar 설치
majutsushi/tagbar
라이브러리를 설치해준다.Plugin 'majutsushi/tagbar'
끝
tagbar 사용법
F8
버튼을 누르면 다음과 같은 화면이 나온다.ctrl + ww
로 창을 넘나들면 된다.Linux kernel에서 ctags, cscope 데이터베이스 생성하기
최근 리눅스 커널
make
파일에서는ctags
와cscope
데이터베이스 파일을 알아서 만들어준다.# jen6 at localhost.localdomain in ~/research/linux-4.14.19 [23:35:53] → make ARCH=x86_64 cscope tags
ARCH
부분은 본인이 분석하길 원하는 아키텍쳐를 넣으면 된다.이렇게 하면 노트북 기준 10~20분 사이에 데이터베이스가 만들어진다.
(멘토님은 이 기능을 보시곤 아니 이렇게 좋은 세상이 되었다니... 하면서 감탄하셨다.)
+
언젠간... 커널도 분석해서 글을 써야지... 언젠간...
'공부' 카테고리의 다른 글
디스크 정리를 이용해서 Windows10의 UAC Bypass 하기 (0) 2016.07.29 Computation Structures 1: Digital Circuits (0) 2016.01.29