Untuk tutorial dan ikhtisar penggunaan, lihat situs web Vimspector.
Untuk penjelasan mendetail tentang format .vimspector.json
, lihat panduan referensi.
Plugin ini adalah debugger grafis Vim yang mampu untuk berbagai bahasa. Ini sebagian besar diuji untuk C++, Python dan TCL, tetapi secara teori mendukung bahasa apa pun yang didukung Visual Studio Code (tetapi lihat peringatan).
Situs web Vimspector memiliki ikhtisar UI, bersama dengan petunjuk dasar untuk konfigurasi dan pengaturan.
Namun untuk saat ini, inilah tangkapan layar (yang agak lama) dari Vimspector yang men-debug Vim:
Dan beberapa demo singkat:
<Plug>VimspectorBalloonEval
)Tabel berikut mencantumkan bahasa yang "bawaan" (bersama dengan dependensi runtime-nya). Mereka dikategorikan berdasarkan tingkat dukungannya:
Tested
: Didukung sepenuhnya, tes regresi Vimspector mencakupnyaSupported
: Didukung penuh, sering digunakan dan diuji secara manualExperimental
: Berfungsi, tetapi tidak sering digunakan dan jarang diujiLegacy
: Tidak lagi didukung, harap migrasikan konfigurasi AndaRetired
: Tidak lagi disertakan atau didukung.Bahasa | Status | Beralih (untuk install_gadget.py ) | Adaptor (untuk :VimspectorInstall ) | Ketergantungan |
---|---|---|---|---|
C, C++, Karat, Jai, dll. | Diuji | --all atau --enable-c (atau cpp) | vscode-cpptools | mono-inti |
C, C++, Karat, Jai, dll. | Diuji | --enable-rust , --enable-c , dll. | KodeLLDB | tidak ada |
ular piton | Diuji | --all atau --enable-python | debugpy | ular piton 3 |
Pergi | Diuji | --enable-go | menggali | Mulai 1,16+ |
TCL | Didukung | --all atau --enable-tcl | tclpro | TCL 8.5 |
Bourne Shell | Didukung | --all atau --enable-bash | vscode-bash-debug | pesta v?? |
Lua | Diuji | --all atau --enable-lua | lokal-lua-debugger-vscode | Node >=12.13.0, Npm, juru bahasa Lua |
Node.js | Didukung | --force-enable-node | vscode-js-debug | Simpul >= 18 |
skrip java | Didukung | --force-enable-chrome | debugger-untuk-chrome | krom |
skrip java | Didukung | --force-enable-firefox | vscode-firefox-debug | Firefox |
Jawa | Didukung | --force-enable-java | vscode-java-debug | Plugin LSP yang kompatibel (lihat nanti) |
PHP | Eksperimental | --force-enable-php | vscode-php-debug | Simpul, PHP, XDEBUG |
C# (inti dotnet) | Diuji | --force-enable-csharp | netcoredbg | Inti DotNet |
F#, VB, dll. | Didukung | --force-enable-[fsharp,vbnet] | netcoredbg | Inti DotNet |
Pergi (warisan) | Warisan | --enable-go | vscode-pergi | Node, Ayo, Selidiki |
ular piton 2 | Warisan | --force-enable-python2 | debugpy-python2 | ular piton 2.7 |
Vimspector harus berfungsi untuk adaptor debug apa pun yang berfungsi di Visual Studio Code.
Untuk menggunakan Vimspector dengan bahasa yang bukan "bawaan", lihat halaman wiki ini.
Ada 2 metode instalasi:
:help packages
.packadd! vimspector
ke .vimrc
Anda.vimspector.json
, atau setel g:vimspector_configurations
) - lihat panduan referensiPeriksa dependensinya
Lihat dokumen pengelola plugin dan instal plugin. Untuk Vundle, gunakan:
Plugin ' puremourning/vimspector '
Pasang beberapa 'gadget' (adaptor debug) - lihat di sini untuk perintah pemasangan dan pilih gadget yang akan dipasang
Konfigurasikan profil debug proyek Anda (buat .vimspector.json
, atau setel g:vimspector_configurations
) - lihat panduan referensi
Bagian berikut ini memperluas gambaran singkat di atas.
Vimspector membutuhkan:
Versi Linux yang mana? Saya hanya menguji di Ubuntu 20.04 dan yang lebih baru dan RHEL 7.
neovim tidak mengimplementasikan balon mouse hover. Sebaliknya ada pemetaan <Plug>VimspectorBalloonEval
. Tidak ada pemetaan default untuk ini, jadi saya merekomendasikan sesuatu seperti ini untuk mendapatkan tampilan variabel dalam popup:
" 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
Fitur berikut ini tidak diterapkan untuk Windows:
Jika Anda hanya ingin mencoba vimspector tanpa mengubah konfigurasi vim Anda, ada contoh proyek untuk sejumlah bahasa di support/test
, termasuk:
Untuk menguji salah satunya, cd ke direktori dan jalankan:
vim -Nu /path/to/vimspector/tests/vimrc --cmd "let g:vimspector_enable_mappings='HUMAN'"
Lalu tekan <F5>
.
Ada juga proyek C++ di tests/testdata/cpp/simple/
dengan Makefile
yang dapat digunakan untuk memeriksa semuanya berfungsi. Ini digunakan oleh uji regresi di CI sehingga harus selalu berfungsi, dan merupakan cara yang baik untuk memeriksa apakah masalahnya adalah konfigurasi Anda, bukan bug.
Ada banyak pengelola plugin Vim, dan saya tidak akan menyatakan preferensi tertentu, jadi jika Anda memilih untuk menggunakannya, ikuti dokumentasi pengelola plugin. Misalnya, untuk Vundle, gunakan:
Plugin ' puremourning/vimspector '
Jika Anda belum menggunakan manajer plugin, instal vimspector sebagai paket Vim dengan mengkloning repositori ini ke jalur paket Anda, seperti ini:
$ git clone https://github.com/puremourning/vimspector ~/.vim/pack/vimspector/opt/vimspector
.vimrc
Anda, misalnya untuk mengaktifkan pemetaan standar: let g: vimspector_enable_mappings = ' HUMAN '
.vimrc
Anda setelah mengonfigurasi vimspector: packadd! vimspector
Lihat support/doc/example_vimrc.vim
untuk contoh minimal.
Vimspector adalah klien umum untuk Adaptor Debug. Adaptor Debug (disebut sebagai 'gadget' atau 'adaptor') adalah apa yang sebenarnya berfungsi untuk berkomunikasi dengan debugger sebenarnya.
Agar Vimspector berguna, Anda perlu menginstal beberapa adaptor.
Ada beberapa cara untuk melakukan ini:
:VimspectorInstall <adapter> <args...>
(gunakan TAB wildmenu
untuk melihat opsi, juga menerima opsi install_gadget.py
apa pun)python3 install_gadget.py <args>
(gunakan --help
untuk melihat semua opsi):VimspectorUpdate
untuk menginstal gadget versi terbaru yang didukung.Berikut demo melakukan beberapa instalasi dan peningkatan:
Baik install_gadget.py
dan :VimspectorInstall
melakukan serangkaian hal yang sama, meskipun perilaku defaultnya sedikit berbeda. Untuk bahasa yang didukung, mereka akan:
gadgetDir
untuk platform.Misalnya, untuk menginstal adaptor debug yang diuji untuk suatu bahasa, jalankan:
Untuk menginstal | Naskah | Memerintah |
---|---|---|
<adapter> | :VimspectorInstall <adapter> | |
<adapter1> , <adapter2> , ... | :VimspectorInstall <adapter1> <adapter2> ... | |
<language> | ./install_gadget.py --enable-<language> ... | :VimspectorInstall --enable-<language> ... |
Adaptor yang didukung | ./install_gadget.py --all | :VimspectorInstall --all |
Adaptor yang didukung, tetapi tidak TCL | ./install_gadget.py --all --disable-tcl | :VimspectorInstall --all --disable-tcl |
Adaptor yang didukung dan eksperimental | ./install_gadget.py --all --force-all | :VimspectorInstall --all |
Adaptor untuk konfigurasi debug tertentu | Disarankan oleh Vimspector saat memulai debugging |
:VimspectorInstall
menjalankan install_gadget.py
di latar belakang dengan beberapa opsi default.
:VimspectorUpdate
menjalankan install_gadget.py
untuk menginstal ulang (yaitu memperbarui) gadget apa pun yang sudah terpasang di .gadgets.json
Anda.
Outputnya minimal, untuk melihat output lengkap tambahkan --verbose
ke perintah, seperti pada :VimspectorInstall --verbose ...
atau :VimspectorUpdate --verbose ...
.
Jika instalasi berhasil, jendela keluaran ditutup (dan keluaran hilang selamanya). Gunakan !
untuk tetap membukanya (misalnya :VimspectorInstall! --verbose --all
atau :VimspectorUpdate!
(dll.).
Jika Anda mengetahui sebelumnya gadget mana yang ingin Anda pasang, misalnya agar Anda dapat mereproduksi konfigurasi dari kontrol sumber, Anda dapat menyetel g:vimspector_install_gadgets
ke daftar gadget. Ini akan digunakan ketika:
:VimspectorInstall
tanpa argumen, atau:VimspectorUpdate
Misalnya:
let g: vimspector_install_gadgets = [ ' debugpy ' , ' vscode-cpptools ' , ' CodeLLDB ' ]
Secara default install_gadget.py
akan menimpa .gadgets.json
Anda dengan kumpulan adaptor yang baru saja diinstal, sedangkan :VimspectorInstall
akan memperbaruinya , hanya menimpa adaptor yang baru diubah atau diinstal.
Jika Anda hanya ingin menambahkan adaptor baru menggunakan skrip tanpa merusak adaptor yang sudah ada, tambahkan --update-gadget-config
, seperti pada:
$ ./install_gadget.py --enable-tcl
$ ./install_gadget.py --enable-rust --update-gadget-config
$ ./install_gadget.py --enable-java --update-gadget-config
Jika Anda ingin mempertahankan configurations
di luar repositori vimspector (ini dapat berguna jika Anda memiliki gadget khusus atau konfigurasi global), Anda dapat meminta penginstal untuk menggunakan basis yang berbeda, lalu atur g:vimspector_base_dir
untuk menunjuk ke direktori tersebut, misalnya :
$ ./install_gadget.py --basedir $HOME /.vim/vimspector-config --all --force-all
Kemudian tambahkan ini ke .vimrc
Anda:
let g: vimspector_base_dir = expand ( ' $HOME/.vim/vimspector-config ' )
Saat menggunakan :VimspectorInstall
, pengaturan g:vimspector_base_dir
dipatuhi kecuali --basedir
ditambahkan secara manual (tidak disarankan).
Lihat --help
untuk informasi selengkapnya tentang berbagai opsi.
Jika bahasa yang ingin Anda debug tidak ada dalam daftar yang didukung di atas, Anda mungkin masih dapat membuatnya berfungsi, namun memerlukan lebih banyak usaha.
Pada dasarnya Anda perlu mendapatkan instalasi adaptor debug yang berfungsi, mencari tahu cara memulainya, dan mengonfigurasinya di entri adapters
di .vimspector.json
atau di .gadgets.json
atau di g:vimspector_adapters
Anda.
Cara paling sederhana dalam praktiknya adalah menginstal atau memulai Visual Studio Code dan menggunakan manajer ekstensinya untuk menginstal ekstensi yang relevan. Anda kemudian dapat mengonfigurasi adaptor secara manual di bagian adapters
di .vimspector.json
atau di gadgets.json
atau di g:vimspector_adapters
.
PR selalu dapat menambahkan bahasa yang didukung (yang secara kasar berarti memperbarui python/vimspector/gadgets.py
dan mengujinya).
Vimspector menggunakan direktori berikut secara default untuk mencari file bernama .gadgets.json
: </path/to/vimspector>/gadgets/<os>
.
Jalur ini ditampilkan sebagai variabel vimspector ${gadgetDir}
. Ini berguna untuk mengonfigurasi baris perintah gadget.
Dimana os adalah salah satu dari:
macos
linux
windows
(meskipun catatan: Windows tidak didukung) Formatnya sama dengan .vimspector.json
, tetapi hanya kunci adapters
yang digunakan:
Contoh:
{
"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 "
}
}
}
File gadget secara otomatis ditulis dengan install_gadget.py
(atau :VimspectorInstall
).
Vimspector juga akan memuat file apa pun yang cocok: </path/to/vimspector>/gadgets/<os>/.gadgets.d/*.json
. Ini memiliki format yang sama dengan .gadgets.json
tetapi tidak ditimpa saat menjalankan install_gadget.py
.
Setelah memperbarui kode Vimspector (baik melalui git pull
atau manajer paket apa pun), jalankan :VimspectorUpdate
untuk memperbarui gadget yang sudah terpasang.
Motivasinya adalah bahwa debugging di Vim adalah pengalaman yang sangat buruk, terutama jika Anda menggunakan banyak bahasa. Dengan tidak adanya lagi pyclewn dan plugin termdebug bawaan terbatas pada gdb, saya ingin menjelajahi opsi.
Meskipun Protokol Server Bahasa sudah terkenal, Protokol Adaptor Debug kurang dikenal, tetapi mencapai tujuan yang sama: API agnostik bahasa mengabstraksi debugger dari klien.
Tujuan dari proyek ini adalah untuk memberikan pengalaman debugging yang sederhana namun efektif di Vim untuk berbagai bahasa, dengan memanfaatkan adaptor debug yang sedang dibangun untuk Visual Studio Code.
Kemampuan untuk melakukan debugging jarak jauh adalah suatu keharusan. Ini adalah kunci alur kerja saya, jadi memasukkannya ke dalam pengalaman debugging adalah tujuan utama proyek ini. Jadi vimspector memiliki dukungan kelas satu untuk menjalankan program dari jarak jauh dan melampirkannya. Dukungan ini unik untuk vimspector dan di atas (pelengkap) dukungan apa pun di adaptor debug sebenarnya.
Vimspector adalah vim UI di atas Protokol Adaptor Debug. Ini dimaksudkan untuk menjadi tingkat tinggi dan nyaman untuk tugas debugging sehari-hari.
Vimspector bukan:
Vimspector masih dalam proses, dan masukan/kontribusi apa pun sangat kami harapkan.
Backlog dapat dilihat di Trello.
Plugin ini saat ini masih bersifat eksperimental . Artinya, setiap bagian dapat (dan mungkin akan) berubah, termasuk hal-hal seperti:
Namun, saya berkomitmen untuk hanya melakukan ini dalam kasus yang paling ekstrim dan mengumumkan perubahan tersebut pada Gitter jauh sebelumnya. Tidak ada yang lebih menyebalkan daripada hal-hal yang menghancurkan Anda. Saya mengerti.
Pesan dari penulis tentang motivasi plugin ini:
Banyak lingkungan pengembangan memiliki debugger bawaan. Saya menghabiskan banyak sekali waktu saya di Vim. Saya melakukan semua pengembangan saya di Vim dan saya bahkan telah menyesuaikan alur kerja saya untuk membuat kode, menjalankan tes, dll.
Selama bertahun-tahun saya telah mengamati diri saya sendiri, teman dan kolega telah menulis
printf
,puts
,Saya benar-benar percaya bahwa lingkungan debugging grafis yang interaktif adalah cara terbaik untuk memahami dan mempertimbangkan kode yang asing dan familiar, dan bahwa kurangnya akses yang mudah dan siap pakai ke debugger merupakan lubang produktivitas besar yang tersembunyi bagi banyak orang.
Jangan salah paham, saya tahu ada jutaan pengembang di luar sana yang lebih dari kompeten dalam mengembangkan tanpa debugger grafis, tapi saya berpendapat bahwa jika mereka memiliki kemampuan untuk cukup menekan tombol dan melompat ke debugger, itu akan terjadi. akan lebih cepat dan lebih menyenangkan daripada sekadar pemahaman kode otak.
Saya membuat Vimspector karena menurut saya perubahan alat membuat frustrasi.
gdb
untuk c++,pdb
untuk python, dll. Masing-masing memiliki sintaksnya sendiri. Masing-masing leksikonnya sendiri. Masing-masing memiliki kelemahannya sendiri.Saya merancang sistem konfigurasi sedemikian rupa sehingga konfigurasi dapat dikomit ke kontrol sumber sehingga dapat berfungsi untuk kolega, teman, kolaborator, atau orang asing mana pun.
Saya menjadikan debugging jarak jauh sebagai fitur kelas satu karena itu adalah kasus penggunaan utama bagi saya dalam pekerjaan saya.
Dengan Vimspector saya cukup menekan
<F5>
dalam semua bahasa yang saya kembangkan dan melakukan debug secara lokal atau jarak jauh menggunakan alur kerja, pemetaan, dan UI yang sama persis. Saya telah mengintegrasikan ini dengan Vim saya sedemikian rupa sehingga saya dapat menekan tombol dan menjalankan tes di bawah kursor di Vimspector . Integrasi semacam ini telah meningkatkan alur kerja dan produktivitas saya secara signifikan. Itu bahkan membuat proses mempelajari basis kode baru... menyenangkan.- Ben Jackson, Pencipta.
Apache 2.0
Hak Cipta © 2018 Ben Jackson
Jika Anda sangat menyukai Vimspector sehingga Anda bersedia membagi uang hasil jerih payah Anda, mohon pertimbangkan untuk berdonasi ke salah satu badan amal berikut, yang berarti bagi penulis Vimspector (sesuai urutan preferensi):
Secara default, vimspector tidak mengubah pemetaan Anda. Pemetaan bersifat sangat pribadi sehingga Anda harus menentukan apa yang Anda suka dan menggunakan fitur pemetaan canggih vim untuk mengatur pemetaan Anda sendiri. Untuk itu, Vimspector mendefinisikan pemetaan <Plug>
berikut:
Pemetaan | Fungsi | API |
---|---|---|
<Plug>VimspectorContinue | Saat melakukan debug, lanjutkan. Jika tidak, mulailah men-debug. | vimspector#Continue() |
<Plug>VimspectorStop | Hentikan proses debug. | vimspector#Stop() |
<Plug>VimpectorRestart | Mulai ulang debugging dengan konfigurasi yang sama. | vimspector#Restart() |
<Plug>VimspectorPause | Jeda debug. | vimspector#Pause() |
<Plug>VimspectorBreakpoints | Menampilkan/menyembunyikan jendela breakpoints | vimspector#ListBreakpoints() |
<Plug>VimspectorToggleBreakpoint | Alihkan breakpoint baris pada baris saat ini. | vimspector#ToggleBreakpoint() |
<Plug>VimspectorToggleConditionalBreakpoint | Alihkan breakpoint garis bersyarat atau logpoint pada baris saat ini. | vimspector#ToggleBreakpoint( { trigger expr, hit count expr } ) |
<Plug>VimspectorAddFunctionBreakpoint | Tambahkan titik henti fungsi untuk ekspresi di bawah kursor | vimspector#AddFunctionBreakpoint( '<cexpr>' ) |
<Plug>VimspectorGoToCurrentLine | Reset penghitung program saat ini ke baris saat ini | vimspector#GoToCurrentLine() |
<Plug>VimspectorRunToCursor | Jalankan ke Kursor | vimspector#RunToCursor() |
<Plug>VimspectorStepOver | Melangkahi | vimspector#StepOver() |
<Plug>VimspectorStepInto | Melangkah Ke | vimspector#StepInto() |
<Plug>VimspectorStepOut | Keluar dari cakupan fungsi saat ini | vimspector#StepOut() |
<Plug>VimspectorDisassemble | Tampilkan pembongkaran. Aktifkan loncatan instruksi | vimspector#ShowDisassembly() |
<Plug>VimspectorUpFrame | Pindahkan bingkai ke atas dalam tumpukan panggilan saat ini | vimspector#UpFrame() |
<Plug>VimspectorDownFrame | Pindahkan bingkai ke bawah dalam tumpukan panggilan saat ini | vimspector#DownFrame() |
<Plug>VimspectorJumpToNextBreakpoint | Pindahkan Kursor ke breakpoint berikutnya di file saat ini | vimspector#JumpToNextBreakpoint() |
<Plug>VimspectorJumpToPreviousBreakpoint | Pindahkan Kursor ke breakpoint sebelumnya di file saat ini | vimspector#JumpToPreviousBreakpoint() |
<Plug>VimspectorJumpToProgramCounter | Pindahkan Kursor ke penghitung program di frame saat ini | vimspector#JumpToProgramCounter() |
<Plug>VimspectorBalloonEval | Evaluasi ekspresi di bawah kursor (atau visual) di popup | intern |
Ini memetakan kira-kira 1-1 dengan fungsi API di bawah.
Misalnya, jika Anda ingin <F5>
memulai/melanjutkan debugging, tambahkan ini ke beberapa tempat yang sesuai, seperti vimrc
Anda (petunjuk: run :e $MYVIMRC
).
nmap <F5> <Plug> VimspectorContinue
Selain itu, banyak pengguna mungkin hanya ingin mengaktifkan pemetaan Vimspector tertentu saat proses debug aktif. Hal ini juga dimungkinkan, meskipun memerlukan penulisan beberapa vimscipt.
Meskipun demikian, banyak orang yang familiar dengan debugger tertentu, sehingga pemetaan berikut dapat diaktifkan dengan menyetel g:vimspector_enable_mappings
ke nilai yang ditentukan.
Untuk menggunakan pemetaan seperti Visual Studio, tambahkan yang berikut ini ke vimrc
Anda sebelum memuat vimspector :
let g: vimspector_enable_mappings = ' VISUAL_STUDIO '
Kunci | Pemetaan | Fungsi |
---|---|---|
F5 | <Plug>VimspectorContinue | Saat melakukan debug, lanjutkan. Jika tidak, mulailah men-debug. |
Shift F5 | <Plug>VimspectorStop | Hentikan proses debug. |
Ctrl Shift F5 | <Plug>VimspectorRestart | Mulai ulang debugging dengan konfigurasi yang sama. |
F6 | <Plug>VimspectorPause | Jeda debug. |
F8 | <Plug>VimspectorJumpToNextBreakpoint | Lompat ke breakpoint berikutnya di file saat ini. |
Shift F8 | <Plug>VimspectorJumpToPreviousBreakpoint | Lompat ke breakpoint sebelumnya di file saat ini. |
F9 | <Plug>VimspectorToggleBreakpoint | Alihkan breakpoint baris pada baris saat ini. |
Shift F9 | <Plug>VimspectorAddFunctionBreakpoint | Tambahkan titik henti fungsi untuk ekspresi di bawah kursor |
F10 | <Plug>VimspectorStepOver | Melangkahi |
Ctrl F10 | <Plug>VimspectorRunToCursor | Jalankan ke kursor* |
F11 | <Plug>VimspectorStepInto | Melangkah Ke |
Shift F11 | <Plug>VimspectorStepOut | Keluar dari cakupan fungsi saat ini |
Alt 8 | <Plug>VimspectorDisassemble | Tampilkan pembongkaran |
CATATAN: Beberapa pemetaan, seperti tombol ctrl dan F mungkin tidak berfungsi tergantung pada terminal, keyboard, sistem windowing, dan hal-hal lainnya. Lihat :help modifyOtherKeys
dan sumber lainnya. Jika Anda tidak dapat melakukan ini, cukup gunakan pemetaan "mode manusia".
Jika, seperti saya, Anda hanya memiliki 2 tangan dan 10 jari, Anda mungkin tidak menyukai tombol Ctrl-Shift-F. Selain itu, jika Anda menjalankan terminal, ada kemungkinan terminfo salah untuk tombol F yang digeser, terutama jika TERM
Anda adalah screen-256color
. Jika masalah ini (jumlah tangan, variabel TERM
) tidak dapat diperbaiki, coba pemetaan berikut, dengan menambahkan berikut ini sebelum memuat vimspector :
let g: vimspector_enable_mappings = ' HUMAN '
Kunci | Pemetaan | Fungsi |
---|---|---|
F5 | <Plug>VimspectorContinue | Saat melakukan debug, lanjutkan. Jika tidak, mulailah men-debug. |
F3 | <Plug>VimspectorStop | Hentikan proses debug. |
F4 | <Plug>VimspectorRestart | Mulai ulang debugging dengan konfigurasi yang sama. |
F6 | <Plug>VimspectorPause | Jeda debug. |
F9 | <Plug>VimspectorToggleBreakpoint | Alihkan breakpoint baris pada baris saat ini. |
<leader>F9 | <Plug>VimspectorToggleConditionalBreakpoint | Alihkan breakpoint garis bersyarat atau logpoint pada baris saat ini. |
F8 | <Plug>VimspectorAddFunctionBreakpoint | Tambahkan titik henti fungsi untuk ekspresi di bawah kursor |
<leader>F8 | <Plug>VimspectorRunToCursor | Jalankan ke Kursor |
F10 | <Plug>VimspectorStepOver | Melangkahi |
F11 | <Plug>VimspectorStepInto | Melangkah Ke |
F12 | <Plug>VimspectorStepOut | Keluar dari cakupan fungsi saat ini |
Selain itu, saya sarankan menambahkan pemetaan ke <Plug>VimspectorBalloonEval
, dalam mode normal dan visual, misalnya:
" 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
Anda mungkin juga ingin menambahkan pemetaan untuk menavigasi tumpukan ke atas/bawah, mengubah jendela breakpoint, dan menampilkan pembongkaran, misalnya:
nmap <LocalLeader> <F11> <Plug> VimspectorUpFrame
nmap <LocalLeader> <F12> <Plug> VimspectorDownFrame
nmap <LocalLeader> B <Plug> VimspectorBreakpoints
nmap <LocalLeader> D <Plug> VimspectorDisassemble
Bagian ini menjelaskan petunjuk penggunaan terperinci, yang disusun berdasarkan fitur. Bagi sebagian besar pengguna, bagian pemetaan berisi perintah paling umum dan penggunaan default. Bagian ini dapat digunakan sebagai referensi untuk membuat pemetaan atau perilaku kustom Anda sendiri.
Semua petunjuk di bawah mengasumsikan satu sesi debugging. Untuk mengetahui detail tentang cara men-debug beberapa aplikasi independen secara bersamaan, lihat [beberapa sesi debugging][#multiple-debugging-sessions].
.vimspector.json
. Lihat di bawah.:call vimspector#Launch()
dan pilih konfigurasi.Meluncurkan sesi baru menjadikannya [sesi debug] yang aktif][#sesi-debugging-sesi].
Jika konfigurasi adaptor debug menggunakan pidProperty
, dan Anda membuat permintaan attach
, maka Anda akan diminta memasukkan PID (ID proses) untuk dilampirkan.
Untuk mempermudahnya, Vimspector menyediakan sedikit utilitas untuk membuat daftar PID. Ini seperti tiruan ps
yang sangat sederhana tetapi berfungsi di semua platform yang didukung. Lihat README-nya untuk instruksi pengaturannya.
Jalankan go build
di direktori support/vimspector_process_list
untuk mengaturnya.
Jika Vimspector dapat menemukan aplikasi ini, ia akan mencoba membuat daftar semua proses yang dimiliki oleh pengguna saat ini secara default.
Alternatifnya (sebaiknya), Anda dapat menggunakan bentuk khusus ekspansi variabel yang disebut ${PickProcess("binaryName")}
. Versi panggilan ini akan mencantumkan semua proses untuk pengguna saat ini yang cocok dengan nama biner ini.
Misalnya:
"Attach" : {
"adapter" : "CodeLLDB" ,
"configuration" : {
"request" : "attach" ,
"program" : "${workspaceRoot}/Jails" ,
"pid" : "${PickProcess("jails")}"
}
}
Ini akan mencantumkan setiap proses yang cocok, proses induknya, waktu mulai dan direktori kerja. Tampilannya seperti ini:
PID PPID CWD START
52218 52217 (Python) /Users/ben/.vim/bundle/lsp-examples/jai/Jails 2023-05-22 16:02:24
Enter Process ID:
Anda kemudian memasukkan PID dan tekan <CR>
.
Anda bahkan dapat mengganti pemilih proses dengan fungsi Anda sendiri. Jika Anda mendefinisikan beberapa fungsi dan menetapkan g:vimspector_custom_process_picker_func
ke nama fungsi itu. Argumen apa pun yang diteruskan ke fungsi ekspansi PickProcess
akan diteruskan. Ini juga akan digunakan setiap kali pidProperty
ditentukan, jadi ia juga tidak boleh menangani argumen (gunakan ...
sebagai argumen formal untuk fungsi tersebut, lihat :help ...
).
Misalnya, untuk menggunakan fzf
bersama dengan vimspector_process_list
yang disediakan:
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 '
Atau menggunakan fzf
dengan output ps
:
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 '
Untuk meluncurkan konfigurasi debug tertentu, atau menentukan variabel pengganti untuk peluncuran tersebut, Anda dapat menggunakan:
:call vimspector#LaunchWithSettings( dict )
Argumennya berupa dict
dengan kunci berikut:
configuration
: (opsional) Nama konfigurasi debug yang akan diluncurkan<anything else>
: (opsional) Nama variabel yang akan disetel Hal ini memungkinkan adanya integrasi dan otomatisasi. Misalnya, jika Anda memiliki konfigurasi bernama Run Test
yang berisi variabel pengganti bernama ${Test}
Anda dapat menulis pemetaan yang pada akhirnya dijalankan:
vimspector#LaunchWithSettings ( #{ configuration: ' Run Test '
Test: ' Name of the test ' } )
Ini akan memulai konfigurasi Run Test
dengan ${Test}
disetel ke 'Name of the test'
dan Vimspector tidak akan meminta pengguna untuk memasukkan atau mengonfirmasi hal-hal ini.
Lihat panduan integrasi YouCompleteMe kami untuk contoh lain yang dapat digunakan untuk menentukan port untuk menghubungkan debugger Java
Untuk meluncurkan dengan konfigurasi ad-hoc Anda dapat menggunakan:
call vimspector#LaunchWithConfigurations( dict )
Argumennya adalah dict
yang merupakan bagian configurations
dari file .vimspector. Lewati satu konfigurasi dan itu akan dipilih sebagai konfigurasi yang akan dijalankan. Misalnya:
let pid = <some_expression>
call vimspector#LaunchWithConfigurations ({
" attach " : {
" adapter " : " netcoredbg " ,
" configuration " : {
" request " : " attach " ,
" processId " : pid
}
}
} )
Ini akan meluncurkan debugger dan melampirkan ke proses yang ditentukan tanpa perlu memiliki file .vimspector lokal di disk. Variabel ${workspaceRoot}
akan menunjuk ke folder induk dari file yang sedang dibuka di vim.
Vimspector menggunakan logika berikut untuk memilih konfigurasi yang akan diluncurkan:
autoselect
tidak disetel ke false
, gunakan itu.default
yang disetel ke true
dan tanpa autoselect
yang disetel ke false
, gunakan itu.Lihat panduan referensi untuk detailnya.
vimspector#GetConfigurations()
untuk mendapatkan daftar konfigurasi untuk tipe file buffer saat iniMisalnya untuk mendapatkan array konfigurasi dan pencocokan fuzzy pada hasilnya
: call matchfuzzy ( vimspector#GetConfigurations (), " test::case_1 " )
Lihat bagian pemetaan untuk pemetaan default untuk bekerja dengan breakpoint. Bagian ini menjelaskan API lengkap dalam fungsi vimscript.
Breakpoint dikaitkan dengan [sesi debug] saat ini][#sesi debug ganda]. Saat berpindah antar sesi, tanda breakpont untuk sesi sebelumnya akan dihapus dan breakpoint untuk sesi yang baru diaktifkan akan ditampilkan. Meskipun mungkin berguna untuk melihat breakpoint untuk semua sesi, hal ini bisa sangat membingungkan.
Gunakan :VimspectorBreakpoints
atau petakan sesuatu ke <Plug>VimspectorBreakpoints
untuk membuka tampilan breakpoints. Dari sini Anda dapat membuat daftar, melompat untuk menghapus, menambah, dan mengganti titik henti sementara.
Saya merekomendasikan pemetaan seperti ini untuk mengaktifkan jendela breakpoint:
nmap <Leader> db <Plug> VimspectorBreakpoints
Pemetaan berikut berlaku secara default di jendela breakpoint:
t
, <F9>
- beralih, yaitu mengaktifkan/menonaktifkan breakpointT
- beralih, yaitu mengaktifkan/menonaktifkan SEMUA breakpointdd
, <Del>
- menghapus breakpoint saat inicc
, C
- edit opsi breakpoint saat inii
, a
, o
- tambahkan breakpoint baris baruI
, A
, O
- tambahkan breakpoint fungsi baru<Enter>
atau klik dua kali - lompat ke titik henti garisWinBar juga disediakan (jika didukung). Ini menambahkan fungsi seperti menyimpan/memulihkan sesi, menghapus semua breakpoint, dan mengatur ulang opsi breakpoint pengecualian.
Bentuk breakpoint yang paling sederhana dan paling umum adalah line breakpoint. Eksekusi dijeda ketika baris tertentu dieksekusi.
Untuk sebagian besar skenario debugging, pengguna cukup menekan <F9>
untuk membuat titik henti baris pada baris saat ini dan <F5>
untuk meluncurkan aplikasi.
Beberapa adaptor debug mendukung breakpoint bersyarat. Perhatikan bahwa vimspector tidak memberi tahu Anda jika debugger tidak mendukung breakpoint bersyarat (belum). Breakpoint bersyarat adalah breakpoint yang hanya terpicu jika beberapa ekspresi bernilai benar, atau ada batasan lain yang terpenuhi.
Beberapa fungsi di atas mengambil argumen opsional tunggal yang merupakan kamus opsi. Kamus dapat memiliki kunci berikut:
condition
: Ekspresi opsional yang dievaluasi untuk menentukan apakah breakpoint harus diaktifkan. Tidak didukung oleh semua adaptor debug. Misalnya, untuk memutuskan kapan abc
adalah 10
, masukkan sesuatu seperti abc == 10
, bergantung pada bahasanya.hitCondition
: Ekspresi opsional yang dievaluasi untuk menentukan berapa kali breakpoint harus diabaikan. Haruskah (mungkin?) Tidak digunakan dalam kombinasi dengan condition
. Tidak didukung oleh semua adaptor debug. Misalnya, untuk mematahkan garis ini untuk ketiga kalinya, masukkan 3
.logMessage
: String opsional untuk menjadikan breakpoint ini sebagai "logpoint". Saat dipicu, pesan ini dicetak ke konsol alih-alih menghentikan eksekusi. Anda dapat menyematkan ekspresi dalam kurung kurawal {like this}
, misalnya #{ logMessage: "Iteration {i} or {num_entries / 2}" }
Dalam setiap kasus, ekspresi dievaluasi oleh debugger, jadi harus dalam dialek apa pun yang dipahami debugger saat mengevaluasi ekspresi.
Saat menggunakan pemetaan <leader><F9>
, pengguna diminta untuk memasukkan ekspresi ini di baris perintah (dengan riwayat).
Breakpoint pengecualian biasanya diaktifkan ketika pengecualian terjadi atau kondisi kesalahan lainnya terjadi. Bergantung pada debugger, saat memulai proses debug, Anda mungkin ditanyai beberapa pertanyaan tentang cara menangani pengecualian. Ini adalah "breakpoint pengecualian" dan vimspector mengingat pilihan Anda saat Vim masih berjalan.
Biasanya Anda dapat menerima defaultnya (terus tekan <CR>
!) karena sebagian besar default adaptor debug masuk akal, tetapi jika Anda ingin menghentikannya, ucapkan uncaught exception
lalu jawab Y
untuk itu (misalnya).
Anda dapat mengonfigurasi pilihan Anda di .vimspector.json
. Lihat panduan konfigurasi untuk rinciannya.
CATATAN: Sebelumnya, ToggleBreakpoint akan berputar di antara 3 status: diaktifkan, dinonaktifkan, dihapus. Banyak pengguna menganggap status 'dinonaktifkan' jarang berguna, sehingga perilakunya telah diubah. ToggleBreakpoint selalu membuat atau menghapus breakpoint. Jika Anda ingin 'menonaktifkan' breakpoint, gunakan jendela breakpoints dan 'toggle' ( t
) dari sana.
vimspector#ToggleBreakpoint( { options dict } )
untuk menyetel/menghapus breakpoint baris. Argumennya opsional (lihat di bawah).vimspector#AddFunctionBreakpoint( '<name>', { options dict} )
untuk menambahkan titik henti fungsi. Argumen kedua bersifat opsional (lihat di bawah).vimspector#SetLineBreakpoint( file_name, line_num, { options dict } )
untuk menyetel breakpoint pada file/baris tertentu. Argumen terakhir adalah opsional (lihat di bawah)vimspector#ClearLineBreakpoint( file_name, line_num )
untuk menghapus breakpoint pada file/baris tertentuvimspector#ClearBreakpoints()
untuk menghapus semua breakpointvimspector#ResetExceptionBreakpoints()
untuk menghapus konfigurasi breakpoint pengecualian dan menjawab kembali berbagai pertanyaan seperti "Break on C++ Throw":VimspectorMkSession
dan :VimspectorLoadSession
untuk menyimpan dan memulihkan breakpointcall vimspector#ListBreakpoints()
- alihkan jendela breakpointcall vimspector#BreakpointsAsQuickFix()
- mengembalikan kumpulan breakpoint saat ini dalam format perbaikan cepat vimContoh:
call vimspector#ToggleBreakpoint()
- alihkan breakpoint pada baris saat inicall vimspector#SetLineBreakpoint( 'some_file.py', 10 )
- atur breakpoint pada some_filepy:10
call vimspector#AddFunctionBreakpoint( 'main' )
- tambahkan breakpoint fungsi pada fungsi main
call vimspector#ToggleBreakpoint( { 'condition': 'i > 5' } )
- tambahkan breakpoint pada baris saat ini yang terpicu hanya ketika i > 5
true
call vimspector#SetLineBreakpoint( 'some_file.py', 10, { 'condition': 'i > 5' } )
- tambahkan breakpoint di some_file.py:10
yang terpicu hanya jika i > 5
true
call vimspector#ClearLineBreakpoint( 'some_file.py', 10 )
- hapus breakpoint di some_file.py:10
call vimspector#ClearBreakpoints()
- hapus semua breakpointVimspectorMkSession
- buat .vimspector.session
VimspectorLoadSession
- baca .vimspector.session
VimspectorMkSession my_session_file
- buat my_session_file
VimspectorLoadSession my_session_file
- baca my_session_file
CATATAN : Fitur eksperimental, yang mungkin berubah secara signifikan di masa mendatang berdasarkan masukan pengguna.
Breakpoint instruksi dapat ditambahkan dari jendela pembongkaran dengan cara yang sama seperti Anda menambahkan breakpoint baris di jendela kode. Pemetaan dan fungsi yang sama berfungsi untuk menambah dan mengubahnya. Jika didukung oleh adaptor debug, Anda bahkan dapat membuat titik log dan titik henti sementara bersyarat dengan cara ini.
Saat ini, breakpoint instruksi dimodelkan secara internal sebagai breakpoint baris terhadap buffer yang berisi pembongkaran, tapi hal itu mungkin berubah di masa mendatang, jadi mohon jangan mengandalkan ini.
Breakpoint instruksi juga terlihat dari dan dapat dihapus/dinonaktifkan dari jendela Breakpoints.
Saat ini, breakpoint instruksi secara otomatis dihapus ketika sesi debug berakhir. Alasan untuk ini adalah bahwa alamat tidak dapat dijamin berlaku untuk sesi debug lainnya. Namun, ini juga dapat berubah di masa depan.
Gunakan vimspector#ClearBreakpoints()
untuk menghapus semua breakpoint termasuk memori pilihan breakpoint pengecualian.
Gunakan vimspector#RunToCursor
atau <leader><F8>
: Ini menciptakan breakpoint sementara pada baris saat ini, kemudian melanjutkan eksekusi, membersihkan breakpoint saat dipukul.
Gunakan vimspector#GoToCurrentLine()
atau beberapa pemetaan ke <Plug>VimspectorGoToCurrentLine
untuk melompati eksekusi saat ini ke saluran kursor Anda saat ini.
Jika didukung ini dapat berguna untuk menjalankan kembali bagian kode atau melewatkannya sepenuhnya.
Jika ada beberapa kemungkinan "target" pada jalur saat ini, Anda diminta untuk memilih satu.
Vimspector dapat menyimpan dan memulihkan breakpoint (dan beberapa hal lainnya) ke file sesi. Perintah berikut ada untuk itu:
VimspectorMkSession [file/dir name]
- Simpan set breakpoint baris, logpoint, breakpoint bersyarat, breakpoint fungsi dan filter breakpoint pengecualian ke file sesi yang disediakan atau file default di direktori yang disediakan.VimspectorLoadSession [file/dir name]
- Baca breakpoint dari file sesi yang disediakan atau file default di direktori yang disediakan dan ganti breakpoint yang saat ini ditetapkan. Sebelum memuat, semua breakpoint saat ini dihapus (seolah -olah vimspector#ClearLineBreakpoints()
dipanggil). Dalam kedua kasus, argumen nama file/dir adalah opsional. Secara default, file bernama .vimspector.session
, tetapi ini dapat diubah secara global dengan mengatur g:vimspector_session_file_name
ke sesuatu yang lain, atau dengan secara manual menentukan jalur saat memanggil perintah. Jika Anda menyediakan direktori, nama file sesi default atau yang dikonfigurasi dibaca dari atau ditulis ke direktori itu. Othewise, file dibaca berdasarkan buffer terbuka saat ini atau ditulis ke direktori kerja saat ini.
Pengguna tingkat lanjut mungkin ingin mengotomatiskan proses pemuatan dan penghematan, misalnya dengan menambahkan VimEnter
dan VimLeave
AutoCommands. Direkomendasikan dalam kasus ini untuk menggunakan silent!
Untuk menghindari kesalahan yang mengganggu jika file tidak dapat dibaca atau ditulis.
Bentuk otomatisasi yang paling sederhana adalah memuat sesi Vimspector setiap kali Anda memulai VIM dengan file sesi. Ini sesederhana melakukan ini:
$ echo silent VimspectorLoadSession > Sessionx.vim
Lihat :help mksession
untuk detail file *x.vim
. Anda juga dapat melakukan sesuatu seperti ini menggunakan SessionLoadPost
:
autocmd SessionLoadPost * silent ! VimspectorLoadSession
vimspector#StepInto()
dll. Ada juga vimspector#StepSOver()
dan vimspector#StepIOver()
dll. Varian untuk Pernyataan dan Instruksi Granularity masing -masing. <CR>
, atau klik dua kali dengan mouse kiri untuk memperluas/runtuh (+, -).<C-CR>
(Control + <CR>
) atau <leader><CR>
(jika modifyOtherKeys
tidak berfungsi untuk Anda) Lingkup dan variabel diwakili oleh buffer vimspector.Variables
.
Jika Anda lebih suka tampilan yang lebih verbose untuk variabel dan jam tangan, maka Anda dapat let g:vimspector_variables_display_mode = 'full'
. Secara default hanya nama dan nilai yang ditampilkan, dengan data lain yang tersedia dari melayang mouse atau memicu <Plug>VimspectorBalloonEval
pada jalur yang berisi nilai di jendela variabel (atau jam tangan).
Semua aturan untuk Variables and scopes
berlaku ditambah berikut:
a + b
) dan dapatkan hasilnya.nmap
) dan visual ( xmap
) ke <Plug>VimspectorBalloonEval
untuk memicu popup secara manual.<C-CR>
(Control + <CR>
) atau <leader><CR>
(jika modifyOtherKeys
tidak berfungsi untuk Anda)j
, k
) untuk memilih pilihan saat ini; <Esc>
(atau tinggalkan jendela tooltip) untuk menutup tooltip. Anda dapat menonaktifkan popup melayang otomatis dengan pengaturan g:vimspector_enable_auto_hover=0
sebelum memulai sesi debug. Anda kemudian dapat memetakan sesuatu ke <Plug>VimspectorBalloonEval
dan memicu secara manual.
Jendela arloji digunakan untuk memeriksa variabel dan ekspresi. Ekspresi dievaluasi dalam bingkai tumpukan yang dipilih yang "difokuskan"
Jendela jam tangan adalah buffer yang cepat, di mana itu tersedia. Masukkan mode insert untuk menambahkan ekspresi jam tangan baru.
<CR>
.:VimspectorWatch <expression>
. Pelengkap tab untuk ekspresi tersedia di beberapa adaptor debug.<CR>
, atau klik dua kali dengan mouse kiri.<C-CR>
(Control + <CR>
) atau <leader><CR>
(jika modifyOtherKeys
tidak berfungsi untuk Anda)<DEL>
. Jam tangan diwakili oleh buffer vimspector.Watches
.
Jika Anda lebih suka tampilan yang lebih verbose untuk variabel dan jam tangan, maka Anda dapat let g:vimspector_variables_display_mode = 'full'
. Secara default hanya nama dan nilai yang ditampilkan, dengan data lain yang tersedia dari melayang mouse atau memicu <Plug>VimspectorBalloonEval
pada jalur yang berisi nilai di jendela variabel (atau jam tangan).
Anda dapat menonaktifkan popup melayang otomatis dengan pengaturan g:vimspector_enable_auto_hover=0
sebelum memulai sesi debug. Anda kemudian dapat memetakan sesuatu ke <Plug>VimspectorBalloonEval
dan memicu secara manual.
Buffer prompt arloji memiliki omnifunc
diatur ke fungsi yang akan menghitung penyelesaian untuk ekspresi saat ini. Ini digunakan secara sepele dengan <Ctrl-x><Ctrl-o>
(lihat :help ins-completion
), atau terintegrasi dengan sistem penyelesaian favorit Anda. FileType dalam buffer diatur ke VimspectorPrompt
.
Untuk YouCompleteMe, konfigurasi berikut berfungsi dengan baik:
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
:VimspectorDisassemble
, vimspector#ShowDisassembly()
atau <Plug>VimspectorDisassemble
Beberapa adaptor debug (sedikit!) Mendukung pembongkaran. Cara ini bekerja di DAP sedikit aneh, tetapi dalam praktiknya Vimspector akan meminta untuk membongkar sejumlah instruksi di sekitar PC bingkai tumpukan saat ini. Ini kemudian ditampilkan di jendela dengan winbar yang mirip dengan jendela kode, tetapi dengan instruksi stepping granularity. Ada tanda untuk instruksi saat ini dan default bighighting sintaks ke "ASM" yang sebagian besar berfungsi dengan baik untuk x86 dan lengan.
Seperti disebutkan di atas, ketika jendela Anda saat ini adalah jendela pembongkaran dan Anda menggunakan perintah "Langkah" default (misalnya <F10>
), loncatan secara otomatis dihidangkan ke per-instruksi daripada per pernyataan.
Setiap kali proses berhenti, Vimspector meminta sekitar 2 jendela penuh instruksi di sekitar PC saat ini. Untuk melihat lebih banyak, Anda dapat menggulir jendela. Vimspector akan halaman dalam layar tambahan instruksi ketika jendela bergulir ke atas atau dekat bagian bawah. Ini tidak sempurna. Terkadang Anda harus menggulir sedikit lebih banyak untuk menjadikannya halaman di (misalnya Ctrl-E Ctrl-Y di bagian atas). Ini tidak ideal, dan dapat ditingkatkan di masa depan.
Anda dapat mengontrol ketinggian intial jendela pembongkaran dengan let g:vimspector_disassembly_height = 10
(atau jumlah baris apa).
FileType (dan sintaks) buffer di jendela pembongkaran adalah vimspector-disassembly
. Anda dapat menggunakan FileType
autocommands untuk menyesuaikan hal -hal seperti penyorotan sintaks.
Catatan : Fitur ini bersifat eksperimental dan dapat berubah dengan cara apa pun berdasarkan umpan balik pengguna.
Beberapa adaptor debug menyediakan cara untuk membuang memori proses yang terkait dengan variabel. Ini dapat dilakukan dari variabel dan jam tangan jendela dengan:
<leader>m
pemetaan (secara default, dapat disesuaikan)vimspector#ReadMemory()
Saat melakukan ini, Anda diminta untuk memasukkan sejumlah byte untuk dibaca (dari lokasi yang terkait dengan garis kursor saat ini) dan offset dari lokasi itu. Buffer baru ditampilkan di jendela kode yang berisi dump memori di hex dan ASCII, mirip dengan output xxd
.
Catatan : Fitur ini bersifat eksperimental dan dapat berubah dengan cara apa pun berdasarkan umpan balik pengguna.
Jendela Stack Trace menunjukkan keadaan setiap utas program. Benang yang dihentikan dapat diperluas untuk menunjukkan jejak tumpukan utas itu.
Seringkali, tetapi tidak selalu, semua utas dihentikan ketika breakpoint dipukul. Status utas ditampilkan dalam tanda kurung setelah nama utas. Di mana didukung oleh debugger yang mendasarinya, utas dapat dijeda dan dilanjutkan secara individual dari dalam jendela Stack Trace.
Utas tertentu, disorot dengan grup highlight CursorLine
adalah utas "terfokus". Ini adalah utas yang menerima perintah seperti "Step In", "Step Out", "Lanjutkan" dan "Jeda" di jendela kode. Utas terfokus dapat diubah secara manual menjadi "beralih ke" utas itu.
<CR>
, atau klik dua kali dengan mouse kiri untuk memperluas/runtuh jejak tumpukan utas, atau gunakan tombol WinBar.<CR>
, atau klik dua kali dengan mouse kiri pada bingkai tumpukan untuk melompat ke sana.vimspector#PauseContinueThread()
untuk berhenti secara individual atau melanjutkan utas yang dipilih.<leader><CR>
atau vimspector#SetCurrentThread()
untuk mengatur utas "fokus" ke yang saat ini dipilih. Jika garis yang dipilih adalah bingkai tumpukan, atur utas terfokus ke utas bingkai itu dan melompat ke bingkai itu di jendela kode. Jejak tumpukan diwakili oleh buffer vimspector.StackTrace
.
Jika ada sesi debug anak, seperti di mana debugee meluncurkan proses anak dan adaptor debug mendukung debugging multi-sesi, maka masing-masing utas sesi ditampilkan secara terpisah. Sesi yang saat ini aktif adalah sesi yang disorot sebagai bingkai utas/tumpukan yang saat ini aktif. Untuk beralih kontrol ke sesi yang berbeda, fokuskan utas dalam sesi itu.
CATATAN: Ini mengacu pada sesi yang dibuat sebagai anak-anak dari sesi yang ada, dan tidak harus disamakan dengan sesi debugging [ganda)] [#sesi multi-debugging].
:VimspectorShowOutput <category>
. Gunakan penyelesaian baris perintah untuk melihat kategori. Jika jendela output ditutup, yang baru dapat dibuka dengan :VimspectorShowOutput <category>
(gunakan tab -completion - wildmenu
untuk melihat opsi).
Jendela konsol adalah buffer yang cepat, di mana itu tersedia, dan dapat digunakan sebagai CLI interaktif untuk adaptor debug. Dukungan untuk ini bervariasi di antara adaptor.
:VimspectorEval <expression>
. Penyelesaian tersedia dengan beberapa adaptor debug.<CR>
Catatan: Lihat juga jam tangan di atas.
Jika jendela output ditutup, yang baru dapat dibuka dengan :VimspectorShowOutput Console
.
Buffer prompt konsol memiliki omnifunc
diatur ke fungsi yang akan menghitung penyelesaian untuk perintah/ekspresi saat ini. Ini digunakan secara sepele dengan <Ctrl-x><Ctrl-o>
(lihat :help ins-completion
), atau terintegrasi dengan sistem penyelesaian favorit Anda. FileType dalam buffer diatur ke VimspectorPrompt
.
Untuk YouCompleteMe, konfigurasi berikut berfungsi dengan baik:
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
File log Vimspector berisi jejak penuh komunikasi antara Vimspector dan adaptor debug. Ini adalah sumber utama informasi diagnostik ketika terjadi kesalahan yang bukan traceback vim.
Jika Anda hanya ingin melihat file log Vimspector, gunakan :VimspectorToggleLog
, yang akan mengikisnya di jendela kecil (tidak berfungsi pada windows).
Anda dapat melihat beberapa info debugging dengan :VimspectorDebugInfo
Untuk menutup debugger, gunakan:
Reset
tombol WinBar:VimspectorReset
saat winbar tidak tersedia.call vimspector#Reset()
Jika debuggee masih berjalan saat berhenti atau mengatur ulang, maka beberapa adaptor debug memungkinkan Anda untuk menentukan apa yang harus terjadi saat menyelesaikan debugging. Biasanya, perilaku default masuk akal, dan inilah yang terjadi hampir sepanjang waktu. Ini adalah default menurut DAP:
Beberapa adaptor debug memungkinkan Anda untuk memilih apa yang harus dilakukan saat memutuskan hubungan. Jika Anda ingin mengontrol perilaku ini, gunakan :VimspectorReset
atau hubungi vimspector#Reset( { 'interactive': v:true } )
. Jika adaptor debug menawarkan pilihan apakah akan mengakhiri debuggee atau tidak, Anda akan diminta untuk memilih. Hal yang sama berlaku untuk vimspector#Stop()
yang dapat mengambil argumen: vimspector#Stop( { 'interactive': v:true } )
.
Catatan : Fitur ini bersifat eksperimental dan bagian mana pun dapat berubah sebagai tanggapan terhadap umpan balik pengguna.
Vimspector mendukung memulai jumlah sesi debug yang sewenang -wenang. Setiap sesi dikaitkan dengan tab UI individu. Biasanya, Anda hanya men -debug satu aplikasi dan karenanya tidak perlu memikirkan hal ini, tetapi fitur canggih ini dapat bermanfaat jika Anda perlu secara simultan men -debug banyak, aplikasi independen, atau beberapa contoh independen dari aplikasi Anda.
Kapan saja ada satu sesi root "aktif". Breakpoint dikaitkan dengan sesi saat ini, dan semua perintah UI dan API diterapkan pada sesi aktif saat ini.
Saat beralih di antara sesi root, tanda -tanda breakpont untuk sesi sebelumnya dihapus dan breakpoint untuk sesi yang baru diaktifkan ditampilkan. Meskipun mungkin berguna untuk melihat breakpoint untuk semua sesi, ini bisa sangat membingungkan.
Alur kerja yang khas mungkin:
:edit server.cc
lalu <F5>
). Ini memulai sesi debug yang dinamai setelah konfigurasi yang dipilih. Anda dapat mengganti nama :VimspectorRenameSession server
.:tabedit client.cc
)client
:: :VimspectorNewSession client
( client
sekarang menjadi sesi aktif).client
dan mulailah debugging dengan <F5>
. Anda sekarang memiliki 2 tab Vimspector. Secara intuitif, wwitching ke tab tertentu akan membuat sesi aktif. Anda juga dapat secara manual mengganti sesi aktif dengan :VimspectorSwitchToSession <name>
.
Jadi, secara ringkasan Anda memiliki fasilitas berikut:
VimspectorNewSession <name>
Ini menciptakan sesi baru dan membuatnya aktif. Nama opsional digunakan sebagai pengganti yang dihasilkan saat memulai peluncuran.VimspectorSwitchToSession <tab complete>
.VimspectorRenameSession <new name>
VimspectorDestroySession <name>
. Anda tidak dapat menghancurkan sesi berjalan/aktif.vimspector#GetSessionName()
Berguna untuk memasukkan statusline. Ada juga vimspector#GetSessionID()
untuk teknisi. Berikut adalah contoh bagaimana Anda dapat menampilkan nama sesi saat ini di statusline
(lihat :help statusline
, atau dokumentasi untuk plugin garis status mewah Anda).
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 ()} % )
Untuk pengantar konfigurasi .vimspector.json
, lihat bagian yang dimulai dari situs web Vimspector.
Untuk penjelasan lengkap, termasuk cara menggunakan variabel, substitusi dan cara menentukan breakpoint pengecualian, lihat dokumen.
File konfigurasi JSON memungkinkan komentar C-style:
// comment to end of line ...
/* inline comment ... */
Saat ini diuji dengan adaptor debug berikut.
Contoh .vimspector.json
(berfungsi dengan vscode-cpptools
dan lldb-vscode
. Untuk lldb-vscode
ganti nama adaptor dengan 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> "
}
}
// ...
}
}
Catatan untuk pengguna Windows: Anda perlu menginstal gdb.exe
. Saya sarankan menggunakan scoop install gdb
. Vimspector tidak dapat menggunakan Visual Studio Debugger karena lisensi.
{
"configurations" : {
"Launch" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " <path to binary> " ,
"stopAtEntry" : true
}
}
}
}
Tergantung pada backend yang Anda butuhkan untuk mengaktifkan pencetakan jenis kompleks yang cukup manual.
LLDB: Pencetakan cantik diaktifkan secara default
GDB: Untuk mengaktifkan printer cantik GDB, pertimbangkan cuplikan di bawah ini. Tidaklah cukup untuk set print pretty on
di .gdbinit Anda!
{
"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
}
]
}
}
}
}
Dokumentasi CPPTOOLS menjelaskan cara melampirkan CPPTools ke GdBServer menggunakan miDebuggerAddress
. Perhatikan bahwa ketika melakukan ini, Anda harus menggunakan "request": "attach"
.
Jika Anda merasa mewah, lihat panduan referensi untuk contoh membuat Vimspector untuk diluncurkan dan dilampirkan dari jarak jauh.
CodellDB lebih unggul dari vscode-cpptools dalam beberapa cara pada macOS setidaknya.
Lihat Rust.
Alternatifnya adalah dengan menggunakan lldb-vscode
, yang dilengkapi dengan LLVM. Begini caranya:
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 didukung dengan debugger berbasis GDB/LLDB. Jadi berfungsi dengan baik dengan vscode-cpptools
dan lldb-vscode
di atas. Namun, dukungan untuk Rust adalah yang terbaik di CodeLLDB
.
./install_gadget.py --enable-rust
atau :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"
- ini tidak valid. Alih -alih gunakan "request": "launch", "custom": true
. Karena alasancargo
dilakukan dalam kegilaan vscode javascript, jadi tidak didukung."request": custom
; Lihat poin tentang peluncuran "khusus" di atasstep-into
untuk fungsi perpustakaan standar) dapat dilakukan dengan menambahkan "sourceMap": { "from_path" : "to_path" }
. "from_path"
dapat ditemukan di jendela pembongkaran dengan naik di jejak tumpukan; "to_path"
hanyalah jalur perpustakaan standar Anda yang diinstal secara lokal untuk toolchain saat ini. Jai Debugging bekerja dengan baik dengan salah satu debugger asli lainnya. Saya merekomendasikan CodellDB, tetapi CPPTools juga berfungsi.
Contoh:
{
"$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}"
}
}
}
}
Python: Debugpy
Instal dengan install_gadget.py --enable-python
atau :VimspectorInstall debugpy
, idealnya membutuhkan kompiler yang berfungsi dan header/lib Python Development untuk membangun ekstensi C Python untuk kinerja.
Catatan : Debugpy tidak lagi mendukung Python 2. Untuk terus men-debug aplikasi Python 2, gunakan adaptor debugpy-python2
setelah menginstal gadget debugpy-python2
.
Opsi Lengkap: 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> "
}
}
...
}
}
Untuk menggunakan debugging jarak jauh dengan debugpy, Anda harus menghubungkan Vimspector langsung ke aplikasi yang sedang debugged. Ini mudah, tetapi sedikit berbeda dari cara kami biasanya mengkonfigurasi berbagai hal. Secara khusus, Anda perlu:
--listen
. Lihat dokumentasi debugpy untuk detailnya.{
"configurations" : {
"Python Attach" : {
"adapter" : " multi-session " ,
"filetypes" : [ " python " ], // optional
"configuration" : {
"request" : " attach " ,
"pathMappings" : [
// mappings here (optional)
]
}
}
}
}
Lihat detail konfigurasi peluncuran untuk penjelasan hal -hal seperti pathMappings
.
Dokumentasi tambahan, termasuk cara melakukan ini ketika mesin jarak jauh hanya dapat dihubungi melalui SSH disediakan oleh debugpy.
Jika Anda merasa mewah, periksa panduan referensi untuk contoh membuat Vimspector meluncurkan dan melampirkan dari jarak jauh.
Untuk terus men-debug aplikasi Python 2, pastikan Anda menginstal gadget debugpy-python2
(misalnya --force-enable-python2
atau :VimspectorInstall debugpy-python2
), dan kemudian ubah konfigurasi Anda untuk digunakan:
{
"configurations" : {
"Python Attach" : {
"adapter" : " debugpy-python2 " ,
// ...
}
}
}
untuk ujian
Lihat garpu saya dari TclProdebug untuk instruksi.
Instal dengan install_gadget.py --force-enable-csharp
atau :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" : {}
}
}
}
}
Memerlukan:
install_gadget.py --enable-go
atau :VimspectorInstall delve
go 1.16
atau lebih baru (YMMV pada versi sebelumnya)Ini menggunakan dukungan DAP yang dibangun untuk Debugger Delve
{
"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 "
}
}
}
}
Gunakan variabel untuk mengonfigurasi yang berikut:
dlvFlags
: (string) argumen baris perintah tambahan untuk dilewati untuk menggaliDebugger (Delve) diluncurkan di jendela terminal sehingga Anda dapat melihat output dan memberikan input ke debuggee.
Lihat dokumen VScode-GO untuk opsi peluncuran penuh. Ya, sepertinya itulah satu -satunya tempat mereka didokumentasikan (tampaknya, mereka tidak didokumentasikan oleh Delve sendiri).
Dokumen vscode-go juga memiliki informasi pemecahan masalah yang berguna
Memerlukan:
install_gadget.py --enable-go
atau :VimspectorInstall vscode-go
go get -u github.com/go-delve/delve/cmd/dlv
dlvToolPath
Catatan: Vimspector menggunakan adaptor debug vscode-go "Legacy" daripada dukungan DAP "built-in" di Delve. Anda dapat melacak #186 untuk itu.
{
"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" ]
}
}
}
}
Lihat dokumen vscode-go untuk informasi pemecahan masalah
Ini menggunakan php-debug, lihat https://marketplace.visualstudio.com/items?itemname=felixfbecker.php-debug
Memerlukan:
install_gadget.py --force-enable-php
atau :VimspectorInstall vscode-php-debug
zend_extension =xdebug.so
xdebug.remote_enable =on
xdebug.remote_handler =dbgp
xdebug.remote_host =localhost
xdebug.remote_port =9000
Ganti localhost
dengan IP workstation Anda.
Alternatif malas
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
}
}
}
}
Tambahkan XDEBUG_SESSION_START=xdebug
ke string kueri Anda
curl "http://localhost?XDEBUG_SESSION_START=xdebug"
Atau gunakan ekstensi helper xDebug yang disebutkan sebelumnya (yang menetapkan cookie XDEBUG_SESSION
)
export XDEBUG_CONFIG= " idekey=xdebug "
php < path to script >
Ini menggunakan vscode-js-debug, debugger yang digunakan dalam vScode juga. Untuk konfigurasi tambahan, periksa dokumentasi di sini.
Untuk menginstal vscode-js-debug, jalankan VimspectorInstall vscode-js-debug
dari vim atau jalankan install skrip install_gadget.py --force-enable-node
. Ada beberapa contoh yang dapat Anda periksa. Temukan mereka di bawah support/test/node/simple
, support/test/node/multiprocess
dan support/test/node/typescript
. Konfigurasi khas untuk debugging naskah terlihat seperti ini:
{
"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
mendukung sejumlah "jenis" yang berbeda dan dapat melakukan beberapa hal yang mungkin atau mungkin tidak berfungsi. Bidang type
sayangnya tidak didokumentasikan, tetapi nilai -nilai yang valid didefinisikan di sini di enum debugtype.
Vimspector hanya diuji dengan tipe pwa-node
.
Perhatikan juga bahwa untuk beberapa alasan adaptor debug ini selalu memaksa kita untuk memulai beberapa sesi debug. Untuk pengguna, itu seharusnya tidak mengubah apa pun (selain mungkin jejak tumpukan yang sedikit membingungkan). Tapi itu membuat segalanya lebih rumit dan mungkin ada bug yang halus.
Ini menggunakan debugger chrome/firefox (mereka sangat mirip), lihat https://marketplace.visualstudio.com/items?itemname=msjsdiag.debugger-for-chrome dan https://marketplace.visualstudio.com/items? = masing-masing firefox-devtools.vscode-firefox-debug.
Ini memungkinkan Anda untuk men -debug skrip yang berjalan di dalam Chrome dari dalam vim.
./install_gadget.py --force-enable-chrome
atau :VimspectorInstall debugger-for-chrome
./install_gadget.py --force-enable-firefox
atau :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 bekerja dengan baik dengan Java Debug Server, yang berjalan sebagai plugin JDT.LS (Java Language Server), daripada adaptor debug mandiri.
Vimspector tidak dalam bisnis menjalankan server bahasa, hanya adaptor debug, jadi ini berarti Anda memerlukan plugin editor protokol server bahasa yang kompatibel untuk menggunakan Java. Saya merekomendasikan Anda CompleteMe, yang memiliki dukungan penuh untuk JDT.LS, dan yang paling penting cara sepele untuk memuat adaptor debug dan menggunakannya dengan Vimspector.
Saat menggunakan Java Debug Server, Vimspector mendukung Hot Code Replace Custom Feature. Secara default, ketika file kelas yang mendasarinya berubah, Vimspector bertanya kepada pengguna apakah mereka ingin memuat ulang kelas -kelas ini saat runtime.
Perilaku ini dapat disesuaikan:
let g:vimspector_java_hotcodereplace_mode = 'ask'
- default, tanyakan kepada pengguna untuk setiap dimuat ulang.let g:vimspector_java_hotcodereplace_mode = 'always'
- jangan tanya, selalu muat ulanglet g:vimspector_java_hotcodereplace_mode = 'never'
- jangan tanya, jangan pernah memuat ulanginstall_gadget.py --force-enable-java <other options...>
atau :VimspectorInstall java-debug-adapter
vscode-java
, misalnya: {
"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>
, bukan adaptor spesifik. misalnya di .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> '
]
<leader><F5>
untuk memulai server debug dan meluncurkan Vimspector, misalnya di ~/.vim/ftplugin/java.vim
: 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>
Anda kemudian dapat menggunakan <Leader><F5>
untuk memulai debugging daripada hanya <F5>
.
Jika Anda melihat "Tidak Dapat Mendapatkan Port DAP - Apakah JDT.LS diinisialisasi?", Coba jalankan :YcmCompleter ExecuteCommand vscode.java.startDebugSession
dan perhatikan outputnya. Jika Anda melihat kesalahan seperti ResponseFailedException: Request failed: -32601: No delegateCommandHandler for vscode.java.startDebugSession
, pastikan bahwa:
g:ycm_java_jdtls_extension_path
diatur dalam .vimrc
atau sebelum YCM mulaiUntuk argumen peluncuran, lihat dokumen vScode.
Lihat masalah ini untuk lebih banyak latar belakang.
Lua didukung melalui lokal-Lua-debugger-vscode. Debugger ini menggunakan STDIO untuk berkomunikasi dengan proses berjalan, jadi panggilan ke io.read
akan menyebabkan masalah.
./install_gadget.py --enable-lua
atau :VimspectorInstall local-lua-debugger-vscode
support/test/lua/simple
dan 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} " ]
}
}
}
}
Ada dukungan yang sangat terbatas untuk penyesuaian UI.
Vimsector menggunakan tanda -tanda berikut secara internal. Jika mereka didefinisikan sebelum Vimsector menggunakannya, mereka tidak akan diganti. Jadi untuk menyesuaikan tanda -tanda, tentukan di vimrc
Anda.
Tanda | Keterangan | Prioritas |
---|---|---|
vimspectorBP | Breakpoint garis | 9 |
vimspectorBPCond | Breakpoint garis bersyarat | 9 |
vimspectorBPLog | Logpoint | 9 |
vimspectorBPDisabled | Breakpoint yang dinonaktifkan | 9 |
vimspectorPC | Penghitung Program (IE Line saat ini) | 200 |
vimspectorPCBP | Penghitung Program dan Breakpoint | 200 |
vimspectorNonActivePC | Penghitung program untuk utas yang tidak fokus | 9 |
vimspectorCurrentThread | Benang terfokus dalam tampilan jejak stack | 200 |
vimspectorCurrentFrame | Bingkai tumpukan saat ini di tampilan jejak stack | 200 |
Simbol default setara dengan sesuatu seperti berikut:
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
Jika tanda -tanda tidak ditampilkan dengan benar, font Anda mungkin tidak mengandung mesin terbang ini. Anda dapat dengan mudah mengubahnya dengan mendefinisikan tanda di VIMRC Anda. Misalnya, Anda dapat memasukkan ini di vimrc
Anda untuk menggunakan beberapa simbol ASCII sederhana:
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
Banyak plugin yang berbeda memberikan tanda untuk berbagai tujuan. Contohnya termasuk tanda -tanda diagnostik untuk kesalahan kode, dll. VIM hanya memberikan prioritas tunggal untuk menentukan tanda mana yang harus ditampilkan ketika beberapa tanda ditempatkan pada satu baris. Jika Anda menemukan bahwa tanda-tanda lain mengganggu Vimspector's (atau sebaliknya), Anda dapat menyesuaikan prioritas yang digunakan oleh Vimspector dengan mengatur kamus berikut:
let g: vimspector_sign_priority = {
' <sign-name> ' : <priority> ,
}
Misalnya:
let g: vimspector_sign_priority = {
' vimspectorBP ' : 3 ,
' vimspectorBPCond ' : 3 ,
' vimspectorBPLog ' : 3 ,
' vimspectorBPDisabled ' : 3 ,
' vimspectorNonActivePC ' : 3 ,
' vimspectorPC ' : 999 ,
' vimspectorPCBP ' : 999 ,
}
Semua kunci bersifat opsional. Jika tanda tidak disesuaikan, prioritas default yang digunakan (seperti yang ditunjukkan di atas).
Lihat :help sign-priority
. Prioritas default adalah 10, angka yang lebih besar menimpa yang lebih kecil.
CATATAN : Tanda vimspectorNonActivePC
default tidak menambahkan teks apa pun ke kolom tanda, itu cukup menambahkan sorotan baris sehingga Anda dapat melihat garis di mana utas atau proses lain saat ini dihentikan. Akibatnya tanda ini biasanya harus bergabung dengan tanda apa pun yang menambahkan simbol (seperti tanda breakpoint). Vim hanya akan menggabungkan sifat -sifat tanda dengan prioritas yang sama, jadi jika mengubah prioritas default, disarankan bahwa:
vimspectorBP
, vimspectorBPCond
, dll.) Memiliki prioritas yang sama.vimspectorNonActivePC
itu prioritas yang samavimspectorPC
, vimspectorPCBP
, dll.) Memiliki prioritas yang lebih tinggi. Catatan: Titik kustomisasi ini saat ini tidak dapat berubah dan dapat berubah kapan saja.
Terkadang adaptor debug memberikan petunjuk tentang bagaimana UI harus menampilkan hal -hal tertentu. Ini termasuk bingkai tumpukan, variabel dll.
Vimspector menyediakan cara sederhana untuk menyesuaikan bagaimana ini ditampilkan, dengan mengatur nilai -nilai dalam kamus g:vimsepctor_presentation_hint_hl
.
Kunci berikut didukung dengan grup highlight default yang disebutkan.
Kelompok | Kunci | Penggunaan | Bawaan |
---|---|---|---|
semua | normal | apapun yang tidak tercakup di bawah ini | Normal |
Tumpukan jejak | emphasize | menekankan sumber dalam jejak stack | Title |
Tumpukan jejak | deemphasize | Hancur sumber dalam jejak tumpukan | Conceal |
Tumpukan jejak | label | bingkai tumpukan yang merupakan "label", tidak mewakili bingkai aktual | NonText |
Tumpukan jejak | subtle | bingkai tumpukan yang internal atau tidak menarik | Conceal |
Lingkup | arguments | Fungsi Argumen Lingkup | Title |
Lingkup | locals | Lingkup Variabel Lokal | Title |
Lingkup | registers | Register Lingkup | Title |
Variabel | property | Fungsi Argumen Lingkup | Identifier |
Variabel | method | Lingkup Variabel Lokal | Function |
Variabel | class | Register Lingkup | Type |
Variabel | data | Register Lingkup | String |
Selain itu, nilai apa pun yang disediakan dalam VariablePresentationHint
dapat diatur yang akan digunakan jika dipasok oleh adaptor debug.
Contoh konyol; Defaultnya mungkin harus baik -baik saja untuk sebagian besar scehemes warna:
let g: vimspector_presentation_hint_hl = {
' normal ' : ' Identifier ' ,
' label ' : ' Title ' ,
}
Harap dicatat : API kustomisasi ini tidak stabil , artinya dapat berubah kapan saja. Saya akan berusaha untuk mengurangi dampaknya dan mengumumkan perubahan dalam Gitter.
Opsi berikut mengontrol ukuran default jendela UI (semuanya adalah angka)
g:vimspector_sidebar_width
(default: 50 kolom): Lebar kolom jendela utilitas kiri (variabel, jam tangan, jejak stack)g:vimspector_bottombar_height
(default 10 baris): Tinggi dalam baris jendela output di bawah jendela kode.Contoh:
let g: vimspector_sidebar_width = 75
let g: vimspector_bottombar_height = 15
Terminal biasanya dibuat sebagai perpecahan vertikal di sebelah kanan jendela kode, dan jendela itu digunakan kembali untuk buffer terminal berikutnya. 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.
Contoh:
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 " : " "
}
}
} }