Mengapa debugging lebih baik dalam IDE? [Tutup]

145

Saya telah menjadi pengembang perangkat lunak selama lebih dari dua puluh tahun, pemrograman dalam C, Perl, SQL, Java, PHP, JavaScript, dan baru-baru ini Python. Saya tidak pernah memiliki masalah yang tidak dapat saya debug menggunakan pemikiran yang cermat, dan printpernyataan debugging yang ditempatkan dengan baik .

Saya menghargai bahwa banyak orang mengatakan bahwa teknik saya primitif, dan menggunakan debugger nyata dalam IDE jauh lebih baik. Namun dari pengamatan saya, pengguna IDE tampaknya tidak melakukan debug lebih cepat atau lebih sukses daripada yang saya bisa, menggunakan pisau batu dan kulit beruang saya. Saya dengan tulus terbuka untuk mempelajari alat yang tepat, saya baru saja tidak pernah ditunjukkan keuntungan yang menarik untuk menggunakan pengeluh visual.

Selain itu, saya belum pernah membaca tutorial atau buku yang menunjukkan cara debug secara efektif menggunakan IDE, di luar dasar-dasar cara mengatur breakpoint dan menampilkan isi variabel.

Apa yang saya lewatkan? Apa yang membuat alat debugging IDE jauh lebih efektif daripada penggunaan printpernyataan diagnostik yang bijaksana ?

Bisakah Anda menyarankan sumber daya (tutorial, buku, screencasts) yang menunjukkan teknik debugging IDE yang lebih baik?


Jawaban manis! Terima kasih banyak untuk semua orang yang telah meluangkan waktu. Sangat mencerahkan. Saya memilih banyak, dan tidak memilih.

Beberapa poin penting:

  • Debuggers dapat membantu saya melakukan inspeksi ad hoc atau perubahan variabel, kode, atau aspek lain dari lingkungan runtime, sedangkan debugging manual mengharuskan saya untuk berhenti, mengedit, dan menjalankan kembali aplikasi (mungkin memerlukan kompilasi ulang).
  • Debugger dapat melampirkan ke proses yang berjalan atau menggunakan crash dump, sedangkan dengan debugging manual, "langkah-langkah untuk mereproduksi" cacat diperlukan.
  • Debuggers dapat menampilkan struktur data yang kompleks, lingkungan multi-threaded, atau tumpukan runtime penuh dengan mudah dan dengan cara yang lebih mudah dibaca.
  • Debuggers menawarkan banyak cara untuk mengurangi waktu dan pekerjaan berulang untuk melakukan hampir semua tugas debugging.
  • Debugger visual dan debugger konsol sama-sama berguna, dan memiliki banyak fitur yang sama.
  • Sebuah debugger visual yang diintegrasikan ke dalam IDE juga memberi Anda akses mudah ke pengeditan cerdas dan semua fitur lain dari IDE, dalam lingkungan pengembangan terintegrasi tunggal (karenanya namanya).
Bill Karwin
sumber
14
Saya pikir Anda salah berasumsi bahwa diperlukan IDE untuk menggunakan debugger? Debugger adalah alat yang tak ternilai apakah digunakan di dalam IDE atau tidak.
codelogic
Saya setuju, Pertanyaannya hampir menyatakan bahwa Anda tidak dapat melakukan debug dengan debugger di IDE. Anda dapat menjalankan debugger dengan atau tanpa IDE, saya yakin dia tahu itu :) Mungkin dia bertanya tentang visual debugger secara spesifik?
hhafez
Ya, para penganggu visual. Saya juga tahu tentang penentang non-visual seperti gdb, tetapi ini tidak mendapatkan jenis advokasi yang sama.
Bill Karwin
Saya pikir masalah utama dengan pertanyaan Anda adalah Anda mengira IDE untuk debugger. Anda bertanya tentang debugging di IDE namun Anda menyamakan IDE dengan debugger dan 'non-IDE' sepertinya tidak menggunakan debugger. IDE! = Debugger. Saya benci IDE tapi saya suka debugger, untuk menjawab pertanyaan Anda, saya perlu menjelaskan poin yang berbeda untuk IDE dan debugger. Ini seperti bertanya: "Apakah bumi bundar atau dapatkah saya membeli sepeda?"
stefanB
6
@stefanB: Saya menerima banyak jawaban yang bagus untuk pertanyaan saya, yang menunjukkan bahwa Anda terlalu berlebihan.
Bill Karwin

Jawaban:

108

Beberapa contoh beberapa kemampuan yang akan diberikan oleh debugger IDE kepada Anda di atas jejak pesan dalam kode:

  • Lihat tumpukan panggilan kapan saja, memberikan Anda konteks untuk frame tumpukan Anda saat ini.
  • Langkah ke perpustakaan yang Anda tidak dapat mengkompilasi ulang untuk tujuan menambahkan jejak (dengan asumsi Anda memiliki akses ke simbol debug)
  • Ubah nilai variabel saat program sedang berjalan
  • Edit dan lanjutkan - kemampuan untuk mengubah kode saat sedang berjalan dan segera melihat hasil dari perubahan
  • Mampu menonton variabel, melihat kapan mereka berubah
  • Mampu melewati atau mengulangi bagian kode , untuk melihat bagaimana kode akan bekerja. Ini memungkinkan Anda menguji perubahan teoretis sebelum membuatnya.
  • Periksa isi memori secara real-time
  • Beri tahu Anda ketika ada pengecualian tertentu , bahkan jika itu ditangani oleh aplikasi.
  • Breakpointing bersyarat ; menghentikan aplikasi hanya dalam keadaan luar biasa untuk memungkinkan Anda menganalisis tumpukan dan variabel.
  • Lihat konteks utas dalam aplikasi multi-utas, yang mungkin sulit dicapai dengan pelacakan (karena jejak dari utas berbeda akan disisipkan dalam output).

Singkatnya, pernyataan cetak statis (umumnya) dan Anda harus mengkompilasi ulang untuk mendapatkan informasi tambahan jika pernyataan asli Anda tidak cukup detail. IDE menghapus penghalang statis ini, memberi Anda toolkit dinamis di ujung jari Anda.

Ketika saya pertama kali mulai coding, saya tidak bisa mengerti apa masalahnya dengan para debugger dan saya pikir saya bisa mencapai apa pun dengan pelacakan (memang, itu di unix dan debugger itu GDB). Tetapi begitu Anda belajar cara menggunakan debugger grafis dengan benar, Anda tidak ingin kembali mencetak pernyataan.

LeopardSkinPillBoxHat
sumber
3
Aspek debugging dinamis adalah poin yang bagus.
Bill Karwin
2
Lebih mudah daripada jam tangan, Anda juga dapat mengarahkan kursor ke nama variabel saat melangkah melalui kode dan Anda mendapatkan tooltip nilainya. Anda bahkan dapat mengubah nilai itu dengan mengklik tooltip. Itu ruxx0rs.
Jon Davis
Sebagian besar dari ini adalah properti dari debugger interaktif, dengan atau tanpa IDE. Yaitu, semua yang ada di daftar itu (dengan kemungkinan pengecualian dari kode perubahan di tempat) dimungkinkan dengan GDB.
dmckee --- ex-moderator kitten
1
Ya, tetapi OP bertanya "Apa yang membuat alat debugging IDE jauh lebih efektif daripada penggunaan pernyataan cetak diagnostik yang bijaksana?". Saya membandingkan alat debugging IDE vs pernyataan cetak, bukan debugging IDE vs debugging konsol.
LeopardSkinPillBoxHat
Edit dan Lanjutkan adalah alat yang sangat kuat. Saya benar-benar berharap lebih banyak kompiler akan mendukungnya. Bisakah itu mengaktifkan kebiasaan buruk? Tentu. Bahkan kontrol sumber dapat memungkinkan praktik pembangunan yang buruk. E&C memungkinkan pemrogram menjadi jauh lebih efektif melacak masalah.
darron
34
  • Seorang debugger IDE memungkinkan Anda mengubah nilai-nilai variabel pada saat dijalankan.

  • Seorang debugger IDE memungkinkan Anda melihat nilai variabel yang tidak Anda tahu ingin Anda lihat ketika eksekusi dimulai.

  • Sebuah debugger IDE memungkinkan Anda melihat tumpukan panggilan dan memeriksa status fungsi yang melewati nilai aneh. (pikir fungsi ini dipanggil dari ratusan tempat, Anda tidak tahu dari mana nilai-nilai aneh ini berasal)

  • Seorang debugger IDE memungkinkan Anda menghentikan eksekusi secara kondisional pada titik mana pun dalam kode, berdasarkan kondisi, bukan nomor baris.

  • Seorang debugger IDE akan membiarkan Anda memeriksa keadaan program dalam kasus pengecualian yang tidak tertangani alih-alih hanya omong kosong.

rekursif
sumber
1
@ Joe, dalam konteks pertanyaan Bill, saya pikir mereka adalah setara. Bill berbicara tentang debugging printf. Apakah debugger terintegrasi dengan editor dan kompiler tidak penting pada saat itu.
Rob Kennedy
masalahnya adalah gdb, yang bukan merupakan debugger IDE, memiliki semua fitur ini
Tamas Czinege
Pertanyaannya adalah tentang debugger IDE vs debugging gaya cetak, jadi saya akan membiarkannya apa adanya.
rekursif
Ya, itu adalah keuntungan yang sangat valid dari para pen-debug. Saya mengerti fitur-fitur ini tersedia di konsol debugger juga, tetapi mereka tentu jawaban yang baik untuk pertanyaan saya.
Bill Karwin
16

Inilah satu hal yang Anda tidak dapat men-debug dengan pernyataan "cetak", yaitu ketika seorang pelanggan membawa Anda memori dump dan mengatakan "program Anda macet, dapatkah Anda memberi tahu saya alasannya?"

galet
sumber
5
Saya tertarik, bagaimana cara debugger mengatasi ini? Titik
awesomely
14
  • Mencetak pernyataan melalui kode Anda mengurangi keterbacaan.
  • Menambahkan dan menghapusnya hanya untuk keperluan debug saja memakan waktu
  • Debuggers melacak tumpukan panggilan sehingga mudah untuk melihat di mana Anda berada
  • Variabel dapat dimodifikasi dengan cepat
  • Perintah adhoc dapat dieksekusi selama jeda dalam eksekusi untuk membantu mendiagnosis
  • Dapat digunakan DALAM CONJUNCTION dengan pernyataan cetak: Debug.Write ("...")
DarkwingDuck
sumber
1
Terima kasih untuk daftar itu. Tidak semua poin tersebut merupakan keuntungan menarik dari debugging visual. Misalnya saya dapat mencetak jejak stack dengan cukup mudah di banyak lingkungan bahasa.
Bill Karwin
1
untuk # 2: menghubungkan debugger untuk server mungkin bahkan lebih memakan waktu di kali :)
inkredibl
9

Saya pikir debugging menggunakan pernyataan cetak adalah seni yang hilang, dan sangat penting untuk dipelajari setiap pengembang. Setelah Anda tahu cara melakukannya, kelas bug tertentu menjadi lebih mudah untuk di-debug dengan cara itu daripada melalui IDE. Programmer yang mengetahui teknik ini juga memiliki perasaan yang sangat baik tentang informasi apa yang berguna untuk dimasukkan ke dalam pesan log (belum lagi Anda benar-benar akan akhirnya membaca log) untuk keperluan non-debugging juga.

Yang mengatakan, Anda benar-benar harus tahu cara menggunakan debugger step-through, karena untuk kelas bug yang berbeda itu WAY lebih mudah. Saya akan menyerahkannya ke jawaban bagus lainnya yang sudah diposting untuk menjelaskan alasannya :)

rmeador
sumber
Setuju, dan terima kasih atas perspektifnya. Hanya karena debugger visual tingkat lanjut berguna, tidak berarti mereka merupakan pilihan terbaik untuk semua tugas. Sama seperti alat apa pun, mereka memiliki sweet spot mereka.
Bill Karwin
Setuju dengan itu, menggunakan cetak adalah keterampilan yang penting. Menyimpan saya berkali-kali ketika saya hanya memiliki toolset terbatas di mana hanya mungkin untuk mengedit file dan menjalankannya (itu terutama berlaku untuk pengembangan web).
inkredibl
2
Juga, menggunakan cetakan adalah HARUS jika Anda berjuang dalam kondisi lomba multithreaded. Praktis mustahil menemukan bug ini menggunakan debugger IDE breakpoint.
Radu094
1
Dalam pengalaman saya, menambahkan pernyataan cetak tidak banyak membantu dalam situasi multithreaded karena cetakan itu sendiri dapat menyebabkan semacam sinkronisasi utas yang mengubah sifat bug.
the_mandrill
Saya memilih setelah membaca kalimat pertama
TheIronKnuckle
6

Dari atas kepala saya:

  1. Debugging objek yang kompleks - Debuggers memungkinkan Anda untuk masuk jauh ke jeroan objek. Jika objek Anda memiliki, katakanlah, array dari objek yang kompleks, pernyataan cetak hanya akan membuat Anda sejauh ini.
  2. Kemampuan untuk melangkah melewati kode - Debuggers juga akan memungkinkan Anda untuk melewati kode yang tidak ingin Anda laksanakan. Benar, Anda bisa melakukan ini secara manual juga, tetapi lebih banyak kode yang harus Anda suntikkan.
Kevin Pang
sumber
Tapi saya bisa melakukan kedua hal ini sekarang menggunakan "manual" debugging ... apakah dengan menyuntikkan kode atau mencari tahu serangkaian pilihan menu IDE seperti labirin.
Bill Karwin
Ya kamu bisa. Tetapi apakah Anda benar-benar menginginkannya? Anda menanyakan alasan mengapa menggunakan IDE untuk debug lebih baik, bukan untuk hal-hal yang HANYA disediakan oleh IDE.
Kevin Pang
Cukup adil. Dengan asumsi seseorang mempelajari mantra menu untuk menggunakan fitur-fitur itu, maka selanjutnya mereka lebih mudah daripada harus menulis kode debugging baru setiap kali.
Bill Karwin
1
@BillKarwin Tidak yakin tentang IDE lain, tetapi tidak ada "mantra menu" untuk melewatkan eksekusi kode di Visual Studio. Anda bisa "menyeret" titik eksekusi saat ini ke baris baru. Menempatkan breakpoint sama mudahnya (klik pada nomor baris di mana Anda inginkan. Saya tidak berpikir saya pernah pergi ke menu untuk apa pun selain menyatukan jendela 'menonton' di VS, dan itu hanya perlu dilakukan dilakukan sekali (atau jika tata letak jendela Anda hilang, atau Anda menutup jendela arloji)
Grant Peters
Terima kasih atas tipsnya @GrantPeters!
Bill Karwin
4

Sebagai alternatif untuk men-debug dalam IDE, Anda dapat mencoba ekstensi Google Chrome ekstensi PHP yang bagus dengan pustaka php yang memungkinkan untuk:

  • Lihat kesalahan & pengecualian di konsol JavaScript Chrome & di sembulan pemberitahuan.
  • Buang semua variabel tipe.
  • Jalankan kode PHP dari jarak jauh.
  • Lindungi akses dengan kata sandi.
  • Log konsol grup berdasarkan permintaan.
  • Langsung ke file kesalahan: baris di editor teks Anda.
  • Salin data kesalahan / debug ke clipboard (untuk penguji).
barbushin
sumber
3

Saya belum mengembangkan selama hampir 20 tahun, tetapi saya menemukan bahwa dengan menggunakan IDE / debugger saya dapat:

  • lihat semua hal yang mungkin tidak terpikirkan oleh saya dalam pernyataan cetak
  • langkah melalui kode untuk melihat apakah itu cocok dengan jalur yang saya pikir akan diambil
  • atur variabel ke nilai tertentu untuk membuat kode mengambil cabang tertentu
Kevin Davis
sumber
Poin bagus! Tentu saja ini dapat mengurangi pengulangan "edit, kompilasi ulang, jalankan."
Bill Karwin
2

Salah satu alasan untuk menggunakan IDE mungkin karena IDE modern mendukung lebih dari sekadar breakpoint. Misalnya, Visual Studio menawarkan fitur debugging canggih berikut:

  • mendefinisikan breakpoint bersyarat (break hanya jika suatu kondisi terpenuhi, atau hanya pada waktu ke-n pernyataan di breakpoint dieksekusi)
  • istirahat pada pengecualian yang tidak tertangani atau setiap kali eksesepsi (spesifik) akan dilemparkan
  • ubah variabel saat debugging
  • mengulangi sepotong kode dengan mengatur baris berikutnya yang akan dieksekusi
  • dll.

Juga, saat menggunakan debugger, Anda tidak perlu menghapus semua pernyataan cetak setelah Anda selesai debugging.

M4N
sumber
Itu adalah contoh yang bagus. Saya kira saya belum pernah melihat tutorial yang layak atau artikel yang menunjukkan cara menggunakannya. Juga saya jarang menggunakan VS atau solusi Microsoft lainnya.
Bill Karwin
Tugas menghapus kode debug valid, meskipun saya sering hanya bisa melakukan "svn revert" untuk menghilangkannya.
Bill Karwin
#ifdef DEBUG printf ("variabel apa pun yang sekarang% d \ n", var); fflush (stdout); #endif
Arthur Kalliokoski
@ M4N, Cukup mudah untuk hanya melakukan restore versi.
Pacerier
2

Satu hal yang saya terkejut saya belum melihat jawaban lain adalah bahwa 2 metode debugging tidak saling eksklusif .

printfdebugging dapat bekerja dengan sangat baik bahkan jika Anda menggunakan debugger standar (apakah berbasis IDE atau tidak). Terutama dengan kerangka logging sehingga Anda dapat meninggalkan semua atau sebagian besar dalam produk yang dirilis untuk membantu mendiagnosis masalah pelanggan.

Seperti yang dicatat di hampir semua jawaban lain di sini, hal bagus utama tentang debugger standar adalah memungkinkan Anda untuk lebih mudah memeriksa (dan berpotensi mengubah) perincian status program. Anda tidak harus tahu di muka apa yang ingin Anda lihat - semuanya tersedia di ujung jari Anda (kurang lebih).

Michael Burr
sumber
Satu jawaban lain termasuk titik yang tidak saling eksklusif, tetapi diambil dengan baik.
Bill Karwin
2

Dalam pengalaman saya, cetakan sederhana memiliki satu keuntungan besar yang sepertinya tidak ada yang menyebutkan.

Masalah dengan debugger IDE adalah bahwa semuanya terjadi secara real time. Anda menghentikan program pada waktu tertentu, lalu Anda melangkah melalui langkah satu per satu dan tidak mungkin untuk kembali jika Anda tiba-tiba ingin melihat apa yang terjadi sebelumnya. Ini sepenuhnya bertentangan dengan cara kerja otak kita. Otak mengumpulkan informasi, dan secara bertahap membentuk suatu pendapat. Mungkin perlu untuk mengulangi peristiwa beberapa kali dalam melakukannya, tetapi begitu Anda telah melewati titik tertentu, Anda tidak bisa kembali.

Berbeda dengan ini, serangkaian cetakan / logging terpilih memberi Anda "proyeksi spasial dari peristiwa temporal". Ini memberi Anda cerita lengkap tentang apa yang terjadi, dan Anda dapat kembali dan keempat beberapa kali dengan sangat mudah hanya dengan menggulir ke atas dan ke bawah. Mudah untuk menjawab pertanyaan seperti "apakah A terjadi sebelum B terjadi". Itu dapat membuat Anda melihat pola yang bahkan Anda cari.

Jadi menurut pengalaman saya. IDE dan debugger adalah alat yang luar biasa untuk memecahkan masalah sederhana ketika ada sesuatu dalam satu panggilan-stack yang salah, dan menjelajahi kondisi mesin saat ini pada crash tertentu.

Namun, ketika kita mendekati masalah yang lebih sulit di mana perubahan negara secara bertahap terlibat. Di mana misalnya satu algoritma merusak struktur data, yang pada gilirannya menyebabkan kegagalan algoritma. Atau jika kita ingin menjawab pertanyaan seperti "seberapa sering hal ini terjadi", "apakah hal-hal terjadi dalam urutan dan dengan cara yang saya bayangkan terjadi". dll. Kemudian teknik logging / printout "kuno" memiliki keuntungan yang jelas.

Hal terbaik adalah menggunakan teknik mana pun ketika itu paling cocok, misalnya menggunakan penebangan / cetakan untuk mendapatkan beberapa bug, dan berhenti sejenak di breakpoint di mana kita perlu menjelajahi keadaan saat ini lebih detail.

Ada juga pendekatan hybrid. Misalnya, ketika Anda melakukan console.log (objek) Anda mendapatkan widget struktur data dalam log yang dapat Anda kembangkan dan jelajahi lebih detail. Ini sering kali merupakan keuntungan yang jelas dibandingkan dengan log teks "mati".

erobwen
sumber
1

Karena debugging aplikasi multi-threaded dengan pernyataan cetak akan membuat Anda pisang. Ya, Anda masih bisa melakukannya dengan pernyataan cetak tetapi Anda akan membutuhkan banyak dari itu dan mengurai cetakan berurutan dari pernyataan untuk meniru eksekusi multi-berulir akan membutuhkan waktu yang lama.

Otak manusia hanya satu-threaded sayangnya.

DarkwingDuck
sumber
Ya, orang dapat awalan string cetak dengan nomor utas atau sesuatu, atau memformat output dalam kolom dengan utas (jika tidak terlalu banyak). Tapi saya mengerti maksud Anda.
Bill Karwin
1
Satu hal lagi yang perlu diingat adalah bahwa kadang-kadang pernyataan print () menyinkronkan utas. Saya pernah melihat masalah ketika log debugging diaktifkan aplikasi berjalan baik-baik saja, tetapi setelah menonaktifkannya, crash langsung dan hal yang kami temukan adalah aplikasi itu melakukan sinkronisasi pada cetakan dan menyebabkannya berfungsi dengan benar.
inkredibl
1
Sebenarnya, sudah pengalaman saya bahwa perpustakaan log yang baik dan beberapa statemens print (non syncronized) yang diformat dengan cerdas kadang-kadang adalah HANYA cara untuk men-debug (dan memahami) beberapa bug multi-threaded killer. Breakpoints (dan simbol debug tambahan yang ditambahkan oleh kompiler) dapat mengubah lingkungan bug ke titik di mana tidak mungkin untuk menemukan / mereproduksi / memahami kondisi balapan.
Radu094
1

Karena Anda meminta pointer ke buku ... Sejauh debugging Windows berjalan, John Robbins memiliki beberapa edisi buku bagus tentang debugging Windows:

Aplikasi debug untuk Microsoft .NET dan Microsoft Windows

Perhatikan bahwa edisi terbaru ( Debugging Microsoft .NET 2.0 Applications ) adalah .NET saja, jadi Anda mungkin menginginkan yang lebih lama (seperti di tautan pertama) jika Anda ingin debugging kode asli (mencakup .NET dan asli).

Michael Burr
sumber
Terima kasih untuk tips buku! Saya jarang menggunakan pengembangan dengan platform Microsoft, tapi saya menghargai referensi.
Bill Karwin
1

Saya pribadi merasa jawabannya sesederhana "A debugger / IDE terintegrasi memberi Anda banyak informasi yang berbeda dengan cepat tanpa perlu menekan perintah. Informasi tersebut cenderung ada di depan Anda tanpa Anda belum memberi tahu apa yang harus dilakukan. menunjukkanmu.

The kemudahan di mana informasi yang dapat diambil adalah apa yang membuat mereka lebih baik daripada hanya debugging baris perintah, atau "printf" debugging.

OJ.
sumber
Itu ringkasan yang bagus atau pernyataan umum, cocok dengan contoh spesifik dan banyak jawaban lain yang disediakan.
Bill Karwin
Cheers Bill. Saya merasa bahwa memperdebatkan fitur vs fitur tidak ada gunanya karena sebagian besar waktu Anda dapat melakukan apa yang perlu Anda lakukan di kedua jenis debugger. Yang terintegrasi hanya membuat prosesnya jauh lebih sederhana (jika dilakukan dengan baik, seperti dalam kasus VS).
OJ.
1

Keuntungan debugger dibandingkan printf ( perhatikan bukan debugger IDE tetapi debugger apa pun )

  1. Dapat mengatur titik pandang. Ini adalah salah satu cara favorit saya untuk menemukan kerusakan memori

  2. Dapat men-debug biner yang tidak dapat Anda kompilasi ulang saat ini

  3. Dapat men-debug biner yang membutuhkan waktu lama untuk dikompilasi ulang

  4. Dapat mengubah variabel dengan cepat

  5. Dapat memanggil fungsi dengan cepat

  6. Tidak memiliki masalah ketika statemen debug tidak dimatikan dan karenanya masalah waktu tidak dapat di-debug secara akurat

  7. Debugger membantu dengan dump inti, mencetak pernyataan, jangan '

hhafez
sumber
1

Inilah yang paling saya gunakan pada windows debugging VS.NET:

  • Panggil tumpukan, yang juga merupakan cara terbaik untuk mengetahui kode orang lain
  • Warga & Jam Tangan.
  • Jendela langsung, yang pada dasarnya adalah konsol C # dan juga memungkinkan saya mengubah konten variabel, menginisialisasi barang, dll.
  • Kemampuan untuk melewati garis, mengatur pernyataan berikutnya untuk dieksekusi di tempat lain.
  • Kemampuan untuk mengarahkan kursor ke variabel dan memiliki tool-tip yang menunjukkan kepada saya nilai-nilai mereka.

Singkatnya, ini memberi saya pandangan 360 derajat dari status kode eksekusi saya, bukan hanya jendela kecil.

Tidak pernah menemukan buku yang mengajarkan hal semacam ini, tetapi sekali lagi, tampaknya cukup sederhana, itu cukup banyak WYSIWYG.

rodbv
sumber
+1 untuk setidaknya menjawab bagian dari pertanyaan saya mengenai sumber daya untuk mempelajari lebih lanjut.
Bill Karwin
0
  • Seorang debugger dapat melampirkan ke proses yang sedang berjalan

  • Seringkali lebih mudah untuk men-debug kode berulir dari debugger

Mitch Wheat
sumber
0

Dengan debugger IDE, Anda dapat melihat nilai-nilai SEMUA variabel dalam lingkup saat ini (sepanjang tumpukan panggilan) setiap kali Anda menghentikan eksekusi.

Laporan cetak dapat menjadi besar tetapi membuang begitu banyak informasi ke layar di setiap tempat tertentu dapat menghasilkan seluruh banyak laporan cetak.

Juga, banyak debugger IDE memungkinkan Anda mengetik dan mengevaluasi metode, dan mengevaluasi anggota saat Anda dihentikan, yang selanjutnya menambah jumlah pernyataan cetak yang harus Anda lakukan.

Saya merasa bahwa para penentang lebih baik untuk beberapa bahasa daripada yang lain namun ...

Pendapat umum saya adalah bahwa debugger IDE benar-benar, luar biasa indah untuk bahasa yang dikelola seperti Java atau C #, cukup berguna untuk C ++, dan tidak terlalu berguna untuk bahasa scripting seperti Python (tapi bisa jadi saya hanya belum mencoba yang baik debugger untuk bahasa skrip apa pun).

Saya sangat suka debugger di IntelliJ IDEA ketika saya melakukan pengembangan Java. Saya hanya menggunakan pernyataan cetak ketika saya menggunakan Python.

TM.
sumber
Yap, saya setuju bahwa bahasa dinamis memungkinkan Anda melewati langkah kompilasi. Anda bisa menambahkan cetakan diagnostik lain dan pergi. Saya dapat membayangkan debugger dinamis menghemat lebih banyak waktu jika Anda harus mengkompilasi ulang setelah setiap pengeditan tersebut.
Bill Karwin
0

Seperti seseorang berkata di atas: Debugger! = IDE.

gdb dan (kembali pada hari itu) TurboDebugger (berdiri sendiri) berfungsi dengan baik untuk bahasa yang mereka dukung [ed], terima kasih. (atau teknologi yang bahkan lebih tua: Clipper debugger yang ditautkan ke xBase dapat dieksekusi sendiri) - tidak ada yang memerlukan IDE

Juga, meskipun coding C / ++ lebih jarang, pernyataan printf terkadang menutupi bug yang Anda coba temukan! (masalah inisialisasi dalam vars otomatis pada stack, misalnya, atau alokasi / penyelarasan memori)

Akhirnya, seperti yang dinyatakan orang lain, Anda dapat menggunakan keduanya. Beberapa masalah waktu nyata hampir memerlukan cetakan, atau setidaknya "* video_dbg = (is_good? '+': '-') yang bijaksana; suatu tempat ke dalam memori video. Umur saya menunjukkan, ini di bawah DOS :-)

TMTOWTDI


sumber
0

Selain banyak dari apa yang dikatakan poster-poster lain, saya sangat suka melangkah melalui satu baris pada satu waktu bersama dengan komputer, karena itu memaksa saya untuk memikirkan satu baris pada suatu waktu. Seringkali saya akan menangkap bug tanpa melihat nilai variabel hanya karena saya terpaksa melihatnya ketika saya mengklik tombol 'baris berikutnya'. Namun, saya pikir jawaban saya tidak akan membantu Anda, Bill, karena Anda mungkin sudah memiliki keterampilan ini.

Sejauh sumber belajar berjalan, saya belum pernah menggunakan - saya hanya menjelajahi semua menu dan opsi.

Nate Parsons
sumber
0

Apakah ini bahkan pertanyaan nyata dari programmer sejati?

Siapa pun yang menghabiskan waktu 5 menit untuk debugging dengan pernyataan cetak dan debugging dengan IDE - itu akan TERJADI padanya tanpa bertanya!


sumber
Ini adalah pertanyaan lucu yang datang dari seseorang dengan moniker "Annon".
Bill Karwin
Dia di antara kamu adalah yang paling bijak yang tahu bahwa kebijaksanaannya benar-benar tidak berharga sama sekali. (Socrates)
Jacques de Hooge
0

Saya telah menggunakan cetakan dan IDE untuk debugging dan saya lebih suka debug menggunakan IDE. Satu-satunya waktu bagi saya ketika itu tidak berhasil adalah dalam situasi kritis waktu (seperti men-debug game online) di mana Anda membuang kode dengan pernyataan cetak dan kemudian melihat file log setelah salah. Kemudian jika Anda masih tidak bisa mengetahuinya, tambahkan lebih banyak cetakan dan ulangi.

KPexEA
sumber
0

Hanya ingin menyebutkan fitur yang berguna dari konsol debugger vs printf dan vs debugger di IDE.

Anda dapat melampirkan ke aplikasi jarak jauh (jelas, dikompilasi dalam mode DEBUG) dan memeriksa statusnya membuang output debugger ke file menggunakan teeutilitas POSIX . Dibandingkan dengan printf, Anda dapat memilih tempat mengeluarkan status dalam waktu berjalan.

Ini sangat membantu saya ketika saya sedang debugging aplikasi Adobe Flash yang digunakan dalam lingkungan yang agresif . Anda hanya perlu mendefinisikan beberapa tindakan yang mencetak status yang diperlukan di setiap breakpoint, mulai dengan debugger konsol fdb | tee output.log, dan berjalan melalui beberapa breakpoints. Setelah itu Anda dapat mencetak log dan menganalisis informasi dengan membandingkan keadaan secara menyeluruh di breakpoint yang berbeda.

Sayangnya, fitur ini [masuk ke file] jarang tersedia di debugger GUI, membuat pengembang membandingkan keadaan objek di kepala mereka.

Ngomong-ngomong, pendapat saya adalah bahwa seseorang harus merencanakan di mana dan apa yang harus di-debug sebelum menatap debugger.

baru ditemukan
sumber
Terima kasih! Tapi saya tidak yakin saya setuju bahwa debugger GUI tidak memiliki fitur debugging jarak jauh. Sebenarnya, sebagian besar memang memiliki kemampuan ini, tetapi agak sulit untuk membuatnya. Ngomong-ngomong, saya ingin tahu apakah Anda telah memeriksa DTrace - sepertinya Anda akan menyukainya.
Bill Karwin
@ Bill Karwin: Maksud saya kemampuan untuk login ke file =)
newtover
0

Nah hal lain adalah bahwa jika Anda bergabung dengan proyek lama baru dan tidak ada yang benar-benar tahu bagaimana kode melakukan apa yang dilakukannya, maka Anda tidak dapat men-debug dengan menggemakan variabel / objek / ... b / c Anda tidak tahu kode apa itu dieksekusi sama sekali.

Di pekerjaan saya, saya menghadapi situasi semacam itu dan visual XDebuging membantu saya mendapatkan ide tentang apa yang sedang terjadi dan di mana, sama sekali.

salam Hormat

Raffael

Raffael
sumber
0

Selain banyak hal yang telah disebutkan, salah satu keuntungan terpenting dari debugger dibandingkan printf adalah menggunakan pernyataan printf mengasumsikan bahwa Anda tahu di mana fungsi bug tersebut berada. Dalam banyak kasus Anda tidak, jadi Anda harus membuat beberapa tebakan dan menambahkan pernyataan cetak ke banyak fungsi lain untuk melokalisasikannya. Bug mungkin ada dalam kode kerangka kerja atau di suatu tempat yang jauh dari tempat Anda pikir itu. Dalam debugger, jauh lebih mudah untuk mengatur breakpoint untuk memeriksa keadaan di berbagai area kode dan pada titik waktu yang berbeda.

Juga, debugger yang layak akan membiarkan Anda melakukan debugging gaya printf dengan melampirkan kondisi dan tindakan ke breakpoint, sehingga Anda masih mempertahankan manfaat debugging printf, tetapi tanpa memodifikasi kode.

the_mandrill
sumber
0

Debugging dalam IDE sangat berharga dalam lingkungan di mana log kesalahan dan akses shell tidak tersedia, seperti host bersama. Jika demikian, IDE dengan debugger jarak jauh adalah satu-satunya alat yang memungkinkan Anda untuk melakukan hal-hal sederhana seperti tampilan stderratau stdout.

Paul Sweatte
sumber
0

Masalah dengan menggunakan pernyataan cetak adalah membuat kode Anda berantakan. IE, Anda memiliki fungsi dengan 10 bagian untuk itu dan Anda tahu itu crash di suatu tempat, tetapi Anda tidak yakin di mana. Jadi, Anda menambahkan 10 pernyataan cetak tambahan untuk menunjukkan di mana bug itu berada. Setelah Anda menemukan dan menyelesaikan bug Anda, sekarang Anda harus membersihkan dengan menghapus semua pernyataan cetak itu. Mungkin Anda akan melakukannya. Mungkin Anda akan lupa dan itu akan berakhir dalam produksi dan konsol pengguna Anda akan penuh dengan cetakan debug.

ArtOfWarfare
sumber
0

Wauw, apakah saya suka pertanyaan ini. Saya tidak pernah berani berpose ...

Tampaknya orang hanya memiliki cara kerja yang berbeda. Bagi saya yang paling berhasil adalah:

  • Memiliki model pikiran yang solid dari kode saya, termasuk manajemen memori
  • Menggunakan instrumentasi (seperti pernyataan cetak) untuk mengikuti apa yang terjadi.

Saya telah mendapatkan pemrograman hidup saya selama lebih dari 40 tahun sekarang, bekerja di aplikasi teknis dan ilmiah non-sepele dalam C ++ dan Python setiap hari, dan saya memiliki pengalaman pribadi bahwa seorang debugger tidak sedikit membantu saya.

Saya tidak mengatakan itu bagus. Saya tidak mengatakan itu buruk. Saya hanya ingin membagikannya.

Jacques de Hooge
sumber
1
Menurut Anda mengapa ini adalah jawaban yang bagus? Dan menurut Anda apakah ini pertanyaan yang bagus untuk Stackoverflow?
DavidG
Saya membawa saya cukup lama sebelum saya menerima bahwa untuk beberapa orang debuggers tidak bekerja secara optimal. Saya ingin membantu orang lain dengan pola pikir yang sama mencapai titik itu sebelumnya. Adapun pertanyaannya, saya menganggap itu membantu karena membuka tabu ...
Jacques de Hooge
Saya berharap pertanyaan utama saya akan membantu Anda sampai pada kesimpulan yang tepat, tetapi sepertinya tidak. Pertanyaan ini di luar topik karena sebagian besar didasarkan pada pendapat, Anda bahkan dapat melihat bahwa itu sekarang ditutup (jawaban Anda menyebabkan pertanyaan melompat ke halaman depan dan mendapat cukup perhatian sehingga orang menyadari itu tidak cocok untuk SO).
DavidG
Apakah Anda tahu ada forum (kualitas tinggi) (atau mungkin tag di SO) di mana pertanyaan seperti itu akan ditempatkan dengan baik?
Jacques de Hooge
Tidak ada tempat di jaringan SO di mana pertanyaan opini diizinkan, saya khawatir.
DavidG
-2

Bukan hanya debugging. Sebuah IDE membantu Anda membangun perangkat lunak yang lebih baik dengan lebih cepat dalam banyak cara:

  • alat refactoring
  • intellisense untuk membuat api lebih mudah ditemukan, atau mengingatkan ejaan / kasus yang tepat dari barang yang sudah dikenal (tidak banyak digunakan jika Anda telah menggunakan sistem yang sama selama 15 tahun, tapi itu jarang terjadi)
  • menghemat pengetikan dengan nama variabel dan kelas pelengkapan otomatis
  • temukan beberapa jenis kesalahan bahkan sebelum Anda mulai mengkompilasi
  • Secara otomatis beralih ke deklarasi / definisi variabel / metode / kelas, meskipun tidak dalam file atau folder yang sama.
  • Hentikan pengecualian yang tidak ditangani dan ditangani

Saya bisa melanjutkan.

Joel Coehoorn
sumber
2
errr ... bukan itu pertanyaannya.
vmarquez
2
Itu semua adalah fitur bagus dari IDE juga, tetapi kebanyakan dari mereka ada hubungannya dengan apa yang bisa disebut "editing cerdas." Saya mengerti nilai editor yang cerdas, tetapi debugging visual adalah apa yang ingin saya tanyakan.
Bill Karwin
Meskipun saya mengerti bahwa memiliki debugger terintegrasi dengan editor pintar dan semua fitur lainnya memiliki nilai.
Bill Karwin