gdb mengimplementasikan dukungan untuk debugging terbalik pada 2009 (dengan gdb 7.0). Saya tidak pernah mendengarnya sampai 2012. Sekarang saya merasa sangat berguna untuk beberapa jenis masalah debugging. Saya berharap bahwa saya pernah mendengarnya sebelumnya.
Perbaiki saya jika saya salah tetapi kesan saya adalah bahwa teknik ini masih jarang digunakan dan kebanyakan orang tidak tahu itu ada. Mengapa?
Apakah Anda tahu ada komunitas pemrograman di mana penggunaan reverse debugging adalah umum?
Informasi latar belakang:
- Stackoverflow: Bagaimana cara kerja debugging terbalik?
- gdb menggunakan istilah "reverse debugging" tetapi vendor lain menggunakan istilah lain untuk teknik yang identik atau serupa:
- Microsoft menyebutnya IntelliTrace atau "Historical Debugging"
- Ada Java debugger terbalik yang disebut Omniscient Debugger , meskipun mungkin tidak lagi berfungsi di Java 6
- Ada beberapa debugger reverse Java lainnya
- Debugger OCaml (ocamldebug) menyebutnya perjalanan waktu
Jawaban:
Untuk satu, berjalan dalam mode debug dengan merekam aktif sangat mahal dibandingkan dengan mode debug normal; itu juga mengkonsumsi lebih banyak memori.
Lebih mudah untuk mengurangi granularity dari level baris ke level fungsi panggilan. Misalnya, debugger standar dalam gerhana memungkinkan Anda untuk "menjatuhkan ke bingkai," yang pada dasarnya adalah lompatan kembali ke awal fungsi dengan mengatur ulang semua parameter (tidak ada yang dilakukan pada heap yang dikembalikan, dan
finally
blok tidak dieksekusi , jadi itu bukan debugger terbalik sejati; hati-hati tentang itu).Perhatikan bahwa ini telah tersedia selama beberapa tahun sekarang dan bekerja bersama-sama dengan penggantian kode-panas.
sumber
Seperti yang telah disebutkan sebelumnya, kinerja adalah kunci misalnya dengan debugging reversibel gdb, menjalankan sesuatu seperti gzip melihat perlambatan 50.000x dibandingkan dengan menjalankan secara asli. Namun ada alternatif komersial: Saya bekerja untuk Undo undo.io , dan produk UndoDB kami melakukan hal yang sama tetapi dengan perlambatan kurang dari 2x. Ada debugger komersial reversibel lain yang tersedia juga.
sumber
rr
?Untuk tinjauan umum tentang pilihan dan produk teknologi, lihat serangkaian posting blog yang saya tulis sekitar setahun yang lalu (dan beberapa tindak lanjut sejak itu):
Perasaan saya mengapa begitu sedikit digunakan adalah bahwa ia membutuhkan perangkat keras khusus, atau menggunakan debugger khusus, atau mengatur sistem Anda dengan benar. Sayangnya, kebanyakan orang tidak menginvestasikan waktu untuk mendapatkan nilai maksimum dari alat debug mereka.
Dan fakta bahwa "default murah" dari gdb hampir sangat lambat dan memiliki beberapa masalah stabilitas untuk semuanya kecuali sistem target yang paling umum.
sumber
Dari pengalaman saya sebagai insinyur penjualan untuk debugger TotalView, orang tahu bahwa itu ada tetapi mereka tidak berpikir itu berfungsi, terlepas dari perlambatan (dapat diterima atau tidak).
University of Cambridge baru-baru ini melakukan survei berjudul "Kegagalan untuk Mengadopsi Biaya Debugging Balik Ekonomi Global $ 41 Miliar Setiap Tahun" .
Dan kembali ke GDB, saya telah mendengar (banyak) bahwa penurunan membuatnya tidak dapat digunakan pada aplikasi "kehidupan nyata".
Saya pribadi senang mendengar kabar dari lebih banyak orang yang menggunakan debugging terbalik pada aplikasi selain "Hello world!"
sumber
Saya pikir penting untuk memperluas sedikit lebih jauh pada debugging "terbalik" atau "bersejarah" ini. Saya pikir untuk memahami sistem dan perilaku yang kompleks pada mereka, untuk memutar ulang "peristiwa" yang membuat negara eksplisit sangat penting.
Yang ingin saya ungkapkan adalah bahwa Anda tidak sendirian dalam bertanya-tanya mengapa teknik ini tidak begitu banyak diterapkan saat ini atau mengapa masalah terkait jarang dibahas dengan jelas.
Jadi mari kita tekankan dua konsep yang sangat penting di sini:
1.Untuk memahami sistem pemrograman, sangat membantu untuk membuat keadaan menjadi eksplisit
2.Untuk lebih memahami sistem pemrograman, memutar ulang urutan keadaan (peristiwa) dapat banyak membantu.
Berikut adalah beberapa sumber yang menangani masalah dan mengusulkan atau merancang solusi untuk masalah tersebut (berurusan dengan keadaan dalam sistem yang kompleks):
-Luar dari bit tar, kertas: http://shaffner.us/cs/papers/tarpit.pdf Gagasan utama: hindari, isolasi, atau buat status eksplisit
-CQRS http://www.cqrs.nu/ Ini adalah kombinasi dari dua konsep: Segregasi Command Query dan Event Sourcing. Ada beberapa implementasi yang berbeda (Java, C #, Scala). Pemutaran ulang urutan Tate dan pengembangan model domain adalah bagian penting di sini.
Jika Anda benar-benar memperkecil dan melihat gambar yang sangat luas, Anda sudah dapat melihat bahwa dengan "naiknya" pemrograman fungsional orang sudah ((tidak) secara sadar) tertarik pada fp karena membuat keadaan eksplisit! Tapi itu hanya berurusan dengan poin satu, untuk mengatasi yang kedua Anda memerlukan konsep lain yang bisa "longgar" digambarkan sebagai pemrograman reaktif fungsional.
Jadi Anda bisa mengatakan semuanya dengan baik dan bagus tetapi siapa yang sebenarnya menggunakan CQRS dan FRP? Saya akan mengatakan (IMO karena saya tidak memiliki angka nyata) sebenarnya banyak perusahaan hanya karena mereka tidak tahu pekerjaan yang mereka lakukan memiliki terminologi ini. Mungkin Anda sedikit google dan Anda mendengar dari perusahaan yang menggunakan CQRS, ada beberapa kisah sukses yang sudah ada. FRP juga meningkat perlahan sebagai contoh yang bisa saya berikan kepada Netflix: http://techblog.netflix.com/2013/02/rxjava-netflix-api.html Yang baru saja merilis implementasi RX yang sebenarnya berbasis NET. (Tetapi sudah implementasi Javascript juga). Jadi Orang sudah menggunakan teknik ini hari ini, DALAM BESAR untuk memahami sistem yang kompleks dan membuatnya lebih baik. Itu sebabnya mereka menggunakan teknik debugging terbalik.
sumber