Apakah Anda men-debug kode C ++ di Vim? Bagaimana?

152

Pertanyaannya adalah untuk Anda semua orang, yang menggunakan Vim untuk mengembangkan aplikasi C ++.

Ada suatu masa dalam hidup saya, yang dapat digambarkan sebagai 'Saya benci Vim !!!' .. 'Vim baik!'

Namun, setelah tumbuh sebagian besar di IDE pengembangan Microsoft, saya terbiasa dengan itu F5- F11pintasan ketika men-debug kode, menonton jendela, tumpukan panggilan dan kode utama - semua terlihat tanpa perlu mengetikkan perintah GDB.

Jadi, inilah pertanyaannya:

Apakah Anda menggunakan Vim juga untuk debugging? Atau apakah Anda beralih ke beberapa IDE untuk tujuan ini? Yang mana?

Bagi mereka yang menggunakan kode Vim untuk men-debug: apakah ada plugin untuk mengatur breakpoints di editor, sorot baris yang saat ini sedang kami debug, navigasi otomatis selama langkah, langkah masuk, langkah keluar?

Tolong, jangan bilang Anda menggunakan GDB sebagai baris perintah, lihat hanya satu baris yang di-debug, dll.

Andrew_Lvov
sumber
1
Saya yakin Anda masih dapat menemukan orang-orang yang sedang mengembangkan dan men-debug dengan "ed".
e2-e4
55
Ya Tuhan, mereka menjawab pertanyaan "debug kode C ++ saya plz", tapi tutup ini terlalu terlokalisasi ... konyol!
P Shved
17
Coba gdb -tui.
Jayesh
1
Apakah Anda terjebak di Vim atau bersedia melihat editor lain seperti Emacs yang memiliki integrasi gdb yang hebat? Apakah masalah utama dengan gdb adalah output baris tunggal secara default atau untuk menghindari mengetik l (ist) terus-menerus yang membantu dengan gdb -tui?
jla
1
Superset: stackoverflow.com/questions/4237817/configuring-vim-for-c Tapi saya mendesak Anda untuk menggunakan Eclipse dengan Vim keybindinds untuk kesadaran kelas.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

76

Berbeda dengan jawaban lain, setidaknya ada tiga opsi yang melakukan apa yang Anda butuhkan: clewn , pyclewn , dan vimgdb .

Ketiga proyek terkait. vimgdb adalah patch terhadap Vim dan membutuhkan Vim untuk dikompilasi ulang. clewn adalah program mandiri yang berkomunikasi dengan Vim melalui antarmuka soket Netbeans. Ini membutuhkan Vim untuk dibangun dengan +netbeansopsi (ini adalah kasus di distribusi Linux baru-baru ini sehingga seharusnya tidak menjadi masalah).

Mengutip dari situs web clewn:

Clewn mengimplementasikan dukungan gdb penuh di editor vim: breakpoints, variabel jam tangan, penyelesaian perintah gdb, jendela perakitan, dll.

Saya pikir Anda harus mencobanya.

Beranda situs web pyclewn menunjukkan perbandingan antara ketiga proyek.

Beberapa bulan yang lalu saya mencoba pyclewn. Agak sulit untuk diatur, tapi terlihat bagus dan menjanjikan. Saya baru saja melakukan beberapa tes dan Anda dapat mengatur bookmark, dll., Hal-hal yang biasa Anda harapkan dari debugger grafis. Saya akhirnya tidak menggunakannya untuk alasan kontingen tetapi saya ingin mencobanya lagi.

UncleZeiv
sumber
6
Conque GDB adalah alternatif yang bagus. Mudah dipasang, sederhana dan sangat kuat.
Druesukker
@UncleZeiv vimgdb sudah usang. Saya menyatakan perlunya pembaruan di sini: github.com/larrupingpig/vimgdb-for-vim7.4/issues/4
hlin117
@Druesukker, balasan Anda layak mendapat jawaban resmi!
solotim
@UncleZeiv Tautan Anda ke vimgdb tidak. Itu harus pergi ke github.com/larrupingpig/vimgdb-for-vim7.4 , saya kira
mcepl
2
Hanya untuk menambahkan vim "like" debugger berbasis GDB - cgdb.github.io
Jimmy MG Lim
24

Vim menambahkan built-in debugger secara resmi di versi 8.1, dirilis pada Mei 2018. Fitur ini telah hadir di beberapa rilis versi 8.0 juga, pada awal Agustus 2017.

Perintah vim berikut memuat plugin dan memulai debugger.

:packadd termdebug
:Termdebug

Perintah terakhir mengambil program sebagai argumen opsional, atau sebagai alternatif program dapat dimuat dari gdbjendela dengan fileperintah.

Dengan plugin dimuat, gdbdapat digunakan secara interaktif di jendela yang sesuai. Misalnya, breakpoints dapat diatur, kode dapat dilewati, dan variabel dapat diperiksa.

Perintah Vim dapat dikeluarkan untuk berinteraksi dengan gdb. Beberapa perintah yang relevan meliputi :Step, :Over, :Finish, :Continue, :Stop, :Break, :Clear, dan :Evaluate.

Selain itu, ada tombol yang dapat diklik di bagian atas jendela editor untuk berinteraksi gdb.

Jendela editor diperbarui untuk mencerminkan keadaan debugging. Breakpoint ditunjukkan dengan >>dan garis saat ini disorot.

Halaman bantuan built-in termasuk dokumentasi menyeluruh.

:help terminal-debug

Baru-baru ini saya menulis posting blog yang membahas contoh sesi.

https://www.dannyadam.com/blog/2019/05/debugging-in-vim/

dannyadam
sumber
14

Vim adalah editor yang bagus, tetapi untuk melakukan debugging saya menggunakan debugger (seperti GDB).

Tetapi Anda tidak harus menggunakan GDB dalam mode teks; Anda dapat menggunakan antarmuka grafis seperti KDbg , DDD atau Insight .

Ada beberapa cara untuk memasukkan GDB ke Vim (tetapi kemudian Anda mendapatkan debugging berbasis teks).

Johan
sumber
10

editPerintah GDB

Buka editor di baris saat ini menggunakan perintah:

$EDITOR +<current-line> <current-file>

Standarnya editoradalah ex, tetapi vimjuga memahami +<current-line>formatnya.

Ketika Anda keluar dari editor, Anda kembali ke gdb.

Ini memungkinkan Anda untuk menelusuri sumber secara bebas dan sangat kuat jika Anda memiliki ctagsintegrasi.

Ini adalah built-in one way gdb to vim integrasi orang miskin: hal utama yang hilang adalah pengaturan breakpoints dari Vim.

edit dan pusat

edittidak memusatkan Vim secara default di sekitar sumber, jadi saya telah membuat skrip Python yang melakukannya: Bagaimana cara membuka file saat ini di baris saat ini dalam editor teks dari GDB?

Perintah breakpoint untuk bantuan clipboard

Perintah vim ini menyalin penentu breakpoint tipe:

b <file-path>:<line-number>

ke clipboard:

command! Xg :let @+ = 'b ' . expand('%:p') . ':' . line('.')

Maka Anda bisa menempelkannya ke gdb.

Ini adalah vim orang miskin untuk integrasi gdb untuk memudahkan pengaturan breakpoints.

Dasbor GDB

https://github.com/cyrus-and/gdb-dashboard

Ini tidak ada hubungannya dengan Vim, tetapi ini adalah solusi ringan yang mencapai banyak dan mungkin cocok dengan Vimmers lain di luar sana.

Yang lain telah menyebutkan GDB TUI, tetapi saya merasa terlalu rusak dan tidak cukup kuat untuk bisa ditanggung.

Jadi saya pindah ke solusi berbasis API Python seperti GDB Dashboard.

Saya telah menjelaskan digunakan dan alasan lebih terinci di: gdb tampilan split dengan kode

Berikut ini screenshot dari apa yang diberikannya kepada Anda:

masukkan deskripsi gambar di sini

Lihat juga: /vi/2046/how-can-i-integrate-gdb-with-vim

Menyerahlah dan gunakan IDE nyata

Dengan semua yang dikatakan, ini adalah solusi terbaik bagi kebanyakan orang, termasuk saya. Kebanyakan orang hanya akan mendapatkan banyak waktu jika mereka dapat melompati definisi dengan cara sadar kelas C ++ tanpa memilih dan menginstal beberapa plugin yang berbeda, dan itu termasuk saat langkah debugging barang. Pada tahun 2020, yang terburuk bagi saya adalah Eclipse: https://www.slant.co/topics/1411/~best-ides-for-c-on-linux

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
4

Menggunakan debugger tingkat sumber hanyalah salah satu dari banyak cara untuk mendiagnosis perilaku program yang salah, dan saya jarang menemukan diri saya meluncurkannya - meskipun faktanya sangat mudah dilakukan.

Jadi bagi saya, tidak ada keuntungan inheren untuk menggunakan editor teks yang kebetulan juga menjadi debugger . Sebagai gantinya, saya menggunakan editor teks yang saya sukai - terlepas dari debugger apa yang saya pilih untuk digunakan. Saat ini, saya lebih banyak menggunakan gedit dan kdbg untuk tujuan ini, tetapi pilihan ini berkembang secara independen dari waktu ke waktu.

Brent Bradburn
sumber
1
Kecuali jika Anda mengembangkan remote pada host pengembangan kde / gnome-free.
user826955
3

Pembaruan 2020: Ada vimspector plugin baru menggunakan Debug Adapter Protocol

  1. Instal plugin https://github.com/puremourning/vimspector#installation

  2. Konfigurasikan (tulis .vimspector.json)

  3. Kompilasi dengan simbol debug g++ cpp.cpp -ggdb -o cpp

  4. Tekan F4untuk memulai debug

masukkan deskripsi gambar di sini

  • Catat saya .vimspector.jsondi direktori rumah saya (jadi kerjakan di subdirektori apa pun)
{
"configurations": {
  "Python - Launch": {
    "adapter": "vscode-python",
    "configuration": {
      "name": "Python: Launch current file",
      "type": "python",
      "request": "launch",
      "stopOnEntry": true,
      "stopAtEntry": true,
      "console": "externalTerminal",
      "debugOptions": [],
      "cwd": "${cwd}",
      "program": "${file}"
    }
  },
  "Perl - Launch": {
    "adapter": "vscode-perl-debug",
    "configuration": {
      "name": "Perl: Launch current file",
      "type": "perl",
      "request": "launch",
      "exec": "/usr/bin/env perl",
      "execArgs": [],
      "stopOnEntry": true,
      "stopAtEntry": true,
      "console": "externalTerminal",
      "sessions": "single",
      "debugOptions": [],
      "cwd": "${cwd}",
      "program": "${file}"
    }
  },
  "C - Launch": {
    "adapter": "vscode-cpptools",
    "configuration": {
      "name": "Cpp: Launch current file",
      "type": "cppdbg",
      "request": "launch",
      "externalConsole": true,
      "logging": {
        "engineLogging": true
      },
      "stopOnEntry": true,
      "stopAtEntry": true,
      "debugOptions": [],
      "MIMode": "gdb",
      "cwd": "${cwd}",
      "program": "${fileDirname}/${fileBasenameNoExtension}"
    }
  },
  "Java - Launch": {
    "adapter": "vscode-java",
    "configuration": {
      "name": "Java: Launch current file",
      "request": "launch",
      "mainClass": "com.vimspector.test.TestApplication",
      "sourcePaths": [ "${workspaceRoot}/src/main/java" ],
      "classPaths": [ "${workspaceRoot}/target/classes" ],
      "args": "hello world!",
      "stopOnEntry": true,
      "console": "integratedTerminal"
    }
  }
} }
Tinmarino
sumber
1

Setelah baru-baru ini bekerja pada aplikasi untuk waktu yang lama yang membutuhkan banyak hal untuk ditempatkan pada kotak yang sedang berjalan (alat mengatur), saya menulis kode dalam vim, memiliki skrip yang membangun otomatis, mendorongnya ke server , yang memiliki skrip di sana untuk memperhatikan file sentinel didorong bersama dengan binari. Ini kemudian akan me-restart layanan yang sesuai pada kotak, dan di jendela ssh lain saya tail -fmenjalankan file log saya.

Singkatnya, saya tidak menggunakan debugger sama sekali. Jika saya memiliki sesuatu yang mati secara tak terduga, saya hanya akan menaikkan level logging, mengulanginya, dan melihat apa hal terakhir yang dicatat sebelum mati, kemudian menganalisisnya dan memperbaiki masalah tersebut.

Yang menyenangkan adalah ketika ada masalah di lingkungan pelanggan, saya hanya akan meminta log tingkat Debug dan bisa mengidentifikasi masalah tanpa perlu akses ke server mereka.

... tapi ya, ada saat-saat ketika akan menyenangkan memiliki debugger.

Shawn D.
sumber
0

Tambahkan saja di atas:

IMO vim cenderung menjadi editor yang ringan dan debugging cenderung menambah bobot. Ada cara untuk melakukannya yaitu menggunakan vim7.4 + dengan

:terminal

dan menjalankan salah satu dari debuggers commandline (kutukan) berikut. Beberapa digunakan secara default untuk IDE yang Anda tidak pernah tahu. yaitu lldb = xcode.

jelas ada lebih banyak berbasis cli; @semua merasa bebas untuk menyarankan dan menambahkan ke daftar. Terima kasih!

Jimmy MG Lim
sumber