튜토리얼과 사용법 개요를 보려면 Vimspector 웹사이트를 살펴보세요.
.vimspector.json
형식에 대한 자세한 설명은 참조 가이드를 확인하세요.
이 플러그인은 여러 언어를 지원하는 Vim 그래픽 디버거입니다. 대부분 C++, Python 및 TCL에 대해 테스트되었지만 이론적으로는 Visual Studio Code가 지원하는 모든 언어를 지원합니다(단, 주의 사항 참조).
Vimspector 웹 사이트에는 구성 및 설정에 대한 기본 지침과 함께 UI 개요가 있습니다.
하지만 지금은 Vimspector가 Vim을 디버깅하는 (다소 오래된) 스크린샷이 있습니다.
그리고 몇 가지 간단한 데모:
<Plug>VimspectorBalloonEval
참조)다음 표에는 "내장"된 언어가 런타임 종속성과 함께 나열되어 있습니다. 지원 수준에 따라 분류됩니다.
Tested
: 완전히 지원되며 Vimspector 회귀 테스트에서 이를 다룹니다.Supported
: 완전히 지원되고 자주 사용되며 수동으로 테스트되었습니다.Experimental
: 작동하지만 자주 사용되지 않으며 거의 테스트되지 않음Legacy
: 더 이상 지원되지 않습니다. 구성을 마이그레이션하세요.Retired
: 더 이상 포함되거나 지원되지 않습니다.언어 | 상태 | 스위치( install_gadget.py 용) | 어댑터( :VimspectorInstall 의 경우) | 종속성 |
---|---|---|---|---|
C, C++, Rust, Jai 등 | 테스트됨 | --all 또는 --enable-c (또는 cpp) | vscode-cpptools | 모노코어 |
C, C++, Rust, Jai 등 | 테스트됨 | --enable-rust , --enable-c 등 | 코드LLDB | 없음 |
파이썬 | 테스트됨 | --all 또는 --enable-python | 디버그 | 파이썬 3 |
가다 | 테스트됨 | --enable-go | 동굴 | 1.16+로 이동 |
TCL | 지원됨 | --all 또는 --enable-tcl | 티클프로 | TCL 8.5 |
본 쉘 | 지원됨 | --all 또는 --enable-bash | vscode-bash-디버그 | 배쉬 v?? |
루아 | 테스트됨 | --all 또는 --enable-lua | 로컬-루아-디버거-vscode | 노드 >=12.13.0, Npm, Lua 인터프리터 |
Node.js | 지원됨 | --force-enable-node | vscode-js-디버그 | 노드 >= 18 |
자바스크립트 | 지원됨 | --force-enable-chrome | 크롬용 디버거 | 크롬 |
자바스크립트 | 지원됨 | --force-enable-firefox | vscode-파이어폭스-디버그 | 파이어폭스 |
자바 | 지원됨 | --force-enable-java | vscode-자바-디버그 | 호환되는 LSP 플러그인(나중에 참조) |
PHP | 실험적 | --force-enable-php | vscode-php-디버그 | 노드, PHP, XDEBUG |
C#(닷넷 코어) | 테스트됨 | --force-enable-csharp | 넷코어DBG | 닷넷 코어 |
F#, VB 등 | 지원됨 | --force-enable-[fsharp,vbnet] | 넷코어DBG | 닷넷 코어 |
이동(레거시) | 유산 | --enable-go | vscode-go | 노드, 이동, 델브 |
파이썬 2 | 유산 | --force-enable-python2 | debugpy-python2 | 파이썬 2.7 |
Vimspector는 Visual Studio Code에서 작동하는 모든 디버그 어댑터에서 작동해야 합니다.
"내장"되지 않은 언어로 Vimspector를 사용하려면 이 위키 페이지를 참조하세요.
2가지 설치 방법이 있습니다:
:help packages
참조하세요.packadd! vimspector
.vimrc
에 추가.vimspector.json
생성 또는 g:vimspector_configurations
설정) - 참조 가이드를 참조하세요.종속성을 확인하세요.
플러그인 관리자의 문서를 확인하고 플러그인을 설치하세요. Vundle의 경우 다음을 사용하세요.
Plugin ' puremourning/vimspector '
일부 '가젯'(디버그 어댑터) 설치 - 설치 명령은 여기를 참조하고 설치할 가젯을 선택하세요.
프로젝트의 디버그 프로필 구성( .vimspector.json
생성 또는 g:vimspector_configurations
설정) - 참조 가이드를 참조하세요.
다음 섹션에서는 위의 간략한 개요를 확장합니다.
Vimspector에는 다음이 필요합니다.
어떤 Linux 버전이 있나요? 저는 Ubuntu 20.04 이상과 RHEL 7에서만 테스트했습니다.
neovim은 마우스 호버 풍선을 구현하지 않습니다. 대신 <Plug>VimspectorBalloonEval
매핑이 있습니다. 이에 대한 기본 매핑이 없으므로 팝업에 변수 표시를 얻으려면 다음과 같은 것을 권장합니다.
" mnemonic 'di' = 'debug inspect' (pick your own, if you prefer!)
" for normal mode - the word under the cursor
nmap <Leader> di <Plug> VimspectorBalloonEval
" for visual mode, the visually selected text
xmap <Leader> di <Plug> VimspectorBalloonEval
Windows에서는 다음 기능이 구현되지 않습니다.
vim 구성을 변경하지 않고 vimspector를 사용해 보고 싶다면 support/test
에 다음을 포함하여 다양한 언어에 대한 예제 프로젝트가 있습니다.
이들 중 하나를 테스트하려면 디렉토리로 이동하여 다음을 실행하십시오.
vim -Nu /path/to/vimspector/tests/vimrc --cmd "let g:vimspector_enable_mappings='HUMAN'"
그런 다음 <F5>
누르십시오.
tests/testdata/cpp/simple/
에는 모든 것이 작동하는지 확인하는 데 사용할 수 있는 Makefile
이 포함된 C++ 프로젝트도 있습니다. 이는 CI의 회귀 테스트에서 사용되므로 항상 작동해야 하며 문제가 버그가 아닌 구성인지 확인하는 좋은 방법입니다.
Vim 플러그인 관리자는 많지만 특별히 선호하는 사항을 언급하지는 않겠습니다. 따라서 하나를 사용하기로 결정했다면 플러그인 관리자의 문서를 따르세요. 예를 들어 Vundle의 경우 다음을 사용합니다.
Plugin ' puremourning/vimspector '
아직 플러그인 관리자를 사용하지 않는 경우 다음과 같이 이 저장소를 패키지 경로에 복제하여 vimspector를 Vim 패키지로 설치하세요.
$ git clone https://github.com/puremourning/vimspector ~/.vim/pack/vimspector/opt/vimspector
.vimrc
에서 vimspector를 구성하세요. let g: vimspector_enable_mappings = ' HUMAN '
.vimrc
에 추가할 수도 있습니다. packadd! vimspector
최소한의 예는 support/doc/example_vimrc.vim
참조하세요.
Vimspector는 디버그 어댑터용 일반 클라이언트입니다. 디버그 어댑터('가젯' 또는 '어댑터'라고 함)는 실제로 실제 디버거와 통신하는 작업을 수행합니다.
Vimspector를 유용하게 사용하려면 일부 어댑터를 설치해야 합니다.
이를 수행하는 몇 가지 방법이 있습니다:
:VimspectorInstall <adapter> <args...>
사용(TAB wildmenu
사용하여 옵션을 확인하고 install_gadget.py
옵션도 허용)python3 install_gadget.py <args>
사용(모든 옵션을 보려면 --help
사용):VimspectorUpdate
사용하여 지원되는 최신 버전의 가젯을 설치합니다.다음은 일부 설치 및 업그레이드에 대한 데모입니다.
install_gadget.py
와 :VimspectorInstall
모두 동일한 작업을 수행하지만 기본 동작은 약간 다릅니다. 지원되는 언어의 경우 다음을 수행합니다.
gadgetDir
심볼릭 링크를 설정합니다.예를 들어, 특정 언어에 대해 테스트된 디버그 어댑터를 설치하려면 다음을 실행하세요.
설치하려면 | 스크립트 | 명령 |
---|---|---|
<adapter> | :VimspectorInstall <adapter> | |
<adapter1> , <adapter2> , ... | :VimspectorInstall <adapter1> <adapter2> ... | |
<language> | ./install_gadget.py --enable-<language> ... | :VimspectorInstall --enable-<language> ... |
지원되는 어댑터 | ./install_gadget.py --all | :VimspectorInstall --all |
지원되는 어댑터(TCL은 아님) | ./install_gadget.py --all --disable-tcl | :VimspectorInstall --all --disable-tcl |
지원되는 실험용 어댑터 | ./install_gadget.py --all --force-all | :VimspectorInstall --all |
특정 디버그 구성을 위한 어댑터 | 디버깅을 시작할 때 Vimspector에서 제안함 |
:VimspectorInstall
일부 옵션이 기본값으로 설정된 상태로 백그라운드에서 install_gadget.py
실행합니다.
:VimspectorUpdate
install_gadget.py
실행하여 .gadgets.json
에 이미 설치된 모든 가젯을 다시 설치(즉, 업데이트)합니다.
출력은 최소화됩니다. 전체 출력을 보려면 :VimspectorInstall --verbose ...
또는 :VimspectorUpdate --verbose ...
와 같이 명령에 --verbose
추가하세요.
설치가 성공하면 출력 창이 닫힙니다(그리고 출력은 영원히 손실됩니다). !
열린 상태로 유지합니다(예 :VimspectorInstall! --verbose --all
또는 :VimspectorUpdate!
등).
예를 들어 소스 제어에서 구성을 재현할 수 있도록 설치하려는 가젯을 미리 알고 있는 경우 g:vimspector_install_gadgets
가젯 목록으로 설정할 수 있습니다. 이는 다음과 같은 경우에 사용됩니다.
:VimspectorInstall
실행 또는:VimspectorUpdate
예를 들어:
let g: vimspector_install_gadgets = [ ' debugpy ' , ' vscode-cpptools ' , ' CodeLLDB ' ]
기본적으로 install_gadget.py
방금 설치된 어댑터 세트로 .gadgets.json
덮어쓰는 반면, :VimspectorInstall
이를 업데이트 하여 새로 변경되거나 설치된 어댑터만 덮어씁니다.
기존 어댑터를 삭제하지 않고 스크립트를 사용하여 새 어댑터를 추가하려면 다음과 같이 --update-gadget-config
추가하세요.
$ ./install_gadget.py --enable-tcl
$ ./install_gadget.py --enable-rust --update-gadget-config
$ ./install_gadget.py --enable-java --update-gadget-config
vimspector 저장소 외부에서 configurations
유지하려는 경우(사용자 정의 가젯이나 전역 구성이 있는 경우 유용할 수 있음) 설치 프로그램에 다른 기반 디렉터리를 사용하도록 지시한 다음 g:vimspector_base_dir
해당 디렉터리를 가리키도록 설정할 수 있습니다. 예를 들어 :
$ ./install_gadget.py --basedir $HOME /.vim/vimspector-config --all --force-all
그런 다음 이것을 .vimrc
에 추가하십시오.
let g: vimspector_base_dir = expand ( ' $HOME/.vim/vimspector-config ' )
:VimspectorInstall
사용할 때 --basedir
수동으로 추가하지 않는 한 g:vimspector_base_dir
설정이 적용됩니다(권장되지 않음).
다양한 옵션에 대한 자세한 내용은 --help
참조하세요.
디버깅하려는 언어가 위의 지원 목록에 없는 경우에도 작동하도록 할 수는 있지만 더 많은 노력이 필요합니다.
기본적으로 디버그 어댑터를 제대로 설치하고, 시작하는 방법을 알아낸 다음, .vimspector.json
이나 .gadgets.json
또는 g:vimspector_adapters
의 adapters
항목에서 이를 구성해야 합니다.
실제로 가장 간단한 방법은 Visual Studio Code를 설치하거나 시작하고 해당 확장 관리자를 사용하여 관련 확장을 설치하는 것입니다. 그런 다음 .vimspector.json
의 adapters
섹션이나 gadgets.json
또는 g:vimspector_adapters
에서 어댑터를 수동으로 구성할 수 있습니다.
PR은 지원되는 언어를 추가하는 것을 언제든지 환영합니다(대략 python/vimspector/gadgets.py
업데이트하고 테스트하는 것으로 해석됨).
Vimspector는 기본적으로 다음 디렉터리를 사용하여 .gadgets.json
이라는 파일을 찾습니다: </path/to/vimspector>/gadgets/<os>
.
이 경로는 vimspector 변수 ${gadgetDir}
로 노출됩니다. 이는 가젯 명령줄을 구성하는 데 유용합니다.
os는 다음 중 하나입니다.
macos
linux
windows
(참고: Windows는 지원되지 않음) 형식은 .vimspector.json
과 동일하지만 adapters
키만 사용됩니다.
예:
{
"adapters" : {
"lldb-vscode" : {
"variables" : {
"LLVM" : {
"shell" : " brew --prefix llvm "
}
},
"attach" : {
"pidProperty" : " pid " ,
"pidSelect" : " ask "
},
"command" : [
" ${LLVM}/bin/lldb-vscode "
],
"env" : {
"LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY" : " YES "
},
"name" : " lldb "
},
"vscode-cpptools" : {
"attach" : {
"pidProperty" : " processId " ,
"pidSelect" : " ask "
},
"command" : [
" ${gadgetDir}/vscode-cpptools/debugAdapters/bin/OpenDebugAD7 "
],
"name" : " cppdbg "
}
}
}
가젯 파일은 install_gadget.py
(또는 :VimspectorInstall
)에 의해 자동으로 작성됩니다.
Vimspector는 </path/to/vimspector>/gadgets/<os>/.gadgets.d/*.json
과 일치하는 모든 파일도 로드합니다. 이는 .gadgets.json
과 동일한 형식을 갖지만 install_gadget.py
실행할 때 덮어쓰이지 않습니다.
Vimspector 코드를 업데이트한 후( git pull
또는 다른 패키지 관리자를 통해) :VimspectorUpdate
실행하여 이미 설치된 가젯을 업데이트하세요.
그 동기는 Vim에서의 디버깅이 매우 끔찍한 경험이라는 것입니다. 특히 여러 언어를 사용하는 경우에는 더욱 그렇습니다. 더 이상 pyclewn이 없고 내장된 termdebug 플러그인이 gdb로 제한되어 있어 옵션을 살펴보고 싶었습니다.
언어 서버 프로토콜은 잘 알려져 있지만 디버그 어댑터 프로토콜은 덜 알려져 있지만 클라이언트에서 언어에 구애받지 않는 API 추상화 디버거라는 유사한 목표를 달성합니다.
이 프로젝트의 목적은 Visual Studio Code용으로 구축된 디버그 어댑터를 활용하여 Vim에서 여러 언어에 대해 간단하면서도 효과적인 디버깅 환경을 제공하는 것입니다.
원격 디버깅을 수행하는 능력은 필수입니다. 이것이 내 작업 흐름의 핵심이므로 이를 디버깅 환경에 적용하는 것이 프로젝트의 최우선 청구 목표입니다. 따라서 vimspector는 프로그램을 원격으로 실행하고 연결하는 데 있어 최고 수준의 지원을 제공합니다. 이 지원은 vimspector에 고유하며 실제 디버그 어댑터의 지원에 더해(상보적으로) 제공됩니다.
Vimspector는 디버그 어댑터 프로토콜 위에 있는 vim UI입니다. 이는 일상적인 디버깅 작업에 높은 수준을 제공하고 편리하도록 고안되었습니다.
Vimspector는 다음이 아닙니다:
Vimspector는 현재 진행 중인 작업이므로 어떤 피드백이나 기여도 환영합니다.
백로그는 Trello에서 볼 수 있습니다.
플러그인은 현재 실험적 입니다. 이는 다음과 같은 부분을 포함하여 모든 부분이 변경될 수 있음을 의미합니다.
그러나 나는 가장 극단적인 경우에만 이 작업을 수행하고 이러한 변경 사항을 Gitter에 미리 공지할 것을 약속합니다. 당신을 괴롭히는 것보다 더 짜증나는 것은 없습니다. 나는 그것을 이해한다.
이 플러그인의 동기에 대한 작성자의 메시지:
많은 개발 환경에는 디버거가 내장되어 있습니다. 나는 Vim에서 지나치게 많은 시간을 보내고 있습니다. 나는 Vim에서 모든 개발을 수행하고 코드 작성, 테스트 실행 등을 위한 워크플로를 사용자 정의하기도 했습니다.
수년 동안 나는 내 자신, 친구 및 동료가 모든 종류의 파일에
printf
,puts
,나는 대화형 그래픽 디버깅 환경이 익숙하지 않은 코드와 친숙한 코드를 모두 이해하고 추론하는 가장 좋은 방법이며, 디버거에 대한 준비가 되어 있지 않고 간단하게 액세스할 수 없다는 것이 많은 사람들에게 숨겨진 커다란 생산성 구멍이라고 진심으로 믿습니다.
오해하지 마십시오. 말 그대로 그래픽 디버거 없이 개발에 능숙한 개발자가 수백만 명 있다는 것을 알고 있지만, 그들이 키를 누르고 디버거로 뛰어들 수 있는 능력이 있다면, 단순히 대뇌 코드를 이해하는 것보다 더 빠르고 재미있을 것입니다.
도구를 변경하는 것이 불편하기 때문에 Vimspector를 만들었습니다. C++의 경우
gdb
, Python의 경우pdb
등. 각각 고유한 구문이 있습니다. 각각 고유한 어휘가 있습니다. 각각의 약점이 있습니다.동료, 친구, 협력자 또는 완전히 낯선 사람에게도 작동하도록 구성을 소스 제어에 커밋할 수 있는 방식으로 구성 시스템을 설계했습니다.
저는 원격 디버깅을 일류 기능으로 삼았습니다. 왜냐하면 이것이 제 업무의 주요 사용 사례이기 때문입니다.
Vimspector를 사용하면 내가 개발하는 모든 언어에서
<F5>
키를 누르고 정확히 동일한 워크플로, 매핑 및 UI를 사용하여 로컬 또는 원격으로 디버그할 수 있습니다. 버튼을 누르고 Vimspector의 커서 아래에서 테스트를 실행할 수 있는 방식으로 이것을 Vim과 통합했습니다. 이러한 종류의 통합으로 작업 흐름과 생산성이 크게 향상되었습니다. 새로운 코드베이스를 배우는 과정도 재미있어졌습니다.- 벤 잭슨, 창조자.
아파치 2.0
저작권 © 2018 벤 잭슨
Vimspector가 너무 좋아서 힘들게 번 돈을 기부하고 싶다면 Vimspector의 작성자에게 의미 있는 다음 자선 단체 중 하나에 기부하는 것을 고려해 보세요(선호도 순).
기본적으로 vimspector는 매핑을 변경하지 않습니다. 매핑은 매우 개인적인 것이므로 원하는 것을 파악하고 vim의 강력한 매핑 기능을 사용하여 자신만의 매핑을 설정해야 합니다. 이를 위해 Vimspector는 다음과 같은 <Plug>
매핑을 정의합니다.
매핑 | 기능 | API |
---|---|---|
<Plug>VimspectorContinue | 디버깅할 때 계속하세요. 그렇지 않으면 디버깅을 시작하십시오. | vimspector#Continue() |
<Plug>VimspectorStop | 디버깅을 중지합니다. | vimspector#Stop() |
<Plug>VimpectorRestart | 동일한 구성으로 디버깅을 다시 시작합니다. | vimspector#Restart() |
<Plug>VimspectorPause | 디버기를 일시 중지합니다. | vimspector#Pause() |
<Plug>VimspectorBreakpoints | 중단점 창 표시/숨기기 | vimspector#ListBreakpoints() |
<Plug>VimspectorToggleBreakpoint | 현재 줄의 줄 중단점을 전환합니다. | vimspector#ToggleBreakpoint() |
<Plug>VimspectorToggleConditionalBreakpoint | 현재 줄의 조건부 줄 중단점 또는 로그 지점을 전환합니다. | vimspector#ToggleBreakpoint( { trigger expr, hit count expr } ) |
<Plug>VimspectorAddFunctionBreakpoint | 커서 아래 표현식에 대한 함수 중단점 추가 | vimspector#AddFunctionBreakpoint( '<cexpr>' ) |
<Plug>VimspectorGoToCurrentLine | 현재 프로그램 카운터를 현재 라인으로 재설정 | vimspector#GoToCurrentLine() |
<Plug>VimspectorRunToCursor | 커서까지 실행 | vimspector#RunToCursor() |
<Plug>VimspectorStepOver | 스텝오버 | vimspector#StepOver() |
<Plug>VimspectorStepInto | 한 단계 더 나아가다 | vimspector#StepInto() |
<Plug>VimspectorStepOut | 현재 기능 범위에서 나가기 | vimspector#StepOut() |
<Plug>VimspectorDisassemble | 분해를 보여줍니다. 명령어 단계별 실행 활성화 | vimspector#ShowDisassembly() |
<Plug>VimspectorUpFrame | 현재 호출 스택에서 프레임 위로 이동 | vimspector#UpFrame() |
<Plug>VimspectorDownFrame | 현재 호출 스택에서 프레임 아래로 이동 | vimspector#DownFrame() |
<Plug>VimspectorJumpToNextBreakpoint | 현재 파일의 다음 중단점으로 커서를 이동합니다. | vimspector#JumpToNextBreakpoint() |
<Plug>VimspectorJumpToPreviousBreakpoint | 현재 파일의 이전 중단점으로 커서를 이동합니다. | vimspector#JumpToPreviousBreakpoint() |
<Plug>VimspectorJumpToProgramCounter | 현재 프레임의 프로그램 카운터로 커서를 이동합니다. | vimspector#JumpToProgramCounter() |
<Plug>VimspectorBalloonEval | 팝업의 커서(또는 시각적) 아래 표현을 평가합니다. | 내부 |
이는 아래 API 함수를 사용하여 대략 1-1로 매핑됩니다.
예를 들어 <F5>
눌러 디버깅을 시작/계속하려면 이를 vimrc
와 같은 적절한 위치에 추가하세요(힌트: run :e $MYVIMRC
).
nmap <F5> <Plug> VimspectorContinue
또한 많은 사용자는 디버깅이 활성화된 동안 특정 Vimspector 매핑만 활성화하기를 원할 것입니다. vimscipt를 작성해야 하지만 이것도 가능합니다.
즉, 많은 사람들이 특정 디버거에 익숙하므로 g:vimspector_enable_mappings
를 지정된 값으로 설정하여 다음 매핑을 활성화할 수 있습니다.
Visual Studio와 유사한 매핑을 사용하려면 vimspector를 로드하기 전에 vimrc
에 다음을 추가하세요.
let g: vimspector_enable_mappings = ' VISUAL_STUDIO '
열쇠 | 매핑 | 기능 |
---|---|---|
F5 | <Plug>VimspectorContinue | 디버깅할 때 계속하세요. 그렇지 않으면 디버깅을 시작하십시오. |
Shift F5 | <Plug>VimspectorStop | 디버깅을 중지합니다. |
Ctrl Shift F5 | <Plug>VimspectorRestart | 동일한 구성으로 디버깅을 다시 시작합니다. |
F6 | <Plug>VimspectorPause | 디버기를 일시 중지합니다. |
F8 | <Plug>VimspectorJumpToNextBreakpoint | 현재 파일의 다음 중단점으로 이동합니다. |
Shift F8 | <Plug>VimspectorJumpToPreviousBreakpoint | 현재 파일의 이전 중단점으로 이동합니다. |
F9 | <Plug>VimspectorToggleBreakpoint | 현재 줄의 줄 중단점을 전환합니다. |
Shift F9 | <Plug>VimspectorAddFunctionBreakpoint | 커서 아래 표현식에 대한 함수 중단점 추가 |
F10 | <Plug>VimspectorStepOver | 스텝오버 |
Ctrl F10 | <Plug>VimspectorRunToCursor | 커서까지 실행* |
F11 | <Plug>VimspectorStepInto | 한 단계 더 나아가다 |
Shift F11 | <Plug>VimspectorStepOut | 현재 기능 범위에서 나가기 |
Alt 8 | <Plug>VimspectorDisassemble | 분해 표시 |
참고: Ctrl 및 F 키와 같은 일부 매핑은 터미널, 키보드, 창 시스템 및 기타 모든 종류의 항목에 따라 작동하지 않을 수 있습니다. :help modifyOtherKeys
및 기타 소스 수정을 참조하세요. 이 작업을 수행할 수 없으면 "인간 모드" 매핑을 사용하십시오.
나처럼 손이 2개이고 손가락이 10개밖에 없다면 Ctrl-Shift-F 키를 좋아하지 않을 것입니다. 또한 터미널에서 실행 중인 경우 특히 TERM
screen-256color
인 경우 Shift 키를 누른 경우 terminfo가 잘못될 가능성이 있습니다. 이러한 문제(손 수, TERM
변수)를 해결할 수 없는 경우 vimspector를 로드하기 전에 다음을 추가하여 다음 매핑을 시도해 보세요.
let g: vimspector_enable_mappings = ' HUMAN '
열쇠 | 매핑 | 기능 |
---|---|---|
F5 | <Plug>VimspectorContinue | 디버깅할 때 계속하세요. 그렇지 않으면 디버깅을 시작하십시오. |
F3 | <Plug>VimspectorStop | 디버깅을 중지합니다. |
F4 | <Plug>VimspectorRestart | 동일한 구성으로 디버깅을 다시 시작합니다. |
F6 | <Plug>VimspectorPause | 디버기를 일시 중지합니다. |
F9 | <Plug>VimspectorToggleBreakpoint | 현재 줄의 줄 중단점을 전환합니다. |
<leader>F9 | <Plug>VimspectorToggleConditionalBreakpoint | 현재 줄의 조건부 줄 중단점 또는 로그 지점을 전환합니다. |
F8 | <Plug>VimspectorAddFunctionBreakpoint | 커서 아래 표현식에 대한 함수 중단점 추가 |
<leader>F8 | <Plug>VimspectorRunToCursor | 커서까지 실행 |
F10 | <Plug>VimspectorStepOver | 스텝 오버 |
F11 | <Plug>VimspectorStepInto | 한 단계 더 나아가다 |
F12 | <Plug>VimspectorStepOut | 현재 기능 범위에서 나가기 |
또한 일반 모드와 시각적 모드에서 <Plug>VimspectorBalloonEval
에 매핑을 추가하는 것이 좋습니다. 예를 들면 다음과 같습니다.
" mnemonic 'di' = 'debug inspect' (pick your own, if you prefer!)
" for normal mode - the word under the cursor
nmap <Leader> di <Plug> VimspectorBalloonEval
" for visual mode, the visually selected text
xmap <Leader> di <Plug> VimspectorBalloonEval
스택 위/아래로 탐색하고, 중단점 창을 전환하고, 디스어셈블리를 표시하기 위한 매핑을 추가할 수도 있습니다. 예를 들면 다음과 같습니다.
nmap <LocalLeader> <F11> <Plug> VimspectorUpFrame
nmap <LocalLeader> <F12> <Plug> VimspectorDownFrame
nmap <LocalLeader> B <Plug> VimspectorBreakpoints
nmap <LocalLeader> D <Plug> VimspectorDisassemble
이 섹션에서는 기능별로 구성된 자세한 사용 지침을 정의합니다. 대부분의 사용자에게 매핑 섹션에는 가장 일반적인 명령과 기본 사용법이 포함되어 있습니다. 이 섹션은 자신만의 매핑이나 사용자 정의 동작을 생성하기 위한 참조로 사용할 수 있습니다.
아래 지침은 모두 단일 디버깅 세션을 가정합니다. 여러 독립 앱을 동시에 디버깅하는 방법에 대한 자세한 내용은 [다중 디버깅 세션][#multiple-debugging-sessions]을 참조하세요.
.vimspector.json
만듭니다. 아래를 참조하세요.:call vimspector#Launch()
하고 구성을 선택합니다.새 세션을 시작하면 활성 [디버깅 세션][#다중 디버깅 세션]이 됩니다.
디버그 어댑터 구성이 pidProperty
사용하고 attach
요청하는 경우 연결할 PID(프로세스 ID)를 입력하라는 메시지가 표시됩니다.
이를 더 쉽게 하기 위해 Vimspector는 PID 나열을 위한 약간의 유틸리티를 제공합니다. 이는 매우 간단한 ps
복제와 비슷하지만 지원되는 모든 플랫폼에서 작동합니다. 설정에 대한 지침은 README를 참조하세요.
support/vimspector_process_list
디렉터리에서 go build
실행하여 설정하세요.
Vimspector가 이 앱을 찾을 수 있으면 기본적으로 현재 사용자가 소유한 모든 프로세스를 나열하려고 시도합니다.
또는 (바람직하게는) ${PickProcess("binaryName")}
이라는 특수한 형태의 변수 확장을 사용할 수 있습니다. 이 호출 버전은 이 바이너리 이름과 일치하는 현재 사용자의 모든 프로세스를 나열합니다.
예를 들어:
"Attach" : {
"adapter" : "CodeLLDB" ,
"configuration" : {
"request" : "attach" ,
"program" : "${workspaceRoot}/Jails" ,
"pid" : "${PickProcess("jails")}"
}
}
그러면 일치하는 각 프로세스, 상위 프로세스, 시작 시간 및 작업 디렉터리가 나열됩니다. 다음과 같이 보입니다.
PID PPID CWD START
52218 52217 (Python) /Users/ben/.vim/bundle/lsp-examples/jai/Jails 2023-05-22 16:02:24
Enter Process ID:
그런 다음 PID를 입력하고 <CR>
누르십시오.
프로세스 선택기를 자신만의 기능으로 대체할 수도 있습니다. 일부 함수를 정의하고 g:vimspector_custom_process_picker_func
해당 함수의 이름으로 설정하는 경우. PickProcess
확장 함수에 전달된 모든 인수가 전달됩니다. 또한 pidProperty
지정될 때마다 사용되므로 인수도 처리하지 않아야 합니다(함수의 공식 인수로 ...
를 사용합니다. :help ...
참조).
예를 들어 제공된 vimspector_process_list
와 함께 fzf
사용하려면 다음을 수행합니다.
function ! CustomPickProcess ( ... ) abort
let ps = $HOME .. ' /.vim/bundle/vimspector/support/vimspector_process_list/vimspector_process_list '
" a:0 is number of args
" a:1 is the optional binary name
if a: 0 > 0
let ps .= ' ^ ' . a: 1 . ' $ '
endif
let line_selected = fzf#run ( {
' source ' : ps ,
' options ' : ' --header-lines=1 '
. ' --prompt="Select Process: " '
,
} )[ 0 ]
if empty ( line_selected)
return 0
endif
let pid = split ( line_selected )[ 0 ]
return str2nr ( pid )
endfunction
let g: vimspector_custom_process_picker_func = ' CustomPickProcess '
또는 ps
출력과 함께 fzf
사용하려면 다음을 수행합니다.
function ! CustomPickProcess ( ... ) abort
let ps = ' ps aux '
let line_selected = fzf#run ( {
' source ' : ps ,
' options ' : ' --header-lines=1 '
. ' --prompt="Select Process: " '
,
} )[ 0 ]
if empty ( line_selected)
return 0
endif
let pid = split ( line_selected )[ 0 ]
return str2nr ( pid )
endfunction
let g: vimspector_custom_process_picker_func = ' CustomPickProcess '
특정 디버그 구성을 시작하거나 시작을 위한 대체 변수를 지정하려면 다음을 사용할 수 있습니다.
:call vimspector#LaunchWithSettings( dict )
인수는 다음 키가 포함된 dict
입니다.
configuration
: (선택 사항) 시작할 디버그 구성의 이름<anything else>
: (선택) 설정할 변수 이름 이를 통해 일부 통합 및 자동화가 가능합니다. 예를 들어 ${Test}
라는 대체 변수가 포함된 Run Test
라는 구성이 있는 경우 최종적으로 실행되는 매핑을 작성할 수 있습니다.
vimspector#LaunchWithSettings ( #{ configuration: ' Run Test '
Test: ' Name of the test ' } )
그러면 ${Test}
'Name of the test'
으로 설정된 Run Test
구성이 시작되고 Vimspector는 사용자에게 이러한 항목을 입력하거나 확인하라는 메시지를 표시하지 않습니다 .
Java 디버거를 연결할 포트를 지정하는 데 사용할 수 있는 또 다른 예는 YouCompleteMe 통합 가이드를 참조하세요.
임시 구성으로 시작하려면 다음을 사용할 수 있습니다.
call vimspector#LaunchWithConfigurations( dict )
인수는 .vimspector 파일의 configurations
섹션인 dict
입니다. 하나의 구성을 전달하면 해당 구성이 실행할 구성으로 선택됩니다. 예를 들어:
let pid = <some_expression>
call vimspector#LaunchWithConfigurations ({
" attach " : {
" adapter " : " netcoredbg " ,
" configuration " : {
" request " : " attach " ,
" processId " : pid
}
}
} )
그러면 디스크에 로컬 .vimspector 파일이 없어도 디버거가 실행되고 지정된 프로세스에 연결됩니다. ${workspaceRoot}
변수는 현재 vim에 열려 있는 파일의 상위 폴더를 가리킵니다.
Vimspector는 다음 논리를 사용하여 시작할 구성을 선택합니다.
autoselect
false
로 설정되어 있지 않은 경우 해당 구성을 사용하십시오.default
true
로 설정되고 autoselect
false
로 설정되지 않은 구성이 정확히 하나만 있는 경우 해당 구성을 사용합니다.자세한 내용은 참조 가이드를 참조하세요.
vimspector#GetConfigurations()
사용하여 현재 버퍼의 파일 형식에 대한 구성 목록을 가져옵니다.예를 들어, 일련의 구성과 결과에 대한 퍼지 일치를 얻으려면
: call matchfuzzy ( vimspector#GetConfigurations (), " test::case_1 " )
중단점 작업에 대한 기본 매핑은 매핑 섹션을 참조하세요. 이 섹션에서는 vimscript 함수의 전체 API에 대해 설명합니다.
중단점은 현재 [디버깅 세션][#다중 디버깅 세션]과 연결되어 있습니다. 세션 간 전환 시 이전 세션의 중단점 기호가 제거되고 새로 활성화된 세션의 중단점이 표시됩니다. 모든 세션의 중단점을 확인하는 것이 유용할 수 있지만 이는 매우 혼란스러울 수 있습니다.
:VimspectorBreakpoints
사용하거나 <Plug>VimspectorBreakpoints
에 무언가를 매핑하여 중단점 보기를 엽니다. 여기에서 중단점을 나열하고, 점프하여 삭제하고, 추가하고 전환할 수 있습니다.
중단점 창을 전환하려면 다음과 같은 매핑을 권장합니다.
nmap <Leader> db <Plug> VimspectorBreakpoints
중단점 창에는 기본적으로 다음 매핑이 적용됩니다.
t
, <F9>
- 토글, 즉 중단점 활성화/비활성화T
- 토글, 즉 모든 중단점 활성화/비활성화dd
, <Del>
- 현재 중단점 삭제cc
, C
- 현재 중단점 옵션 편집i
, a
, o
- 새로운 줄 중단점 추가I
, A
, O
- 새로운 함수 중단점 추가<Enter>
또는 두 번 클릭 - 줄 중단점으로 이동WinBar도 제공됩니다(지원되는 경우). 여기에는 세션 저장/복원, 모든 중단점 지우기, 예외 중단점 옵션 재설정과 같은 기능이 추가됩니다.
중단점의 가장 간단하고 일반적인 형태는 줄 중단점입니다. 지정된 라인이 실행되면 실행이 일시 중지됩니다.
대부분의 디버깅 시나리오에서 사용자는 <F9>
눌러 현재 줄에 줄 중단점을 만들고 <F5>
눌러 애플리케이션을 시작합니다.
일부 디버그 어댑터는 조건부 중단점을 지원합니다. vimspector는 디버거가 (아직) 조건부 중단점을 지원하지 않는지 여부를 알려주지 않습니다. 조건부 중단점은 일부 표현식이 true로 평가되거나 다른 제약 조건이 충족되는 경우에만 트리거되는 중단점입니다.
위의 함수 중 일부는 옵션 사전인 단일 선택적 인수를 사용합니다. 사전에는 다음과 같은 키가 있을 수 있습니다.
condition
: 중단점이 실행되어야 하는지 결정하기 위해 평가되는 선택적 표현식입니다. 모든 디버그 어댑터에서 지원되지는 않습니다. 예를 들어 abc
가 10
일 때 중단하려면 언어에 따라 abc == 10
과 같은 것을 입력합니다.hitCondition
: 중단점을 무시해야 하는 횟수를 결정하기 위해 평가되는 선택적 표현식입니다. (아마도?) condition
과 함께 사용하면 안 됩니다. 모든 디버그 어댑터에서 지원되지는 않습니다. 예를 들어, 이 줄을 세 번째 입력할 때 중단하려면 3
입력합니다.logMessage
: 대신 이 중단점을 "로그 지점"으로 만드는 선택적 문자열입니다. 트리거되면 실행을 중단하지 않고 이 메시지가 콘솔에 인쇄됩니다. {like this}
괄호 안에 표현식을 삽입할 수 있습니다(예: #{ logMessage: "Iteration {i} or {num_entries / 2}" }
각각의 경우 표현식은 디버거에 의해 평가되므로 표현식을 평가할 때 디버거가 이해하는 방언이 무엇이든 되어야 합니다.
<leader><F9>
매핑을 사용하는 경우 명령줄에 이러한 표현식을 입력하라는 메시지가 사용자에게 표시됩니다(기록 포함).
예외 중단점은 일반적으로 예외가 발생하거나 다른 오류 조건이 발생할 때 발생합니다. 디버거에 따라 디버깅을 시작할 때 예외 처리 방법에 대한 몇 가지 질문을 받을 수 있습니다. 이는 "예외 중단점"이며 vimspector는 Vim이 실행되는 동안 사용자의 선택을 기억합니다.
일반적으로 대부분의 디버그 어댑터 기본값은 정상이므로 기본값을 수락할 수 있습니다( <CR>
계속 누르십시오!). 그러나 중단하려면 uncaught exception
말한 다음 이에 대해 Y
로 대답하십시오(예를 들어).
.vimspector.json
에서 선택 사항을 구성할 수 있습니다. 이에 대한 자세한 내용은 구성 가이드를 참조하세요.
참고: 이전에는 ToggleBreakpoint가 활성화, 비활성화, 삭제의 3가지 상태 사이를 순환했습니다. 많은 사용자가 '비활성화' 상태가 거의 유용하지 않다고 생각하여 동작이 변경되었습니다. ToggleBreakpoint는 항상 중단점을 생성하거나 삭제합니다. 중단점을 '비활성화'하려면 중단점 창을 사용하고 거기에서 '토글'( t
)하십시오.
vimspector#ToggleBreakpoint( { options dict } )
사용하세요. 인수는 선택 사항입니다(아래 참조).vimspector#AddFunctionBreakpoint( '<name>', { options dict} )
사용하세요. 두 번째 인수는 선택 사항입니다(아래 참조).vimspector#SetLineBreakpoint( file_name, line_num, { options dict } )
사용하세요. 마지막 인수는 선택 사항입니다(아래 참조).vimspector#ClearLineBreakpoint( file_name, line_num )
사용하세요.vimspector#ClearBreakpoints()
사용하세요.vimspector#ResetExceptionBreakpoints()
사용하여 예외 중단점 구성을 지우고 "Break on C++ Throw"와 같은 다양한 질문에 다시 답하세요.:VimspectorMkSession
및 :VimspectorLoadSession
사용하세요.call vimspector#ListBreakpoints()
- 중단점 창 전환call vimspector#BreakpointsAsQuickFix()
- vim Quickfix 형식으로 현재 중단점 세트를 반환합니다.예:
call vimspector#ToggleBreakpoint()
- 현재 줄의 중단점을 전환합니다.call vimspector#SetLineBreakpoint( 'some_file.py', 10 )
- some_filepy:10
에 중단점을 설정합니다.call vimspector#AddFunctionBreakpoint( 'main' )
- main
함수에 함수 중단점을 추가합니다.call vimspector#ToggleBreakpoint( { 'condition': 'i > 5' } )
- i > 5
true
인 경우에만 트리거되는 중단점을 현재 줄에 추가합니다.call vimspector#SetLineBreakpoint( 'some_file.py', 10, { 'condition': 'i > 5' } )
- i > 5
true
인 경우에만 트리거되는 some_file.py:10
에 중단점을 추가합니다.call vimspector#ClearLineBreakpoint( 'some_file.py', 10 )
- some_file.py:10
에서 중단점을 삭제합니다.call vimspector#ClearBreakpoints()
- 모든 중단점 지우기VimspectorMkSession
- .vimspector.session
생성VimspectorLoadSession
- .vimspector.session
읽기VimspectorMkSession my_session_file
- my_session_file
생성VimspectorLoadSession my_session_file
- my_session_file
읽기참고 : 실험적인 기능으로, 사용자 피드백에 따라 향후 크게 변경될 수 있습니다.
코드 창에서 줄 중단점을 추가하는 것과 동일한 방식으로 디스어셈블리 창에서 명령어 중단점을 추가할 수 있습니다. 동일한 매핑과 기능이 추가 및 전환에 사용됩니다. 디버그 어댑터가 지원하는 경우 이 방식으로 로그 지점과 조건부 중단점을 생성할 수도 있습니다.
현재 명령 중단 점은 내부적으로 분해를 포함하는 버퍼에 대한 라인 브레이크 포인트로 모델링되지만 향후 변경 될 수 있으므로 이에 의존하지 마십시오.
명령 중단 점도 표시되며 중단 점에서 삭제/비활성화 할 수 있습니다.
현재 디버그 세션이 종료되면 명령 중단 점이 자동으로 지워집니다. 그 이유는 주소가 다른 디버그 세션에 유효 할 수 없기 때문입니다. 그러나 이것은 미래에도 변할 수 있습니다.
vimspector#ClearBreakpoints()
사용하여 예외 중단 점 선택 메모리를 포함한 모든 중단 점을 지우십시오.
vimspector#RunToCursor
또는 <leader><F8>
사용 : 현재 라인에서 임시 중단 점을 생성 한 다음 계속 실행을 계속하여 적중하면 중단 점을 지 웁니다.
vimspector#GoToCurrentLine()
사용하거나 <Plug>VimspectorGoToCurrentLine
에 대한 일부 매핑을 사용하여 현재 실행을 선으로 점프하십시오.
지원되는 경우 이것은 코드 섹션을 다시 실행하거나 완전히 건너 뛰는 데 유용 할 수 있습니다.
현재 라인에 가능한 여러 "대상"이 있으면 하나를 선택하라는 메시지가 표시됩니다.
vimspector는 세션 파일에 중단 점 (및 기타 물건)을 저장하고 복원 할 수 있습니다. 다음과 같은 명령이 있습니다.
VimspectorMkSession [file/dir name]
- 현재 라인 브레이크 포인트, 로그 포인트, 조건부 중단 점, 기능 중단 점 및 예외 브레이크 포인트 필터를 제공된 세션 파일 또는 제공된 디렉토리의 기본 파일에 저장하십시오.VimspectorLoadSession [file/dir name]
- 제공된 세션 파일 또는 제공된 디렉토리의 기본 파일에서 중단 점을 읽고 현재 설정된 중단 점을 바꾸십시오. 로드하기 전에 모든 현재 중단 점이 지워집니다 ( vimspector#ClearLineBreakpoints()
호출되는 것처럼). 두 경우 모두 파일/DIR 이름 인수는 선택 사항입니다. 기본적으로 파일은 .vimspector.session
이라는 이름이 지정되지만 g:vimspector_session_file_name
다른 것으로 설정하거나 명령을 호출 할 때 경로를 수동으로 지정하여 전역으로 변경할 수 있습니다. 디렉토리를 제공하는 경우 기본 또는 구성된 세션 파일 이름은 Fron 또는 해당 디렉토리에 작성됩니다. OTHEWISE, 파일은 현재 오픈 버퍼를 기준으로 읽거나 현재 작업 디렉토리에 기록됩니다.
고급 사용자는 예를 들어 VimEnter
및 VimLeave
AutoCommands를 추가하여 로딩 및 저장 프로세스를 자동화 할 수 있습니다. 이 경우 silent!
파일을 읽거나 쓸 수없는 경우 성가신 오류를 피하기 위해.
가장 간단한 자동화 형태는 세션 파일로 VIM을 시작할 때마다 vimspector 세션을로드하는 것입니다. 이것은 이것을하는 것만 큼 간단합니다.
$ echo silent VimspectorLoadSession > Sessionx.vim
*x.vim
파일에 대한 자세한 내용은 :help mksession
참조하십시오. SessionLoadPost
사용하여 이와 같은 작업을 수행 할 수도 있습니다.
autocmd SessionLoadPost * silent ! VimspectorLoadSession
vimspector#StepInto()
등입니다. vimspector#StepSOver()
및 vimspector#StepIOver()
등도 각각 명령문 및 명령 입상성에 대한 변형이 있습니다. <CR>
사용하거나 왼쪽 마우스를 두 번 클릭하여 확장/붕괴 (+, -).<C-CR>
(Control + <CR>
) 또는 <leader><CR>
로 설정하십시오 ( modifyOtherKeys
작동하지 않으면) 스코프와 변수는 버퍼 vimspector.Variables
로 표시됩니다.
변수와 시계에 대해 더 장점 디스플레이를 선호하는 경우 let g:vimspector_variables_display_mode = 'full'
할 수 있습니다. 기본적으로 이름과 값 만 표시되며, 마우스를 호버링하거나 변수 (또는 시계) 창의 값이 포함 된 줄에 <Plug>VimspectorBalloonEval
트리거하여 다른 데이터를 사용할 수 있습니다.
Variables and scopes
에 대한 모든 규칙과 다음과 함께 적용됩니다.
a + b
)의 시각적 선택을 수행하고 결과를 얻으십시오.<Plug>VimspectorBalloonEval
에 정상 모드 ( nmap
) 및 시각적 모드 ( xmap
) 매핑을 만듭니다.<C-CR>
(Control + <CR>
) 또는 <leader><CR>
로 설정하십시오 ( modifyOtherKeys
작동하지 않으면)j
, k
)를 사용하여 현재 선택을 선택하십시오. 툴팁을 닫으려면 <Esc>
(또는 툴팁 창을 남겨 두십시오). 디버그 세션을 시작하기 전에 g:vimspector_enable_auto_hover=0
설정하여 자동 호버링 팝업을 비활성화 할 수 있습니다. 그런 다음 무언가를 <Plug>VimspectorBalloonEval
에 매핑하고 수동으로 트리거 할 수 있습니다.
시계 창은 변수와 표현을 검사하는 데 사용됩니다. 표현식은 "집중"하는 선택된 스택 프레임에서 평가됩니다.
시계 창은 프롬프트 버퍼로 사용할 수 있습니다. 삽입 모드를 입력하여 새 시계 표현식을 추가하십시오.
<CR>
로 커밋하십시오.:VimspectorWatch <expression>
. 일부 디버그 어댑터에서는 표현식 탭 완성을 사용할 수 있습니다.<CR>
로 결과를 확장하거나 왼쪽 마우스로 두 번 클릭하십시오.<C-CR>
(Control + <CR>
) 또는 <leader><CR>
로 설정하십시오 ( modifyOtherKeys
작동하지 않으면)<DEL>
로 삭제하십시오. 시계는 버퍼 vimspector.Watches
로 표시됩니다.
변수와 시계에 대해 더 장점 디스플레이를 선호하는 경우 let g:vimspector_variables_display_mode = 'full'
할 수 있습니다. 기본적으로 이름과 값 만 표시되며, 마우스를 호버링하거나 변수 (또는 시계) 창의 값이 포함 된 줄에 <Plug>VimspectorBalloonEval
트리거하여 다른 데이터를 사용할 수 있습니다.
디버그 세션을 시작하기 전에 g:vimspector_enable_auto_hover=0
설정하여 자동 호버링 팝업을 비활성화 할 수 있습니다. 그런 다음 무언가를 <Plug>VimspectorBalloonEval
에 매핑하고 수동으로 트리거 할 수 있습니다.
시계 프롬프트 버퍼는 omnifunc
가 현재 표현식의 완성을 계산하는 함수로 설정되어 있습니다. 이것은 <Ctrl-x><Ctrl-o>
( :help ins-completion
참조)와 함께 사소하게 사용되거나 좋아하는 완료 시스템과 통합됩니다. 버퍼의 필터 타입은 VimspectorPrompt
로 설정됩니다.
YouCompleTeme의 경우 다음 구성이 잘 작동합니다.
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
:VimspectorDisassemble
, vimspector#ShowDisassembly()
또는 <Plug>VimspectorDisassemble
일부 디버그 어댑터 (소수!)는 분해를 지원합니다. 이것이 DAP에서 작동하는 방식은 약간 더 이상적이지만 실제로 Vimspector는 현재 스택 프레임의 PC 주변의 여러 지침을 분해하도록 요청할 것입니다. 그런 다음 코드 창과 비슷한 윈바가있는 창에 표시되지만 지시 사항이 세분화됩니다. 현재 명령에 대한 징후가 있으며 구문 Highighting 기본값은 "ASM"에 대한 표시가 있습니다.
위에서 언급 한 바와 같이, 현재 창이 분해 창이고 기본 "step"명령 (예 : <F10>
)을 사용하는 경우, 스테핑은 명령문이 아닌 교과서에 자동으로 chng니다.
프로세스가 멈출 때마다 VimSpector는 현재 PC 주변의 지침으로 가득 찬 약 2 개의 창을 요청합니다. 자세한 내용은 창을 스크롤 할 수 있습니다. vimspector는 창이 상단 또는 하단으로 스크롤 할 때 추가 스크린 지침으로 페이지를 표시합니다. 이것은 완벽하지 않습니다. 때로는 페이지를 만들기 위해 조금 더 스크롤해야합니다 (예 : Ctrl-e ctrl-y). 이것은 이상적이지 않으며 향후 개선 될 수 있습니다.
let g:vimspector_disassembly_height = 10
(또는 줄의 줄 수)로 분해 창의 강도 높이를 제어 할 수 있습니다.
분해 창에있는 버퍼의 필드 타입 (및 구문)은 vimspector-disassembly
입니다. FileType
AutoCommands를 사용하여 구문 강조 표시와 같은 것을 사용자 정의 할 수 있습니다.
참고 :이 기능은 실험적이며 사용자 피드백에 따라 어떤 식 으로든 변경 될 수 있습니다.
일부 디버그 어댑터는 변수와 관련된 프로세스 메모리를 덤프하는 방법을 제공합니다. 변수에서 수행 할 수 있으며 다음과 같은 Windows를 시청합니다.
<leader>m
매핑 (기본적으로 사용자 정의 할 수 있음)vimspector#ReadMemory()
함수 이 작업을 수행하면 여러 바이트를 입력하여 (현재 커서 라인과 관련된 위치에서) 해당 위치에서 오프셋을 읽습니다. xxd
의 출력과 유사한 16 진수 및 ASCII의 메모리 덤프가 포함 된 코드 창에 새 버퍼가 표시됩니다.
참고 :이 기능은 실험적이며 사용자 피드백에 따라 어떤 식 으로든 변경 될 수 있습니다.
스택 추적 창에는 각 프로그램 스레드의 상태가 표시됩니다. 중지 된 스레드를 확장하여 해당 스레드의 스택 추적을 표시 할 수 있습니다.
종종 항상 그렇지는 않지만, 중단 점이 맞으면 모든 스레드가 중지됩니다. 스레드의 상태는 스레드 이름 뒤에 괄호 안에 표시됩니다. 기본 디버거에 의해 지원되는 경우 스레드를 스택 추적 창 내에서 개별적으로 일시 중지하고 개별적으로 계속할 수 있습니다.
CursorLine
하이라이트 그룹으로 강조 표시된 특정 스레드는 "초점"스레드입니다. 이것은 코드 창에서 "Step In", "Step Out", "Contoint"및 "Pasion"과 같은 명령을받는 스레드입니다. 초점 스레드는 해당 스레드를 "전환"하도록 수동으로 변경할 수 있습니다.
<CR>
사용하거나 왼쪽 마우스를 두 번 클릭하여 스레드 스택 추적을 확장/축소하거나 Winbar 버튼을 사용하십시오.<CR>
사용하거나 스택 프레임에 왼쪽 마우스를 두 번 클릭하여 점프하십시오.vimspector#PauseContinueThread()
사용하여 선택한 스레드를 개별적으로 일시 중지하거나 계속하십시오.<leader><CR>
또는 vimspector#SetCurrentThread()
를 사용하여 "Focussed"스레드를 현재 선택한 스레드로 설정하십시오. 선택한 라인이 스택 프레임 인 경우 초점을 맞춘 스레드를 해당 프레임의 스레드로 설정하고 코드 창에서 해당 프레임으로 점프하십시오. 스택 추적은 버퍼 vimspector.StackTrace
로 표시됩니다.
Debugee가 하위 프로세스를 시작하는 위치와 같은 하위 디버그 세션이있는 경우 디버그 어댑터가 멀티 세션 디버깅을 지원하는 경우 각 세션의 스레드가 별도로 표시됩니다. 현재 활성화 된 세션은 현재 활성 스레드/스택 프레임으로 강조 표시된 세션입니다. 다른 세션으로 제어를 전환하려면 해당 세션 내에서 스레드를 집중하십시오.
참고 : 이것은 기존 세션의 어린이로 생성 된 세션을 말하며 [다중 (부모) 디버깅 세션] [#다중 데드 버깅 세션]과 혼동되지 않아야합니다.
:VimspectorShowOutput <category>
사용하십시오. 명령 줄 완료를 사용하여 범주를 확인하십시오. 출력 창이 닫히면 :VimspectorShowOutput <category>
(탭을 사용하여 옵션을보기 위해 wildmenu
)와 함께 새로운 창을 열 수 있습니다.
콘솔 창은 사용 가능한 프롬프트 버퍼이며 디버그 어댑터의 대화식 CLI로 사용할 수 있습니다. 이에 대한 지원은 어댑터마다 다릅니다.
:VimspectorEval <expression>
>. 일부 디버그 어댑터와 함께 완료를 사용할 수 있습니다.<CR>
로 요청을 커밋하십시오참고 : 위의 시계도 참조하십시오.
출력 창이 닫히면 :VimspectorShowOutput Console
로 새로운 창을 열 수 있습니다.
콘솔 프롬프트 버퍼는 omnifunc
가 현재 명령/표현식의 완료를 계산하는 함수로 설정되어 있습니다. 이것은 <Ctrl-x><Ctrl-o>
( :help ins-completion
참조)와 함께 사소하게 사용되거나 좋아하는 완료 시스템과 통합됩니다. 버퍼의 필터 타입은 VimspectorPrompt
로 설정됩니다.
YouCompleTeme의 경우 다음 구성이 잘 작동합니다.
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
vimspector 로그 파일에는 vimspector와 디버그 어댑터 간의 통신의 전체 추적이 포함되어 있습니다. 이것은 VIM 트레이스 백이 아닌 문제가 발생할 때 진단 정보의 주요 원인입니다.
vimspector 로그 파일을 보려면 다음을 사용하십시오 :VimspectorToggleLog
는 작은 창에서 꼬리가 있습니다 (Windows에서는 작동하지 않음).
:VimspectorDebugInfo
사용하여 디버깅 정보를 볼 수 있습니다
디버거를 닫으려면 사용하십시오.
Reset
:VimspectorReset
.call vimspector#Reset()
정지하거나 재설정 할 때 디버그가 여전히 실행중인 경우 일부 디버그 어댑터를 사용하면 디버깅을 완료 할 때 발생하는 일을 지정할 수 있습니다. 일반적으로 기본 동작은 합리적이며 대부분의 시간이 발생합니다. DAP에 따른 기본값입니다.
일부 디버그 어댑터를 사용하면 분리 할 때 수행 할 작업을 선택할 수 있습니다. 이 동작을 제어하려면 :VimspectorReset
사용하거나 vimspector#Reset( { 'interactive': v:true } )
사용하십시오. 디버그 어댑터가 디버그를 종료할지 여부를 선택할 수있는 경우 선택하라는 메시지가 표시됩니다. vimspector vimspector#Stop( { 'interactive': v:true } )
vimspector#Stop()
에 대해서도 동일하게 적용됩니다.
참고 :이 기능은 실험적 이며 사용자 피드백에 대한 응답으로 변경 될 수 있습니다.
VimSpector는 임의의 디버그 세션을 시작하는 것을 지원합니다. 각 세션은 개별 UI 탭과 관련이 있습니다. 일반적으로 단일 앱 만 디버깅하므로 이에 대해 생각할 필요가 없지만이 고급 기능은 여러 독립 응용 프로그램 또는 여러 개의 독립적 인 응용 프로그램 인스턴스를 동시에 디버깅 해야하는 경우 유용 할 수 있습니다.
언제든지 단일 "활성"루트 세션이 있습니다. 중단 점은 현재 세션과 관련이 있으며 모든 UI 및 API 명령은 현재 활성 세션에 적용됩니다.
루트 세션 사이를 전환하면 이전 세션의 중단 폰트 표시가 제거되고 새로 활성화 된 세션의 중단 점이 표시됩니다. 모든 세션에 대한 브레이크 포인트를 보는 것이 유용 할 수 있지만, 이것은 매우 혼란 스러울 수 있습니다.
일반적인 워크 플로는 다음과 같습니다.
:edit server.cc
<F5>
편집). 선택한 구성의 이름을 따서 명명 된 디버그 세션이 시작됩니다. :VimspectorRenameSession server
이름을 바꿀 수 있습니다.:tabedit client.cc
)client
이름을 지정하십시오. :VimspectorNewSession client
( client
이제 활성 세션입니다).client
세션에서 중단 점을 추가하고 <F5>
로 디버깅을 시작하십시오. 이제 2 개의 vimspector 탭이 있습니다. 직관적으로, 특정 탭으로 wwitching은 세션을 활성화시킬 것입니다. :VimspectorSwitchToSession <name>
로 활성 세션을 수동으로 전환 할 수도 있습니다.
따라서 요약하면 다음 시설이 있습니다.
VimspectorNewSession <name>
이것은 새로운 세션을 생성하고 활성화합니다. 옵션 이름은 출시를 시작할 때 생성 된 대신에 사용됩니다.VimspectorSwitchToSession <tab complete>
사용하여 수동으로 전환합니다.VimspectorRenameSession <new name>
의 이름/이름 바꾸기 세션VimspectorDestroySession <name>
사용하여 수동으로 파괴 할 수 있습니다 (용감한 경우). 실행/활성 세션을 파괴 할 수 없습니다.vimspector#GetSessionName()
상태 라인을 넣는 데 유용합니다. 기술자를위한 vimspector#GetSessionID()
도 있습니다. 다음은 statusline
에 현재 세션 이름을 표시하는 방법에 대한 예입니다 ( :help statusline
또는 멋진 상태 라인 플러그인에 대한 문서 참조).
function ! StlVimspectorSession ()
" Only include in buffers containing actual files
if ! empty ( & buftype )
return ' '
endif
" Abort if vimspector not loaded
if ! exists ( ' *vimspector#GetSessionName ' ) ||
! exists ( ' *vimspector#GetSessionID ' )
return ' '
endif
return vimspector#GetSessionName ()
.. ' ( '
.. vimspector#GetSessionID ()
.. ' ) '
endfunction
" ... existing statusline stuff
" set statusline=...
" Show the vimspector active session name (max 20 chars) if there is onw.
set statusline += % ( % . 20 { StlVimspectorSession ()} % )
.vimspector.json
의 구성을 소개하려면 VimSpector 웹 사이트의 시작 섹션을 살펴보십시오.
변수 사용 방법, 대체 및 예외 중단 점을 지정하는 방법을 포함한 전체 설명은 문서를 참조하십시오.
JSON 구성 파일은 C 스타일의 주석을 허용합니다.
// comment to end of line ...
/* inline comment ... */
현재 다음 디버그 어댑터로 테스트되었습니다.
예 .vimspector.json
( vscode-cpptools
및 lldb-vscode
와 함께 작동합니다. lldb-vscode
의 경우 어댑터의 이름을 lldb-vscode
로 바꾸십시오.
{
"configurations" : {
"Launch" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " <path to binary> " ,
"args" : [ ... ],
"cwd" : " <working directory> " ,
"environment" : [ ... ],
"externalConsole" : true ,
"MIMode" : " <lldb or gdb> "
}
},
"Attach" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " attach " ,
"program" : " <path to binary> " ,
"MIMode" : " <lldb or gdb> "
}
}
// ...
}
}
Windows 사용자의 경우 : gdb.exe
설치해야합니다. scoop install gdb
사용하는 것이 좋습니다. Vimspector는 라이센스로 인해 Visual Studio Debugger를 사용할 수 없습니다.
{
"configurations" : {
"Launch" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " <path to binary> " ,
"stopAtEntry" : true
}
}
}
}
백엔드에 따라 복잡한 유형을 수동으로 인쇄 할 수 있어야합니다.
LLDB : 예쁜 인쇄는 기본적으로 활성화됩니다
GDB : GDB Prett Printer를 활성화하려면 아래 스 니펫을 고려하십시오. .gdbinit에서 set print pretty on
것만으로는 충분하지 않습니다!
{
"configurations" : {
"Launch" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " <path to binary> " ,
// ...
"MIMode" : " gdb " ,
"setupCommands" : [
{
"description" : " Enable pretty-printing for gdb " ,
"text" : " -enable-pretty-printing " ,
"ignoreFailures" : true
}
]
}
}
}
}
CPPTools 문서는 miDebuggerAddress
사용하여 CPPTools를 GDBSERVER에 첨부하는 방법을 설명합니다. 이 작업을 수행 할 때 "request": "attach"
사용해야합니다.
화려하다고 느끼면 Vimspector가 원격으로 시작하고 첨부하도록하는 예를 보려면 참조 안내서를 확인하십시오.
CodellDB는 적어도 MACOS에서 여러 가지 방법으로 VSCODE-CPPTOOLS보다 우수합니다.
녹 참조.
대안은 llvm과 함께 제공되는 lldb-vscode
사용하는 것입니다. 방법은 다음과 같습니다.
brew install llvm
)/path/to/vimspector/gadgets/macos/.gadgets.d/lldb-vscode.json
이라는 파일을 만듭니다. {
"adapters" : {
"lldb-vscode" : {
"variables" : {
"LLVM" : {
"shell" : " brew --prefix llvm "
}
},
"attach" : {
"pidProperty" : " pid " ,
"pidSelect" : " ask "
},
"command" : [
" ${LLVM}/bin/lldb-vscode "
],
"env" : {
"LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY" : " YES "
},
"name" : " lldb "
}
}
}
Rust는 모든 GDB/LLDB 기반 디버거로 지원됩니다. 따라서 위의 vscode-cpptools
및 lldb-vscode
에서 잘 작동합니다. 그러나 Rust에 대한 지원은 CodeLLDB
에서 가장 좋습니다.
./install_gadget.py --enable-rust
또는 :VimspectorInstall CodeLLDB
support/test/rust/vimspector_test
{
"configurations" : {
"launch" : {
"adapter" : " CodeLLDB " ,
"filetypes" : [ " rust " ],
"configuration" : {
"request" : " launch " ,
"program" : " ${workspaceRoot}/target/debug/vimspector_test "
}
},
"attach" : {
"adapter" : " CodeLLDB " ,
"filetypes" : [ " rust " , " c " , " cpp " , " jai " ],
"configuration" : {
"request" : " attach " ,
"program" : " ${workspaceRoot}/${fileBasenameNoExtension} " ,
"PID" : " ${PID} "
}
}
}
}
"request": "custom"
사용할 수 없습니다 - 이것은 유효하지 않습니다. 대신 "request": "launch", "custom": true
사용하십시오. 이유 때문에cargo
과의 모든 통합은 VScode JavaScript Madness에서 수행되므로 지원되지 않습니다."request": custom
사용합니다. 위의 "사용자 정의"에 대한 요점을 참조하십시오step-into
inabling) "sourceMap": { "from_path" : "to_path" }
. "from_path"
스택 트레이스에서 올라가서 분해 창에서 찾을 수 있습니다. "to_path"
는 현재 툴체인을위한 로컬로 설치된 표준 라이브러리 경로 일뿐입니다. JAI 디버깅은 다른 원주민 디버거와 잘 어울립니다. CodellDB를 추천하지만 CPPTools도 작동합니다.
예:
{
"$schema" : "https://puremourning.github.io/vimspector/schema/vimspector.schema.json" ,
"adapters" : {
"gdb-with-build" : {
"extends" : "vscode-cpptools" ,
"variables" : {
"buildme" : {
"shell" : "jai ${workspaceRoot}/build.jai"
}
}
} ,
"codelldb-with-build" : {
"extends" : "CodeLLDB" ,
"variables" : {
"buildme" : {
"shell" : "jai ${workspaceRoot}/build.jai"
}
}
}
} ,
"configurations" : {
"Run - gdb" : {
"adapter" : "gdb-with-build" ,
"filetypes" : [ "jai" ] ,
"configuration" : {
"request" : "launch" ,
"program" : "${workspaceRoot}/${binaryName}" ,
"args" : [ "*${args}" ] ,
"stopAtEntry" : true ,
"stopOnEntry" : true
}
} ,
"Run - lldb" : {
"extends" : "Run - gdb" ,
"filetypes" : [ "jai" ] ,
"adapter" : "codelldb-with-build"
} ,
"Attach - gdb" : {
"adapter" : "vscode-cpptools" ,
"filetypes" : [ "jai" ] ,
"configuration" : {
"request" : "attach" ,
"program" : "${workspaceRoot}/${binaryName}" ,
"processId" : "${PID}"
}
} ,
"Attach - lldb" : {
"extends" : "Attach - gdb" ,
"filetypes" : [ "jai" ] ,
"adapter" : "CodeLLDB" ,
"configuration" : {
"pid" : "${PID}"
}
}
}
}
파이썬 : 디버시
install_gadget.py --enable-python
또는 :VimspectorInstall debugpy
와 함께 설치하려면 작업 컴파일러와 Python Development Headers/Libs가 필요합니다.
참고 : Debugpy는 더 이상 Python 2를 지원하지 않습니다. Python 2 응용 프로그램을 계속 디버그하려면 debugpy-python2
가제트를 설치 한 후 debugpy-python2
어댑터를 사용하십시오.
전체 옵션 : https://github.com/microsoft/debugpy/wiki/debug-configuration-settings
{
"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> "
}
}
...
}
}
Debugpy와 함께 원격 디버깅을 사용하려면 VimSpector를 디버깅중인 응용 프로그램에 직접 연결해야합니다. 이것은 쉽지만 일반적으로 사물을 구성하는 방식과 조금 다릅니다. 구체적으로 : 당신은 다음을 필요로합니다.
--listen
명단 인수를 지정하여 Debugpy를 사용하여 응용 프로그램을 시작하십시오. 자세한 내용은 디버시 문서를 참조하십시오.{
"configurations" : {
"Python Attach" : {
"adapter" : " multi-session " ,
"filetypes" : [ " python " ], // optional
"configuration" : {
"request" : " attach " ,
"pathMappings" : [
// mappings here (optional)
]
}
}
}
}
pathMappings
와 같은 것들에 대한 설명은 시작 구성에 대한 자세한 내용을 참조하십시오.
원격 시스템을 SSH를 통해서만 연락 할 수있는 방법을 포함한 추가 문서는 Debugpy에서 제공합니다.
화려하다고 느끼면 Vimspector가 원격으로 시작하고 첨부하도록하는 예를 보려면 참조 안내서를 확인하십시오.
Python 2 애플리케이션을 계속 디버그하려면 debugpy-python2
가제트 (예 : --force-enable-python2
또는 :VimspectorInstall debugpy-python2
)를 설치 한 다음 구성을 변경하십시오.
{
"configurations" : {
"Python Attach" : {
"adapter" : " debugpy-python2 " ,
// ...
}
}
}
시험을 위해
지침은 TCLPRODEBUG 포크를 참조하십시오.
install_gadget.py --force-enable-csharp
또는 :VimspectorInstall netcoredbg
로 설치하십시오
{
"configurations" : {
"launch - netcoredbg" : {
"adapter" : " netcoredbg " ,
"filetypes" : [ " cs " , " fsharp " , " vbnet " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " ${workspaceRoot}/bin/Debug/netcoreapp2.2/csharp.dll " ,
"args" : [],
"stopAtEntry" : true ,
"cwd" : " ${workspaceRoot} " ,
"env" : {}
}
}
}
}
필수 :
install_gadget.py --enable-go
또는 :VimspectorInstall delve
go 1.16
이상 (이전 버전의 YMMV)이것은 디버거 디버거를 위해 내장 된 DAP 지원을 사용합니다.
{
"configurations" : {
"run" : {
"adapter" : " delve " ,
"filetypes" : [ " go " ], // optional
"variables" : {
// example, to disable delve's go version check
// "dlvFlags": "--check-go-version=false"
},
"configuration" : {
"request" : " launch " ,
"program" : " ${fileDirname} " ,
"mode" : " debug "
}
}
}
}
변수를 사용하여 다음을 구성하십시오.
dlvFlags
: (문자열) 추가 명령 줄 인수를 통과 할 수 있습니다.디버거 (Devugger)는 터미널 창에서 시작되어 출력 및 패스 입력을 디버그로 확인할 수 있습니다.
전체 출시 옵션은 VScode-Go 문서를 참조하십시오. 그렇습니다. 그것이 문서화 된 유일한 곳인 것 같습니다 (분명히, 그들은 Devve 자체에 의해 문서화되어 있지 않습니다).
VSCODE-GO 문서에는 유용한 문제 해결 정보가 있습니다
필수 :
install_gadget.py --enable-go
또는 :VimspectorInstall vscode-go
go get -u github.com/go-delve/delve/cmd/dlv
dlvToolPath
런칭 옵션을 지정하십시오.참고 : VimSpector는 Delve의 "내장"DAP 지원 대신 "레거시"VSCODE-GO 디버그 어댑터를 사용합니다. 이를 위해 #186을 추적 할 수 있습니다.
{
"configurations" : {
"run" : {
"adapter" : " vscode-go " ,
"filetypes" : [ " go " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " ${fileDirname} " ,
"mode" : " debug " ,
"dlvToolPath" : " $HOME/go/bin/dlv "
// example, to disable delve's go version check
// "dlvFlags": [ "--check-go-version=false" ]
}
}
}
}
문제 해결 정보는 VScode-Go 문서를 참조하십시오
이것은 PHP-debug를 사용합니다. https://marketplace.visualstudio.com/items?itemname=felixfbecker.php-debug를 참조하십시오
필수 :
install_gadget.py --force-enable-php
또는 :VimspectorInstall vscode-php-debug
zend_extension =xdebug.so
xdebug.remote_enable =on
xdebug.remote_handler =dbgp
xdebug.remote_host =localhost
xdebug.remote_port =9000
localhost
워크 스테이션의 IP로 교체하십시오.
게으른 대안
zend_extension =xdebug.so
xdebug.remote_enable =on
xdebug.remote_handler =dbgp
xdebug.remote_connect_back =true
xdebug.remote_port =9000
{
"configurations" : {
"Listen for XDebug" : {
"adapter" : " vscode-php-debug " ,
"filetypes" : [ " php " ], // optional
"configuration" : {
"name" : " Listen for XDebug " ,
"type" : " php " ,
"request" : " launch " ,
"port" : 9000 ,
"stopOnEntry" : false ,
"pathMappings" : {
"/var/www/html" : " ${workspaceRoot} "
}
}
},
"Launch currently open script" : {
"adapter" : " vscode-php-debug " ,
"filetypes" : [ " php " ], // optional
"configuration" : {
"name" : " Launch currently open script " ,
"type" : " php " ,
"request" : " launch " ,
"program" : " ${file} " ,
"cwd" : " ${fileDirname} " ,
"port" : 9000
}
}
}
}
쿼리 문자열에 XDEBUG_SESSION_START=xdebug
추가하십시오
curl "http://localhost?XDEBUG_SESSION_START=xdebug"
또는 이전에 언급 된 XDEBUG 헬퍼 확장 ( XDEBUG_SESSION
쿠키를 설정)을 사용하십시오.
export XDEBUG_CONFIG= " idekey=xdebug "
php < path to script >
VSCODE에서도 사용되는 디버거 인 VSCODE-JS-DEBUG를 사용합니다. 추가 구성은 여기에서 문서를 확인하십시오.
vscode-js-debug를 설치하려면 vim에서 VimspectorInstall vscode-js-debug
실행하거나 설치 스크립트 install_gadget.py --force-enable-node
실행하십시오. 체크 아웃 할 수있는 여러 가지 예가 있습니다. support/test/node/simple
, support/test/node/multiprocess
및 support/test/node/typescript
에서 찾으십시오. Debugging TypeScript를위한 일반적인 구성은 다음과 같습니다.
{
"configurations" : {
"run - js-debug" : {
"adapter" : " js-debug " ,
"filetypes" : [ " javascript " , " typescript " ],
"configuration" : {
"request" : " launch " ,
"program" : " ${workspaceRoot}/src/index.ts " ,
"cwd" : " ${workspaceRoot} " ,
"stopOnEntry" : false ,
"type" : " pwa-node "
},
// 'breakpoints' is an optional part. This is a way to configure exception
// breakpoints. You can leave this out or set as you prefer.
"breakpoints" : {
"exception" : {
"all" : " N " ,
"uncaught" : " N "
}
}
}
}
}
vscode-js-debug
여러 가지 다른 "유형"을 지원하며 작동하거나 작동하지 않을 수도있는 일을 수행 할 수 있습니다. type
필드는 슬프게도 문서화되지 않지만 유효한 값은 Debugtype 열거에서 여기에 정의되어 있습니다.
VimSpector는 pwa-node
유형으로 만 테스트되었습니다.
또한 어떤 이유로이 디버그 어댑터는 항상 여러 디버그 세션을 시작해야합니다. 사용자의 경우 아무것도 변경해서는 안됩니다 (아마도 약간 혼란스러운 스택 추적 이외). 그러나 그것은 일을 더 복잡하게 만들므로 미묘한 버그가있을 수 있습니다.
이것은 Chrome/Firefox 디버거를 사용합니다 (매우 유사합니다), https://marketplace.visualstudio.com/items?itemname=msjsdiag.debugger-for-chrome 및 https://marketplace.visualstudio.com/itemname을 참조하십시오. = Firefox-DevTools.VScode-FireFox-Debug.
VIM 내에서 Chrome 내부에서 실행되는 스크립트를 디버그 할 수 있습니다.
./install_gadget.py --force-enable-chrome
또는 :VimspectorInstall debugger-for-chrome
./install_gadget.py --force-enable-firefox
또는 :VimspectorInstall debugger-for-firefox
support/test/web
{
"configurations" : {
"chrome" : {
"adapter" : " chrome " ,
"configuration" : {
"request" : " launch " ,
"url" : " http://localhost:1234/ " ,
"webRoot" : " ${workspaceRoot}/www "
}
},
"firefox" : {
"adapter" : " firefox " ,
"configuration" : {
"request" : " launch " ,
"url" : " http://localhost:1234/ " ,
"webRoot" : " ${workspaceRoot}/www " ,
"reAttach" : true
}
}
}
}
VimSpector는 독립형 디버그 어댑터가 아닌 JDT.LS (Java Language Server) 플러그인으로 실행되는 Java Debug Server와 잘 작동합니다.
Vimspector는 언어 서버를 실행하는 비즈니스에 있지 않으며 디버그 어댑터 만 있으므로 Java를 사용하려면 호환 언어 서버 프로토콜 편집자 플러그인이 필요합니다. JDT.LS를 완전히 지원하는 YouCompleTeme을 권장하며 가장 중요한 것은 디버그 어댑터를로드하고 VimSpector와 함께 사용하는 사소한 방법입니다.
Java Debug 서버를 사용하는 경우 Vimspector는 핫 코드 교체 사용자 정의 기능을 지원합니다. 기본적으로 기본 클래스 파일이 변경되면 VimSpector는 런타임에 이러한 클래스를 다시로드 하려는지 사용자에게 묻습니다.
이 동작은 사용자 정의 할 수 있습니다.
let g:vimspector_java_hotcodereplace_mode = 'ask'
.let g:vimspector_java_hotcodereplace_mode = 'always'
let g:vimspector_java_hotcodereplace_mode = 'never'
install_gadget.py --force-enable-java <other options...>
또는 :VimspectorInstall java-debug-adapter
vscode-java
어댑터를 사용하여 프로젝트에 대한 vimspector를 구성하십시오. {
"configurations" : {
"Java Attach" : {
"adapter" : " vscode-java " ,
"filetypes" : [ " java " ],
"configuration" : {
"request" : " attach " ,
"hostName" : " ${host} " ,
"port" : " ${port} " ,
"sourcePaths" : [
" ${workspaceRoot}/src/main/java " ,
" ${workspaceRoot}/src/test/java "
]
}
}
}
}
gadgets/<os>
디렉토리 여야합니다. 예를 들어 .vimrc
" Tell YCM where to find the plugin. Add to any existing values.
let g: ycm_java_jdtls_extension_path = [
' </path/to/Vimspector/gadgets/<os> '
]
~/.vim/ftplugin/java.vim
<leader><F5>
같은 매핑을 만듭니다. let s: jdt_ls_debugger_port = 0
function ! s: StartDebugging ()
if s: jdt_ls_debugger_port <= 0
" Get the DAP port
let s: jdt_ls_debugger_port = youcompleteme#GetCommandResponse (
' ExecuteCommand ' ,
' vscode.java.startDebugSession ' )
if s: jdt_ls_debugger_port == ' '
echom " Unable to get DAP port - is JDT.LS initialized? "
let s: jdt_ls_debugger_port = 0
return
endif
endif
" Start debugging with the DAP port
call vimspector#LaunchWithSettings ( { ' DAPPort ' : s: jdt_ls_debugger_port } )
endfunction
nnoremap <silent> <buffer> <Leader><F5> :call <SID> StartDebugging() <CR>
그런 다음 <F5>
가 아닌 <Leader><F5>
사용하여 디버깅을 시작할 수 있습니다.
"DAP 포트를 얻을 수 없음 -Jdt.ls가 초기화 되었습니까?"가있는 경우, :YcmCompleter ExecuteCommand vscode.java.startDebugSession
사용하고 출력을 기록해보십시오. ResponseFailedException: Request failed: -32601: No delegateCommandHandler for vscode.java.startDebugSession
: 다음과 같습니다.
g:ycm_java_jdtls_extension_path
는 .vimrc
또는 ycm 시작하기 전에 설정됩니다.시작 인수는 VSCODE 문서를 참조하십시오.
더 많은 배경은이 문제를 참조하십시오.
LUA는 Local-Lua-Debugger-VScode를 통해 지원됩니다. 이 디버거는 STDIO를 사용하여 실행중인 프로세스와 통신하므로 io.read
로의 호출은 문제를 일으 킵니다.
./install_gadget.py --enable-lua
또는 :VimspectorInstall local-lua-debugger-vscode
support/test/lua/simple
및 support/test/lua/love
{
"$schema" : " https://puremourning.github.io/vimspector/schema/vimspector.schema.json# " ,
"configurations" : {
"lua" : {
"adapter" : " lua-local " ,
"filetypes" : [ " lua " ],
"configuration" : {
"request" : " launch " ,
"type" : " lua-local " ,
"cwd" : " ${workspaceFolder} " ,
"program" : {
"lua" : " lua " ,
"file" : " ${file} "
}
}
},
"luajit" : {
"adapter" : " lua-local " ,
"filetypes" : [ " lua " ],
"configuration" : {
"request" : " launch " ,
"type" : " lua-local " ,
"cwd" : " ${workspaceFolder} " ,
"program" : {
"lua" : " luajit " ,
"file" : " ${file} "
}
}
},
"love" : {
"adapter" : " lua-local " ,
"filetypes" : [ " love " ],
"configuration" : {
"request" : " launch " ,
"type" : " lua-local " ,
"cwd" : " ${workspaceFolder} " ,
"program" : {
"command" : " love "
},
"args" : [ " ${workspaceFolder} " ]
}
}
}
}
UI의 사용자 정의에 대한 지원은 매우 제한적입니다.
Vimsector는 내부적으로 다음 징후를 사용합니다. Vimsector가 사용하기 전에 정의되면 교체되지 않습니다. 따라서 표지판을 사용자 정의하려면 vimrc
에서 표시를 정의하십시오.
징후 | 설명 | 우선 사항 |
---|---|---|
vimspectorBP | 라인 중단 점 | 9 |
vimspectorBPCond | 조건부 라인 중단 점 | 9 |
vimspectorBPLog | 로그 포인트 | 9 |
vimspectorBPDisabled | 비활성화 된 중단 점 | 9 |
vimspectorPC | 프로그램 카운터 (즉, 현재 라인) | 200 |
vimspectorPCBP | 프로그램 카운터 및 중단 점 | 200 |
vimspectorNonActivePC | 중점이 아닌 스레드에 대한 프로그램 카운터 | 9 |
vimspectorCurrentThread | 스택 추적보기에서 집중 스레드 | 200 |
vimspectorCurrentFrame | 스택 추적보기의 현재 스택 프레임 | 200 |
기본 기호는 다음과 같은 것과 같습니다.
sign define vimspectorBP text = ● texthl = WarningMsg
sign define vimspectorBPCond text = ◆ texthl = WarningMsg
sign define vimspectorBPLog text = ◆ texthl = SpellRare
sign define vimspectorBPDisabled text = ● texthl = LineNr
sign define vimspectorPC text = ▶ texthl = MatchParen linehl = CursorLine
sign define vimspectorPCBP text = ●▶ texthl = MatchParen linehl = CursorLine
sign define vimspectorNonActivePC linehl = DiffAdd
sign define vimspectorCurrentThread text = ▶ texthl = MatchParen linehl = CursorLine
sign define vimspectorCurrentFrame text = ▶ texthl = Special linehl = CursorLine
표지판이 제대로 표시되지 않으면 글꼴 에이 글리프가 포함되어 있지 않을 수 있습니다. VIMRC의 부호를 정의하여 쉽게 변경할 수 있습니다. 예를 들어, 이것을 vimrc
에 넣어 간단한 ASCII 기호를 사용할 수 있습니다.
sign define vimspectorBP text = o texthl = WarningMsg
sign define vimspectorBPCond text = o ? texthl = WarningMsg
sign define vimspectorBPLog text = !! texthl = SpellRare
sign define vimspectorBPDisabled text = o ! texthl = LineNr
sign define vimspectorPC text = > texthl = MatchParen
sign define vimspectorPCBP text = o > texthl = MatchParen
sign define vimspectorCurrentThread text = > texthl = MatchParen
sign define vimspectorCurrentFrame text = > texthl = Special
많은 다른 플러그인은 다양한 목적으로 표시를 제공합니다. 예를 들어 코드 오류에 대한 진단 표시 등이 포함됩니다. VIM은 단일 라인에 배치 될 때 어떤 부호를 표시 해야하는지 결정하기 위해 단일 우선 순위 만 제공합니다. 다른 징후가 vimspector (또는 그 반대로)를 방해한다는 것을 알게되면 다음 사전을 설정하여 Vimspector에서 사용하는 우선 순위를 사용자 정의 할 수 있습니다.
let g: vimspector_sign_priority = {
' <sign-name> ' : <priority> ,
}
예를 들어:
let g: vimspector_sign_priority = {
' vimspectorBP ' : 3 ,
' vimspectorBPCond ' : 3 ,
' vimspectorBPLog ' : 3 ,
' vimspectorBPDisabled ' : 3 ,
' vimspectorNonActivePC ' : 3 ,
' vimspectorPC ' : 999 ,
' vimspectorPCBP ' : 999 ,
}
모든 키는 선택 사항입니다. 부호가 사용자 정의되지 않으면 사용한 기본 우선 순위 (위와 같이).
참조 :help sign-priority
. 기본 우선 순위는 10이고 더 큰 숫자는 작은 것보다 재정의입니다.
참고 : 기본 vimspectorNonActivePC
부호는 부호 열에 텍스트를 추가하지 않으며 단순히 다른 스레드 나 프로세스가 중지되는 줄을 볼 수 있도록 라인 하이라이트를 추가합니다. 결과적 으로이 부호는 일반적으로 기호를 추가하는 부호 (예 : 중단 점 부호)와 병합 해야합니다. VIM은 기본 우선 순위를 변경하는 경우 다음을 권장합니다.
vimspectorBP
, vimspectorBPCond
등)는 우선 순위가 동일합니다.vimspectorNonActivePC
표시를 동일한 우선 순위로 설정했습니다vimspectorPC
, vimspectorPCBP
등)는 우선 순위가 높습니다. 참고 : 이 사용자 정의 지점은 현재 알 수 없으며 언제든지 변경 될 수 있습니다.
때로는 디버그 어댑터가 UI가 특정 물건을 어떻게 표시 해야하는지에 대한 힌트를 제공합니다. 여기에는 스택 프레임, 변수 등이 포함됩니다.
VimSpector는 사전 g:vimsepctor_presentation_hint_hl
에서 값을 설정하여 이들이 표시되는 방식을 사용자 정의하는 간단한 방법을 제공합니다.
다음 키는 언급 된 기본 하이라이트 그룹과 함께 지원됩니다.
그룹 | 열쇠 | 용법 | 기본 |
---|---|---|---|
모두 | normal | 아래에 다루지 않은 것 | Normal |
스택 추적 | emphasize | 스택 트레이스의 소스를 강조하십시오 | Title |
스택 추적 | deemphasize | 스택 트레이스의 소스를 강조하십시오 | Conceal |
스택 추적 | label | 실제 프레임을 나타내지 않고 "레이블"인 스택 프레임 | NonText |
스택 추적 | subtle | 내부이거나 흥미롭지 않은 스택 프레임 | Conceal |
스코프 | arguments | 기능 인수 범위 | Title |
스코프 | locals | 로컬 변수 범위 | Title |
스코프 | registers | 스코프를 등록합니다 | Title |
변수 | property | 기능 인수 범위 | Identifier |
변수 | method | 로컬 변수 범위 | Function |
변수 | class | 스코프를 등록합니다 | Type |
변수 | data | 스코프를 등록합니다 | String |
또한 DAP VariablePresentationHint
에 제공된 값을 설정할 수 있으며 디버그 어댑터에서 제공하면 사용됩니다.
어리석은 예; 기본값은 아마도 대부분의 색상 scehemes에 대해 괜찮을 것입니다.
let g: vimspector_presentation_hint_hl = {
' normal ' : ' Identifier ' ,
' label ' : ' Title ' ,
}
참고 :이 사용자 정의 API는 불안정 하므로 언제든지 변경 될 수 있습니다. 나는 이것의 영향을 줄이고 Gitter의 변화를 발표하기 위해 노력할 것입니다.
다음 옵션은 UI 창의 기본 크기를 제어합니다 (모두 숫자입니다)
g:vimspector_sidebar_width
(기본값 : 50 열) : 왼쪽 유틸리티 창의 열의 너비 (변수, 시계, 스택 추적)g:vimspector_bottombar_height
(기본 10 줄) : 코드 창 아래의 출력 창의 높이.예:
let g: vimspector_sidebar_width = 75
let g: vimspector_bottombar_height = 15
The terminal is typically created as a vertical split to the right of the code window, and that window is re-used for subsequent terminal buffers. The following control the sizing of the terminal window used for debuggee input/output when using Vim's built-in terminal.
g:vimspector_code_minwidth
(default: 82 columns): Minimum number of columns to try and maintain for the code window when splitting to create the terminal window.g:vimspector_terminal_maxwidth
(default: 80 columns): Maximum number of columns to use for the terminal.g:vimspector_terminal_minwidth
(default: 10 columns): Minimum number of columns to use when it is not possible to fit g:vimspector_terminal_maxwidth
columns for the terminal. That's a lot of options, but essentially we try to make sure that there are at least g:vimspector_code_minwidth
columns for the main code window and that the terminal is no wider than g:vimspector_terminal_maxwidth
columns. g:vimspector_terminal_minwidth
is there to ensure that there's a reasonable number of columns for the terminal even when there isn't enough horizontal space to satisfy the other constraints.
예:
let g: vimspector_code_minwidth = 90
let g: vimspector_terminal_maxwidth = 75
let g: vimspector_terminal_minwidth = 20
It's useful to be able to define mappings only while debugging and remove those mappings when debugging is complete. For this purpose, Vimspector provides 2 User
autocommands:
VimspectorJumpedToFrame
- triggered whenever a 'break' event happens, or when selecting a stack from to jump to. This can be used to create (for example) buffer-local mappings for any files opened in the code window.VimspectorDebugEnded
- triggered when the debug session is terminated (actually when Vimspector is fully reset) An example way to use this is included in support/custom_ui_vimrc
. In there, these autocommands are used to create buffer-local mappings for any files visited while debugging and to clear them when completing debugging. This is particularly useful for commands like <Plug>VimspectorBalloonEval
which only make sense while debugging (and only in the code window). Check the commented section Custom mappings while debugging
.
NOTE: This is a fairly advanced feature requiring some nontrivial vimscript. It's possible that this feature will be incorporated into Vimspector in future as it is a common requirement.
In many cases you will want to rebuild your project before starting a new debugging session. Vimspector is not a task manager and implementing this functionality is out of the scope of this project. However, there are some strategies described in the community wiki to achieve similar functionality.
You can tell vimspector not to draw the WinBar (the toolbars in the code, variables, output, etc. windows) by setting:
let g: vimspector_enable_winbar = 0
The WinBar is in any case not displayed if the mouse is not enabled.
Please Note : This customisation API is unstable , meaning that it may change at any time. I will endeavour to reduce the impact of this and announce changes in Gitter.
The above customisation of window sizes is limited intentionally to keep things simple. Vimspector also provides a way for you to customise the UI without restrictions, by running a User
autocommand just after creating the UI or opening the terminal. This requires you to write some vimscript, but allows you to do things like:
You can essentially do anything you could do manually by writing a little vimscript code.
The User
autocommand is raised with pattern
set with the following values:
VimspectorUICreated
: Just after setting up the UI for a debug sessionVimspectorTerminalOpened
: Just after opening the terminal window for program input/output. The following global variable is set up for you to get access to the UI elements: g:vimspector_session_windows
. This is a dict
with the following keys:
g:vimspector_session_windows.tabpage
: The tab page for the sessiong:vimspector_session_windows.variables
: Window ID of the variables window, containing the vimspector.Variables
buffer.g:vimspector_session_windows.watches
: Window ID of the watches window, containing the vimspector.Watches
buffer.g:vimspector_session_windows.stack_trace
: Window ID of the stack trade window containing the vimspector.StackTrace
buffer.g:vimspector_session_windows.code
: Window ID of the code window.g:vimspector_session_windows.output
: Window ID of the output window. In addition, the following key is added when triggering the VimspectorTerminalOpened
event:
g:vimspector_session_windows.terminal
: Window ID of the terminal window You can even customise the WinBar buttons by simply running the usual menu
(and unmenu
) commands.
By default, Vimspector uses something a bit like this:
nnoremenu WinBar.■ Stop : call vimspector#Stop ( { ' interactive ' : v: false } ) <CR>
nnoremenu WinBar.▶ Cont : call vimspector#Continue () <CR>
nnoremenu WinBar.▷ Pause : call vimspector#Pause () <CR>
nnoremenu WinBar.↷ Next : call vimspector#StepOver () <CR>
nnoremenu WinBar.→ Step : call vimspector#StepInto () <CR>
nnoremenu WinBar.← Out : call vimspector#StepOut () <CR>
nnoremenu WinBar.⟲: : call vimspector#Restart () <CR>
nnoremenu WinBar.✕ : call vimspector#Reset ( { ' interactive ' : v: false } ) <CR>
If you prefer a different layout or if the unicode symbols don't render correctly in your font, you can customise this in the VimspectorUICreated
autocommand, for example:
func ! CustomiseUI ()
call win_gotoid ( g: vimspector_session_windows .code )
" Clear the existing WinBar created by Vimspector
nunmenu WinBar
" Create our own WinBar
nnoremenu WinBar.Kill : call vimspector#Stop ( { ' interactive ' : v: true } ) <CR>
nnoremenu WinBar. Continue : call vimspector#Continue () <CR>
nnoremenu WinBar.Pause : call vimspector#Pause () <CR>
nnoremenu WinBar. Step Over : call vimspector#StepOver () <CR>
nnoremenu WinBar. Step In : call vimspector#StepInto () <CR>
nnoremenu WinBar. Step Out : call vimspector#StepOut () <CR>
nnoremenu WinBar.Restart : call vimspector#Restart () <CR>
nnoremenu WinBar.Exit : call vimspector#Reset () <CR>
endfunction
augroup MyVimspectorUICustomistaion
autocmd !
autocmd User VimspectorUICreated call s: CustomiseUI ()
augroup END
There is some example code in support/custom_ui_vimrc
showing how you can use the window IDs to modify various aspects of the UI using some basic vim commands, primarily win_gotoid
function and the wincmd
ex command.
To try this out vim -Nu support/custom_ui_vimrc <some file>
.
Here's a rather smaller example. A simple way to use this is to drop it into a file named my_vimspector_ui.vim
in ~/.vim/plugin
(or paste into your vimrc
):
" Set the basic sizes
let g: vimspector_sidebar_width = 80
let g: vimspector_code_minwidth = 85
let g: vimspector_terminal_minwidth = 75
function ! s: CustomiseUI ()
" Customise the basic UI...
" Close the output window
call win_gotoid ( g: vimspector_session_windows .output )
q
endfunction
function s: SetUpTerminal ()
" Customise the terminal window size/position
" For some reasons terminal buffers in Neovim have line numbers
call win_gotoid ( g: vimspector_session_windows . terminal )
set norelativenumber nonumber
endfunction
augroup MyVimspectorUICustomistaion
autocmd !
autocmd User VimspectorUICreated call s: CustomiseUI ()
autocmd User VimspectorTerminalOpened call s: SetUpTerminal ()
augroup END
.vimspector.json
. As you can see above, some of the servers aren't really editor agnostic, and require very-specific unique handling. See the wiki for details on additional language support.vimspector.json
? Yes, see here..vimspector.json
, or could it be the current vim file? You don't need to. You can specify $file for the current active file. See here for complete list of replacements in the configuration file..vimspector.json
, but Vim highlights these as errors, do you know how to make this not-an-error? Yes, put this in ~/.vim/after/syntax/json.vim
: syn region jsonComment start = " / * " end = " * / "
hi link jsonCommentError Comment
hi link jsonComment Comment
gadget
and an adapter
? A gadget is something you install with :VimspectorInstall
or install_gadget.py
, an adapter
is something that Vimspector talks to (actually it's the Vimspector config describing that thing). These are usually one-to-one, but in theory a single gadget can supply multiple adapter
configs. Typically this happens when a gadget
supplies different adapter
config for, say remote debugging, or debugging in a container, etc..vimspector.json
in the root of every project? No, you can use g:vimspector_adapters
and g:vimspector_configurations
or put all of your adapter and debug configs in a single directory if you want to, but note the caveat that ${workspaceRoot}
won't be calculated correctly in that case. The vimsepctor author uses this a lotvimspector#LaunchWithSettings( { 'ThePID': the_pid_i_picked } )
. Alternatively, you could use a shell
variable to guess the PID, like this (which runs pgrep vim | sort | tail -1
to get the 'highest' PID of the command to be debugged (NOTE: this is for debugging Vim. replace with something appropriate to your actual use case. If this doesn't make sense to you, you might be better off just typing in the PID). "Attach: max PID" : {
"adapter" : " CodeLLDB " ,
"variables" : {
"pid" : {
"shell" : [
" /bin/bash " ,
" -c " ,
" pgrep vim | sort | tail -1 "
]
}
},
"configuration" : {
"request" : " attach " ,
"program" : " ${workspaceRoot}/src/vim " ,
"expressions" : " native " ,
"stopOnEntry#json" : " ${StopOnEntry:true} " ,
"pid" : " ${pid} "
}
},
Example g:vimspector_adapters
and g:vimspector_configurations
:
let g: vimspector_adapters = #{
test_debugpy: #{ extend s: ' debugpy ' }
}
let g: vimspector_configurations = {
" test_debugpy_config " : {
" adapter " : " test_debugpy " ,
" filetypes " : [ " python " ],
" configuration " : {
" request " : " launch " ,
" type " : " python " ,
" cwd " : " ${fileDirname} " ,
" args " : [],
" program " : " ${file} " ,
" stopOnEntry " : v: false ,
" console " : " integratedTerminal " ,
" integer " : 123 ,
},
" breakpoints " : {
" exception " : {
" raised " : " N " ,
" uncaught " : " " ,
" userUnhandled " : " "
}
}
} }