Bagaimana Anda melakukan debug tanpa IDE? [Tutup]

61

Setiap kali saya mencari IDE (saat ini saya mengutak-atik Go), saya menemukan utas penuh dengan orang merekomendasikan Vi, Emacs, Notepad ++ dll.

Saya tidak pernah melakukan pengembangan di luar IDE; Saya kira saya sudah dimanjakan. Bagaimana Anda melakukan debug tanpa IDE? Apakah Anda terbatas hanya dengan login?

ConditionRacer
sumber
53
Oldschool printf style debugging sejauh yang saya tahu :-)
Andrew Walters
25
Pada hari-hari sebelum IDE, kami menggunakan debugger yang melekat pada proses yang berjalan atau membungkus proses untuk memungkinkan melangkah atau introspeksi dari status program. (gdb, perl -d, dll ...) Integrasi dari debugger ke dalam IDE membuatnya nyaman, tetapi mereka ada secara terpisah. Gagal debuggers, logging ... pastikan logging tidak mengubah status program ketika diambil kembali dan memperkenalkan kembali bug yang Anda coba temukan.
7
debugger baris perintah, (beberapa debugger IDE didasarkan pada mereka)
ratchet freak
14
Perlahan dan hati-hati.
FrustratedWithFormsDesigner
3
Sementara cetakan cukup umum penggunaannya dapat menyembunyikan beberapa bug yang lebih halus seperti kondisi balapan.
James

Jawaban:

86

Dengan menggunakan debugger. Sebagian besar, ini juga yang dilakukan oleh IDE di balik layar - itu hanya membungkus pengalaman dalam GUI.

Di Unix, salah satu debuggers yang paling umum digunakan adalah GNU gdb, yang telah menggantikan sebagian besar debuggers Unix sebelumnya seperti dbx.

Untuk mendapatkan gambaran tentang apa yang tampak / terasa seperti debugging dari baris perintah, Anda dapat melihat manual gdb .

Seperti di daerah lain, menggunakan debugger dari baris perintah membutuhkan mempelajari sintaks dan serangkaian perintah, tetapi membawa banyak fleksibilitas dan skripabilitas. Di sisi lain, jika Anda sudah merasa nyaman bekerja di editor seperti vim atau emacs, Anda mungkin menemukan bahwa editor favorit Anda memiliki plug in untuk debugger favorit Anda.

jimwise
sumber
18
+1 untuk "Dengan menggunakan debugger". I in IDE adalah singkatan dari "Integrated" :)
joshin4colours
1
Jika Anda menulis dengan Python, pdbsebenarnya lebih baik daripada debugger IDE yang saya temukan.
asthasr
1
@syrion Dan ipdblebih baik dari itu;)
Izkata
Luar biasa - Saya tidak tahu itu ada, Izkata. Terima kasih.
asthasr
@ joshin4colours terintegrasi! = koleksi, bukan?
Cole Johnson
35

Saya menggunakan debugger selama beberapa tahun ketika saya sedang menulis driver grafis. Saya memiliki komputer kedua yang menjalankan debugger terhadap yang pertama (karena layar di komputer utama tidak akan berfungsi ketika driver grafis rusak). Sangat penting untuk dapat menghentikan kode dan melangkah ke titik di mana saya menggantung perangkat keras sehingga saya tahu apa yang terjadi.

Untuk masalah perangkat lunak murni, saya menemukan bahwa berpikir tentang masalah dan menguji sistem untuk mempelajari lebih lanjut tentang masalah jauh lebih berguna daripada melangkah melalui kode baris demi baris. Dengan pernyataan cetak, saya memiliki daftar semua yang terjadi pada baris perintah atau file log yang dapat saya lihat dan merekonstruksi apa yang terjadi, bergerak maju dan mundur dengan lebih mudah daripada yang pernah saya lakukan dengan debugger.

Bug yang paling sulit biasanya diselesaikan dengan memahami masalah dari komputer. Terkadang dengan selembar kertas atau papan tulis, dan terkadang jawabannya muncul dengan sendirinya saat saya melakukan sesuatu yang lain. Bug paling sulit diselesaikan dengan melihat dengan hati-hati pada kode seperti bermain Where's Waldo. Semua yang lain tampak paling mudah dengan pernyataan cetak, atau pernyataan logging.

Orang yang berbeda memiliki gaya yang berbeda, dan gaya yang berbeda lebih baik untuk tugas yang berbeda pula. Pernyataan cetak tidak harus merupakan langkah mundur dari debugger. Tergantung pada apa yang Anda lakukan, mereka bahkan bisa lebih baik. Terutama dalam bahasa yang tidak memiliki debugger asli (apakah Go?).

GlenPeterson
sumber
7
Ini. Benar-benar ini Saya menemukan, bahwa setidaknya bagi saya, masalah cenderung kesalahan logika atau interaksi yang tidak terlihat oleh debugger. Anda harus memahami mengapa ada sesuatu yang salah, bukan hanya apa .
Nama Palsu
2
+1 sepenuhnya untuk going backwards. Saya sering memiliki pengalaman: "Hei - tunggu sebentar, ini bukan nilai yang tepat! Bagaimana ini menjadi ini ?", Dan harus bolak-balik dalam output sambil membaca kode. Debugger buruk di belakang.
Izkata
ya, gdb bagus untuk memeriksa core yang dibuang, tetapi dalam situasi seperti itu, saya mendapati bahwa penggunaan pernyataan cetak yang sembrono sangat membantu.
Brian
Debuggers berguna tetapi fana. Dengan kerangka kerja logging yang bagus, saya menemukan saya bisa membangun sesi debugging saya. Gunakan debugger untuk membantu memahami situasi, lengkapi dengan pernyataan cetak untuk membuat sesi debugging permanen. Saya menemukan bahwa seiring waktu saya semakin sedikit menuntut debugger dan menjadi lebih dan lebih produktif
Newtopian
Ya, berpikir dengan selembar kertas atau papan tulis atau hanya dalam pikiran Anda adalah cara terbaik untuk debug. Ini sering memperbaiki proses berpikir Anda. Debugger kadang-kadang merupakan jalan keluar yang mudah yang mungkin tidak menyelesaikan masalah awal mengapa bug terjadi dalam program Anda :)
Nishant
11

Beberapa orang menggunakan gdb di baris perintah, atau sebuah plugin . Ada juga ujung depan GUI mandiri ke gdb, seperti DDD . Bergantung pada bahasa Anda, ada GUI debugger mandiri khusus-bahasa, seperti Winpdb untuk python, atau jswat untuk java. Karena proyek-proyek ini hanya fokus pada debugging, mereka seringkali lebih unggul daripada debugger terintegrasi.

Rahasia kecil kotor lainnya tentang IDE adalah semuanya sepadan dengan garamnya memungkinkan Anda menentukan editor khusus, sehingga Anda dapat menggunakan bagian-bagian IDE untuk tugas-tugas tertentu, tetapi menggunakan editor yang layak untuk mengedit. Tidak jarang hanya menjalankan IDE untuk menggunakan debugger-nya, terutama jika itu yang digunakan oleh semua kolega Anda.

Karl Bielefeldt
sumber
1
+1 Pilihan lain tentu saja adalah mengatur skema warna dan keybind pada editor IDE, dan berpura-pura :)
darvids0n
1
@ darvids0n, saya telah menggunakan IDE untuk sesuatu selama lebih dari dua puluh tahun, dan saya harus BELUM menemukannya dengan editor yang bahkan mulai mengisyaratkan untuk memikirkan mungkin suatu hari nanti mengisyaratkan bahwa mungkin suatu saat di abad berikutnya berpikir untuk mencoba mulai mencoba untuk mencoba memegang lilin untuk GNU Emacs.
John R. Strohm
6

Beberapa bahasa menawarkan REPL - yaitu, Anda dapat menulis dan mengeksekusi kode per baris saat Anda menulisnya, yang dapat menjadi langkah pertama dalam memverifikasi sepotong kode. Banyak dari ini juga menawarkan fasilitas debugging. GHC untuk Haskell hadir dengan GHCi yang dapat digunakan untuk debug program secara interaktif di baris perintah, mirip dengan bagaimana IDE akan melakukannya.

CodexArcanum
sumber
2

Saya tidak mengerti mengapa ada keengganan untuk debugging dengan menggunakan pernyataan printf. Ada waktu ketika terlalu lama untuk mengkompilasi ulang dan menautkan suatu program, tetapi hari ini hanya butuh beberapa detik. Saya merasa sangat mudah untuk debug menggunakan jenis output cout, printf, qDebug (), dll. Pernyataan Printf memberi Anda riwayat menjalankan semua yang dilakukan program, yang dapat Anda analisis setelah fakta, sedangkan menjalankan debugger menyebabkan Anda harus mengingat secara manual aliran program saat dijalankan. Dengan printf, Anda dapat mengonversi nilai variabel ke unit tertentu, menampilkannya dalam hex, desimal, apa pun. Pernyataan printf dapat mencantumkan nama-nama rutin dan variabel, dan nomor baris juga. Anda bisa mendaftar hanya elemen array tertentu tergantung pada variabel lain. Anda dapat mengikuti tipuan. Anda dapat mengontrol output dengan sangat mudah, memasukkan penghitung, hanya mencetak waktu-waktu tertentu melalui loop, menambah dan menghapus pernyataan cetak saat Anda men-debug, memiliki berbagai tingkat hasil debug, menulis ke file, dll. Ini jauh lebih mudah untuk melihat sejarah program Anda yang ditulis ke file daripada ke cobalah untuk mengingat semua tempat yang Anda lewati secara manual, dan mungkin harus menuliskan konten variabel saat mereka berubah sepanjang waktu, untuk menemukan apa yang telah dilakukan program. Dan akhirnya, dengan pernyataan printf Anda dapat membiarkannya secara permanen, untuk dihidupkan dan dimatikan, untuk debugging berikutnya. Jauh lebih mudah untuk melihat riwayat program Anda yang ditulis ke file daripada mencoba mengingat semua tempat yang Anda lewati secara manual, dan mungkin harus menuliskan isi variabel ketika mereka berubah melalui waktu, untuk menemukan program apa telah selesai. Dan akhirnya, dengan pernyataan printf Anda dapat membiarkannya secara permanen, untuk dihidupkan dan dimatikan, untuk debugging berikutnya. Jauh lebih mudah untuk melihat riwayat program Anda yang ditulis ke file daripada mencoba mengingat semua tempat yang Anda lewati secara manual, dan mungkin harus menuliskan isi variabel ketika mereka berubah melalui waktu, untuk menemukan program apa telah selesai. Dan akhirnya, dengan pernyataan printf Anda dapat membiarkannya secara permanen, untuk dihidupkan dan dimatikan, untuk debugging berikutnya.

Robert Felten
sumber
3
"Ada waktu ketika terlalu lama untuk mengkompilasi ulang dan menautkan program, tetapi hari ini hanya butuh beberapa detik". Tergantung pada bahasa dan ukuran proyek Anda. Jika saya mengubah file header di proyek saya saat ini, itu akan memakan waktu sekitar 65 menit untuk membangun kembali pada mesin 32-CPU dengan 256GB RAM (saya tidak bercanda)
Nemanja Trifunovic
Orang tidak memiliki "penolakan" untuk debugging dengan pernyataan cetak, mereka hanya lebih suka debugger. Saya tahu lebih banyak "printf people" yang tidak pernah menggunakan debugger daripada "debugger people" yang tidak pernah melakukan debug menggunakan printfs.
Karl Bielefeldt
1
Secara mengejutkan sulit untuk menggunakan debugger untuk sistem yang terdistribusi secara memadai, tetapi (dengan beberapa ketidaktepatan karena masalah sinkronisasi jam) mungkin untuk mengkorelasikan log. Jika sistem perangkat lunak Anda terdiri dari binari yang dijalankan pada 100 mesin yang berbeda, log / "debugging printf" mungkin lebih mudah daripada menggunakan debugger dan mencoba untuk menjaga semuanya dalam langkah kunci yang cukup sehingga Anda tidak menimbulkan masalah lain.
Vatine
2

jimwise menjawab pertanyaan dengan cukup baik, tetapi saya pikir saya harus menambahkan itu, jika Anda memilih untuk bekerja tanpa IDE penuh, debugger baris perintah yang disediakan Microsoft untuk Windows disebut CDB . CDB hadir dengan beberapa alat lain, termasuk WinDBG yang setara dengan GUI, saat Anda mengunduh Windows SDK.

Drew Marsh
sumber
4
dapatkah Anda jelaskan secara lebih rinci bagaimana cara menjawab pertanyaan yang diajukan?
nyamuk
Anda benar, dengan sendirinya itu tidak menjawab pertanyaan. Saya merasa bahwa jawaban jimwise adalah jawaban yang bagus untuk pertanyaan tersebut, tetapi tidak menyertakan informasi tentang di mana menemukan debugger baris perintah untuk Windows. Jadi saya pikir saya akan menempel pada jawaban tambahan untuk mereka yang menemukan ini dan bertanya-tanya bagaimana melakukannya di Windows. Saya akan memperbarui jawaban saya untuk mengatakan sebanyak mungkin.
Drew Marsh
2

Saya biasanya tidak menggunakan debugger, mungkin sekali setiap beberapa minggu tetapi itu bukan hal pertama yang saya tuju.

Alat yang paling penting dalam pekerjaan saya sangat di mana-mana sehingga saya hampir lupa menyebutkannya - tumpukan jejak. Lebih dari 90% masalah yang saya temui dapat diselesaikan dengan memeriksa jejak tumpukan. Alat ini tidak selalu sangat membantu tergantung pada bahasa Anda, tetapi ketika mereka diimplementasikan dengan baik oleh bahasa mereka dapat menghemat waktu Anda yang luar biasa.

Saya kira cara kedua yang paling umum saya mendeteksi masalah sederhana adalah mungkin itu kode yang baru saja saya ubah. Saya menjalankan tes unit cukup sering sehingga saya biasanya tahu apa yang baru saja saya langgar.

Untuk pengembangan dan debugging yang lebih kompleks, saya mungkin menambahkan beberapa debug atau melacak pernyataan log level. Saya menganggap masalah pengembangan sebagai panduan yang baik untuk membantu saya menempatkan informasi penelusuran / penelusuran log produksi, yang mengarahkan saya ke:

Anda tidak selalu memiliki alat debugger. Dalam produksi mungkin tidak mungkin menjalankan debugger (Heck, mungkin tidak mungkin untuk mengakses mesin produksi kecuali untuk log tergantung pada seberapa aman perusahaan Anda). Ada juga bahasa di mana menghubungkan debugger hanya memakan waktu terlalu lama atau mungkin tidak tersedia debugger yang bagus.

Jika Anda telah melakukan pengkodean menggunakan logika dan debug / penelusuran jejak tingkat itu bisa saja menjadi kasus memeriksa laporan log yang sangat baik Anda (Mungkin meningkatkan tingkat log) untuk mencari tahu masalah tanpa bahkan mengakses perangkat keras.

Meskipun saya pikir debuggers adalah alat yang ampuh, jangan biarkan mereka menjadi satu-satunya alat di kotak peralatan Anda!

Bill K
sumber
1

Tidak ada alasan mengapa Anda tidak dapat menggunakan debugger dalam IDE bersama editor teks mandiri. Saya biasa menggunakan! Zap untuk mengedit, JBuilder untuk debug pada komputer lain, dan fileserver di ruang bawah tanah. Biasanya debugger adalah program mandiri tanpa menyeret IDE, dan itu juga berfungsi.

Perlu diperhatikan bahwa pengujian komprehensif menggantikan debugging. Sebaiknya pertimbangkan bug yang dilaporkan sebagai bug dalam pengujian Anda dan bukan dalam kode Anda.

Ada juga printf. Ini dapat berguna untuk membuat sejumlah besar "logging" dan mencari melalui itu, daripada berhenti untuk setiap baris. Saya menemukan sangat berguna jika Anda dapat memodifikasi kelas perpustakaan yang Anda tidak dapat memodifikasi dalam produksi, misalnya menggunakan -Xbootclasspath/p:untuk meretas kelas perpustakaan Java.

Tom Hawtin - tackline
sumber
"Perlu diperhatikan bahwa pengujian komprehensif menggantikan debugging." - Saya akan mengatakan mengurangi, bukan "menggantikan". Ada saat-saat tertentu di mana menjalankan kode melalui debugger bermanfaat, bahkan ketika melakukan TDD - misalnya ketika tes memberikan hasil yang sama sekali tidak terduga, mencari tahu di mana kesalahan itu bisa sangat berguna - harus diakui, kecuali jika itu dalam potongan kecil kode yang baru saja Anda tulis, itu berarti Anda telah melewatkan kasus tepi dalam pengujian sebelumnya, tetapi itu tidak terjadi ...
Jules
1

Setuju bahwa masalah terbaik dapat diselesaikan dari komputer dengan pena dan kertas atau hanya memikirkan masalah itu. Ini lebih membantu daripada menggunakan live debugger. Ini sering memperbaiki proses berpikir Anda.

Anda dapat menggunakan pudb yang merupakan konsol berbasis antarmuka pengguna yang sederhana. Anda dapat memilih debugger yang disukai seperti pdb atau ipdb jika Anda ingin memasukkan REPL dan memeriksa lebih detail.

Periksa juga Wiki PythonDebuggingTools untuk koleksi alat yang lebih komprehensif yang tersedia.

Nishant
sumber
Pertanyaan aslinya adalah tentang Go, bukan Python.
TMN
Benar, entah bagaimana saya melewatkannya. Itu muncul dalam pencarian saya ketika saya memeriksa debugger Python.
Nishant