Development tips - minsuk-jang/teamproject GitHub Wiki
tweekmonsters ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ ๋ฒจ ์ : nvimdev.nvim
- Neovim ์ฝ๋๋ฒ ์ด์ค์์ ์์ ํ๋ฉด์ Neama๊ฐ lua์ c๋ก ์์ ํ๊ฒํ์ญ์์ค.
- ํ๊ทธ ๋ฐ cscope.out
Tweekmonster ๊ณ ๋ง์ต๋๋ค!
- ์ฐพ์๋ณด๊ธฐ ** Neovim on SourceGraph **
- ** universal-ctags๋ฅผ ์ค์นํ์ญ์์ค.
** "Exuberant ctags"(๋ฐฐํฌํ์ด ์ ๊ณตํ๋ ์ ํ์ ์ธ
ctags
์ด์ง์)๋ ์ ์ง ๋ณด์๊ฐ ๋์ง ์์ Neovim ์์ค์์ ๋ง์ ๊ธฐ๋ฅ์ ์ธ์ํ์ง ๋ชปํฉ๋๋ค. -
contrib
ํด๋๋ Neovim์ ์ํ YouCompleteMe ์ค์ ์ ํฌํจํ๊ณ ์์ต๋๋ค.
`make lint'๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ์์ linter๋ฅผ ์คํํ ์ ์์ต๋๋ค. linting ํ๋ก์ธ์ค๋ "https://raw.githubusercontent.com/neovim/doc/ghpages/reports/clint/errors.json" ์์ ๋ง์คํฐ linting ์ค๋ฅ๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ๋ก์ปฌ์์ ๊ฐ์ง ๋ ์ค๋ฅ๋ฅผ ์๋ตํ์ฌ ๊ด๋ จ ์ค๋ฅ๋ง lint ์ง์ญ์ ๋ณ๊ฒฝ์ํต๋๋ค.
ํ ๋ฒ์ ํ๋ ๋๋ ๋ช ๊ฐ์ ํ์ผ๋ก ์์ ํ๋ค๋ฉด, ํ ๋ฒ์ ํ๋์ C ํ์ผ์ lint ํ ์ ์์ต๋๋ค.
make clint LINT_FILE="src/nvim/ops.c"
ํ ๋ฒ์ ๋ชจ๋ ํ์ผ์ linting ํ๋๊ฒ๋ณด๋ค ์ ์ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
nvimdev ํ๋ฌ๊ทธ์ธ์ด ๋์ ํ ์ ์์ต๋๋ค.
ํ
์คํธ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด์ make testlint
๋ฅผ ์ฌ์ฉํ์ญ์์ค.
Syntastic์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด https://gist.github.com/gilligan/9326904๋ฅผ ์ฌ์ฉํ์ฌ
C ํ์ผ์ ๋ํ ๊ฒ์ฌ๊ธฐ๋ก clint.py
๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
clint.py
๋ PATH
์ ์์ด์ผํ๊ณ g : syntastic_c_checkers
๋ฅผ ์์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด GCC ๋ make๊ฐ ๊ธฐ๋ณธ๊ฐ์ด ๋ฉ๋๋ค.
์์ธํ ๋ด์ฉ์ Syntastic 's documentation๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
API ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฐ๋จํ ์ ์ ์์ฑํ์ฌ Neovim์ ๋ช ๋ น์ ๋ณด๋ผ ์ ์์ต๋๋ค.
https://github.com/splinterofchaos/neovim-cpp-client-experiment/blob/master/src/vim-shell.cpp
Core dump๋ ์ฐ๋ถํฌ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ต๋๋ค, CentOS ๋ฐ ๊ธฐํ.
Core dumping์ ํ์ฑํ ํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค :
ulimit -c unlimited
๊ทธ๋ฐ ๋ค์ nvim
์์ segfault๋ฅผ ์ฌํํ๋ฉด core์ ๋ ๋๊น๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ core
ํ์ผ์ด ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๋ํ๋๊ฑฐ๋ (/ var / log / apport.log
๊ฐ ์ด๋์ ์ฐ์ฌ ์ก๋์ง ํ์ธํ๊ธฐ ์ํด) ํ์ธํฉ๋๋ค.
core
ํ์ผ์์ ์ญ์ถ์ ์ ์ป์ผ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค :
gdb -q -n -ex bt -batch ./build/bin/nvim <path/to/core> > backtrace.txt
-ex
๊ฐ ์๋ํ์ง ์์ผ๋ฉด tee
๋ฅผ ์ฌ์ฉํ์ฌ gdb
์ธ์
์ ์ถ๋ ฅ์ ์ ์ฅํ์ญ์์ค :
gdb build/bin/nvim /cores/core.74533 2>&1 | tee backtrace.txt
- Neovim์ด ๋ฉํฐ ์ค๋ ๋์ด๊ธฐ ๋๋ฌธ์
thread apply all bt
๊ฐ ํ์ํ ์ ์์ต๋๋ค. -thread apply all bt full
์ ๋ ํ๋ถํ (full) ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค.
macOS์์ nvim
์ด ์ถฉ๋ํ๋ฉด Console.app์์ ์ญ์ถ์ ์ ๋ณผ ์ ์์ต๋๋ค ( "User Diagnostic Reports" ์๋).
open -a Console
macOS์์ ์ฝ์ด ๋คํ ์ฌ์ฉ์ ์ํ ์๋ ์์ต๋๋ค.
/ cores /
๋๋ ํ ๋ฆฌ๊ฐ ์กด์ฌํด์ผ ํ๊ณ ์ฐ๊ธฐ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
์ฃผ์ด์ง ํ์ ๋ฌธ์์ด๊ณผ ์ผ์นํ๋ ํ
์คํธ๋ฅผ ์คํํ๋ ค๋ฉด TEST_TAG '๋ฅผ ์ฌ์ฉํ์ญ์์ค (์ :
it ( "foo", ...)) :
GDB=1 TEST_TAG=foo make functionaltest
๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ํฐ๋ฏธ๋์์ ๋ค์ ์์ ์ ์ํํฉ๋๋ค :
gdb build/bin/nvim
target remote localhost:7777
- test / functional / helpers.lua๋ ์ฐธ์กฐํ์ญ์์ค.
lldb .deps/usr/bin/luajit -- .deps/usr/bin/busted --lpath="./build/?.lua" test/unit/
1234์ PID๋ก ์คํ์ค์ธ nvim
ํ๋ก์ธ์ค์ ์ฐ๊ฒฐํ๋ ค๋ฉด :
gdb -tui build/bin/nvim 1234
gdb
๋ํ์ ํ๋กฌํํธ๊ฐ ๋ํ๋ฉ๋๋ค. ์ธ์ ๋ ์ง ๋ค์ ์์
์ ์ํ ํ ์ ์์ต๋๋ค.
- 'foo ()
ํจ์์ ์ค๋จ์ ์ ์ค์ ํ๋
break foo` - ** ๋ค์ ๋จ๊ณ๋ก ๋์ด ๊ฐ๊ธฐ ์ํ
n
** - ๋ง์ง๋ง ๋ช ๋ น์ ๋ฐ๋ณตํ๊ธฐ ์ํ `'
- ๋ค์ ๋ฌธ์ฅ์ผ๋ก ๋ค์ด๊ฐ๊ธฐ ์ํ
s
- ๊ณ์ํ๊ธฐ ์ํ
c
- ํ์ฌ ํจ์๋ฅผ ๋น ์ ธ๋์ค๊ธฐ ์ํ
finish
- 'zub
์ ๊ฐ์ ์ถ๋ ฅํ๋
pzub` - ํ์ฌ ์์น์์ ** ์ญ์ถ์ ** (์ฝ ์คํ)์ ๋ณด๊ธฐ ์ํ
bt
- ํ์ฌ ๋๋ฒ๊น
๋งฅ๋ฝ์์ ์์ค ํ์ผ์ TUI ๋ทฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด
CTRL-x CTRL-a
๋๋tui enable
์ ์ฌ์ฉํ์ญ์์ค. ์ด๋ gdb "frontend"๊ฐ ํ์ ์์ผ๋ฏ๋ก ๋งค์ฐ ์ ์ฉํฉ๋๋ค.- ์์ค ํ์ผ๋ณด๊ธฐ๋ฅผ ์คํฌ๋กค ํ๊ธฐ ์ํ
<up>
๊ณผ<down>
- ์์ค ํ์ผ๋ณด๊ธฐ๋ฅผ ์คํฌ๋กค ํ๊ธฐ ์ํ
๋ ์ฝ๋ ์ ์ฒด insn-number-max ๋ฌด์ ํ ์ค์
-
continue
๊ฐ ์กฐ๊ธ ์คํ๋ฉ๋๋ค. (์ต์ํ 'main()'์ด ์คํ๋ ๋๊น์ง) ๊ธฐ๋ก
- ๋ฒ๊ทธ๋ฅผ ์ ๋ฐ ํ ๋ค์
revert-next
,reverse-step
๋ฑ์ ์ฌ์ฉํ์ฌ ๋๋ฒ๊ฑฐ๋ฅผ ๋๊ฐ์ต๋๋ค.
์ฌ๋ฌ๊ฐ์ gdb
ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ์ nvim
ํ๋ก์ธ์ค์์ ์คํ์ํค๊ฑฐ๋ ๋ก์ปฌ gdb
๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฒฉ nvim
ํ๋ก์ธ์ค์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. gdbserver
๋ฅผ ์ฌ์ฉํ๋ฉด ๋จ์ผ ํ๋ก์ธ์ค์ ์ฐ๊ฒฐํ์ฌ ์ฌ๋ฌ 'gdb` ํด๋ผ์ด์ธํธ๋ฅผ ์ ์ด ํ ์ ์์ต๋๋ค.
ํฐ๋ฏธ๋์ ์ด๊ณ nvim
์ ์ฒจ๋ถ ๋ gdbserver
๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ํ์ญ์์ค :
gdbserver :6666 build/bin/nvim 2> gdbserver.log
gdbserver
๋ ์ด์ ํฌํธ 6666์์ ์ฒญ์ทจํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ ํฐ๋ฏธ๋์์ ์ด ๋๋ฒ๊น
์ธ์
์ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค :
gdb build/bin/nvim
gdb
๋ฅผ ์
๋ ฅํ๋ฉด ์๊ฒฉ ์ธ์
์ ์ ์ํด์ผ ํฉ๋๋ค :
target remote localhost:6666
gdbserver๊ฐ TUI๋ฅผ ๋ฐฐ๊ฒฝ ํ๋ก์ธ์ค๋ก ๋๋ ๊ฒฝ์ฐ TUI๋ pty (๋ฐ SIGTTIN ์ ํธ ์์ ) ๋ฐ / ๋๋ ์ถ๋ ฅ ๋ฐ์ดํฐ (SIGTTOU ์ ํธ)์์ ์ ๋ ฅ์ ์ฝ์ ์ ์๊ฒ๋ฉ๋๋ค. TUI๋ฅผ ํนํ ์ค์ํ๋ ํ๋ก์ธ์ค๋ก ๊ฐ์ ์คํํ๋ ค๋ฉด ๋ค์์ ์ถ๊ฐํ์ญ์์ค.
signal (SIGTTOU, SIG_IGN);
if (!tcsetpgrp(data->input.in_fd, getpid())) {
perror("tcsetpgrp failed");
}
to tui.c:terminfo_start.
์์์ ์ธ๊ธ ํ gdbserver
๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๋๋ฒ๊น
์ธ์
์ ๋นจ๋ฆฌ ์์ํ๋ ค๋ฉด
Custom makefile์ ์ฌ์ฉํ์ญ์์ค.
์ด ์์ ๋make debug
๋ฅผ ์
๋ ฅ ํ ๋ ๋๋ฒ๊น
์ธ์
์ ์์ฑํฉ๋๋ค.
.PHONY: dbg-start dbg-attach debug build
build:
@$(MAKE) -C neovim
dbg-start: build
@tmux new-window -n 'dbg-neovim' 'sudo gdbserver :6666 ./build/bin/nvim -D'
dbg-attach:
@tmux new-window -n 'dbg-cgdb' 'cgdb -x gdb_start.sh ./build/bin/nvim'
debug: dbg-start dbg-attach
์ฌ๊ธฐ์ gdb_start.sh
๋ ๋๋ฒ๊ฑฐ๊ฐ ์์๋ ๋ ํธ์ถ๋๋ gdb
๋ช
๋ น์ ํฌํจํฉ๋๋ค.
dbg-start
๊ท์น์ ์ํด ์์๋ ์๋ฒ์ ์ ์ํด์ผ ํฉ๋๋ค. ์ :
target remote localhost:6666
br main
๋๋ฒ๊น
๋น๋์์ ~ / .nvimlog
๋ก๊ทธ ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
NVIM_LOG_FILE
ํ๊ฒฝ ๋ณ์๋ก ์์น๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
Clang์ ์๋ ํ๋ก๊ทธ๋จ (Address Sanitizer : ASan, Undefined Behavior Sanitizer : UBSan, Memory Sanitizer : MSan, Thread Sanitizer : TSan) ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ Neovim์ ๋น๋ํ๊ณ ์ค์นํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ง์ ๋ฐ๋ก ์ก์ ์ ์์ต๋๋ค. Valgrind์์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์ผ์ผ ํธ์ง๊ธฐ๋ก ์๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ Neovim์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ASan์ ๊ฒฝ์ฐ 2 ๋ฐฐ์ ํ์ค ๊ฐ์์ด ๊ถ์ฅ๋์ง๋ ์์ง๋ง). Clang 3.4 ์ด์ ๋ฐ Unix ๊ณ์ด ํ๊ฒฝ์ ์ ๊ทผ ํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์์ํด์ผ ํฉ๋๋ค.
- ์๋
ํ๋ก๊ทธ๋จ ํ์ฑํ (
ASAN_UBSAN
,MSAN
,TSAN
)๋ก Neovim ๊ตฌ์ถ :
CC=clang-3.4 make CMAKE_EXTRA_FLAGS="-DCLANG_ASAN_UBSAN=ON"
- ์ ํ ์ฌํญ์ผ๋ก ์ผ๋ฐ ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด 'make install'์ ์ค์นํ์ญ์์ค :
- ASAN ๋ก๊ทธ๋ฅผ ์ ์ฅํ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค.
mkdir -p $ {HOME} /. logs
- ์ด๊ฒ์ ์
์ด๊ธฐํ ์คํฌ๋ฆฝํธ (์ :
.profile
)์ ์ถ๊ฐํ์ญ์์ค :export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.4
-
export ASAN_OPTIONS="log_path=${HOME}/.logs/asan"
orexport ASAN_OPTIONS="detect_leaks=1:log_path=${HOME}/.logs/asan"
๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๊ฐ์งํ๋ ค๋ฉด (์กฐ๊ธ ๋๋ ค์ง) ๋ค์์ ์ถ๊ฐํ์ญ์์ค : export MSAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.4
export TSAN_OPTIONS="external_symbolizer_path=/usr/bin/llvm-symbolizer-3.4 log_path=${HOME}/.logs/tsan"
์ด์ Neovim์ ์ค๋ฅ ๋ก๊ทธ๊ฐ $ {HOME} / .log / * san.PID
์ ์ฐ์ฌ์ง ๋๋ง๋ค ์ข
๋ฃํด์ผ ํฉ๋๋ค.