python 프로그래밍 - 디버깅 환경 설정

vimspector

vimspector를 사용하면 vim에서 다양한 언어의 프로그램을 디버깅할 수 있다.

Vimspector는 Debug Adapter들에 대한 generic client이다. 실제 debugger와 상호작용 하는 것은 Debug adapters(gadget 또는 adapter라고도 불림)들이다.
따라서 vimspector를 통해 디버깅을 하려면 특정 언어에 대한 gadget을 설치해야 한다.

설치

  1. pathogen 플러그인 매니저를 사용
    $ cd ~/.vim/bundle
    $ git clone https://github.com/puremourning/vimspector.git
    
  2. vim의 +python3 feature 활성화
    Vim을 새로 빌드하거나 빌드된 패키지(플러그인)를 설치해야 한다.
    $ brew install vim 
    

    기존의 vim은 /usr/bin/vim에 설치되어있었는데 제거할 수가 없었다.
    그래서 위의 명령어로 python3을 지원하는 vim을 설치한 뒤 ~/.zshrc에 설정을 추가해줬다.

    alias vim='/opt/homebrew/Cellar/vim/9.0.1400/bin/vim`
    

    특정 vim 플러그인들은 vim의 +python3 기능이 활성화 되어있어야 한다.
    $ vim --version 명령어를 통해 해당 기능의 활성화 여부를 알 수 있다.
    -python3이라면 비활성화된 상태이다. vim--version

install debugpy

순서대로 Python3, Python2를 위한 gadget을 설치하는 vim 명령어이다.

:VimspectorInstall debugpy
:VimspectorInstall debugpy-python2

setting vimspector

vimspector는 .vimspector.json파일을 읽어 초기화된다.
.vimspector.json 파일을 프로젝트의 루트 디렉토리에 추가해준다(full options)
vimspector 설정 자세히 보기

{
  "configurations": {
    "<name>: Launch": {
      "adapter": "debugpy",
      "filetypes": [ "python" ],
      "configuration": {
        "name": "<name>: Launch",
        "type": "python",
        "request": "launch",
        "cwd": "<working directory>",
        "python": "/path/to/python/interpreter/to/use",
        "stopOnEntry": true,
        "console": "externalTerminal",
        "debugOptions": [],
        "program": "<path to main python file>"
      }
    }
    ...
  }
}

stdin으로부터 입력받기

.vimspector.json 파일에서 "debugOptions""-i" 옵션을 추가한다.

Key mapping

~/.vimrc에 설정을 추가하여 원하는 키에 디버거의 기능을 맵핑

"============================= Vimspector =============================
" F10 step over, F11 step into, F12 step out
" F5 continue/start, F3 stop, F4 restart
" F9 toggle breakpoint
let g:vimspector_enable_mappings = 'HUMAN' 	
nnoremap <Leader>dd :call vimspector#Launch()<CR>
nnoremap <Leader>de :call vimspector#Reset()<CR>
nnoremap <Leader>dc :call vimspector#Continue()<CR>
nnoremap <Leader>b :call vimspector#ToggleBreakpoint()<CR>
nnoremap <Leader>B :call vimspector#ClearBreakpoints()<CR>
nmap <Leader>dr <Plug>VimspectorRestart
nmap <Leader>w <Plug>VimspectorStepOut
nmap <Leader>s <Plug>VimspectorStepInto
nmap <Leader>d <Plug>VimspectorStepOver
"============================= Vimspector =============================

<Leader>: \
<CR>: Enter

  • \dd: debugger 시작(프로그램을 시작)
  • \de: debugger 종료
  • \dc: continue(정지->시작, 다음 breakpoint로 이동)
  • \b: breakpoint 설정/해제
  • \B: 모든 breakpoint 초기화
  • \dr: debugging 다시 시작(restart)
  • \s: step into (bock 내부로 들어감)
  • \w: step out (block을 벗어남)
  • \d: step over(다음 줄 실행)

window size 설정

~/.vimrc

let g:vimspector_sidebar_width = 30
let g:vimspector_bottombar_height = 10
let g:vimspector_code_minwidth = 90
let g:vimspector_terminal_maxwidth = 100
let g:vimspector_terminal_minwidth = 20

before

before

after

terminal(stdout) window 가로 길이가 늘어났다. after

reference

Comments