Bagaimana cara mundur di Eclipse debugger?

129

Apakah mungkin untuk melakukan eksekusi terbalik di Eclipse debugger? Proyek saat ini yang saya kerjakan membutuhkan minimal 5 detik untuk membaca dan menginisialisasi data dari file sebelum apa pun dapat dilakukan. Jika saya melangkahi debugger, saya harus menghentikan program dan memulai kembali, dan ini membutuhkan waktu yang cukup lama.

Jason
sumber

Jawaban:

136

Anda dapat menggunakan perintah drop to frame Eclipse untuk memasukkan kembali metode saat ini dari atas. Tapi itu tidak akan membatalkan perubahan kondisi apa pun yang telah terjadi, jadi itu mungkin tidak bekerja tergantung pada jenis metode yang Anda gunakan.

Alat lain yang sangat keren yang benar-benar membuat Anda mundur dan maju dalam waktu adalah Debugger Mahatahu . Ini bekerja dengan menginstruksikan kelas ketika mereka dimuat di classloader, sehingga dapat merekam semua yang dilakukan kode Anda. Ia dapat melakukan hal-hal yang sangat keren, seperti menjawab "kapan, di mana, dan mengapa bidang ini ditetapkan nilainya saat ini?". UI agak kikuk, dan bisa sulit menangani basis kode besar, tetapi untuk beberapa kasus itu benar-benar dapat menghemat banyak waktu.

Pembaruan : Chronon menyediakan produk komersial yang dideskripsikan sebagai "DVR untuk Java", yang tampaknya melakukan banyak hal yang sama dengan ODB.

Matt McHenry
sumber
@Matt McHenry Saya mencoba menggunakan ODB1.5; dengan program java mandiri tetapi saya tidak yakin bagaimana cara membuatnya bekerja? Apakah Anda memiliki sumber daya selain situs ODB yang menjelaskan langkah-langkah untuk membuatnya berfungsi mandiri dan dengan Eclipse?
Ayusman
@ Ayusman: tidak, maaf, saya tidak punya apa-apa untuk dibagikan di luar apa yang ada di situs ODB. Saya tidak akan terkejut jika tidak bekerja dengan format file .class yang lebih baru, antara lain. :(
Matt McHenry
Jawaban yang menarik!
KrishPrabakar
Muncul situs Debugger Omnscient telah di -quatted domain.
Thorbjørn Ravn Andersen
45

Di luar apa yang telah disebutkan dalam jawaban sebelumnya - yaitu fitur drop to frame Eclipse dalam tampilan debug , yang memulai kembali debugging sebelumnya dalam bingkai stack (tetapi tidak mengembalikan data global / statis) dan debugger Omniscient , yang sedikit mentah dan tidak begitu banyak berkembang - ada beberapa alat berbasis Eclipse yang dapat digunakan untuk "kembali" dalam waktu (lari):

JIVE memperluas Eclipse Java debugger dengan kemampuan untuk merekam status program. Perspektif JIVE menyediakan beberapa diagram UML bermanfaat yang diperbarui saat program sedang berjalan. Diagram ini memberikan gambaran tentang keadaan aplikasi (diagram objek) dan jejak stack (diagram urutan). Anda dapat meminta jejak yang dihafal dan melangkah mundur dan maju dalam waktu dan melihat diagram yang sesuai.

Penyelam hanya mencatat panggilan metode dan tidak benar-benar merekam status program seperti JIVE. Setiap acara metode panggilan disimpan untuk pengambilan dan analisis nanti. Ini memperluas konfigurasi Java Run dan Debug terutama untuk menentukan filter. Jejak dapat dijeda / dilanjutkan / disaring saat runtime. Setelah direkam, perspektif Penyelam dapat menampilkannya dalam diagram urutan interaktif.

JIVE dan Diver adalah proyek open source yang dikeluarkan dari penelitian akademik. Per November 2012 kedua proyek aktif.

Chronon adalah produk komersial, tetapi mereka memiliki lisensi gratis untuk siswa dan proyek sumber terbuka. Dari apa yang diklaim di situs web mereka, mungkin ini adalah perekam paling komprehensif karena mampu memutar ulang rekaman sejarah, melangkah bolak-balik, memungkinkan seperti yang mereka katakan waktu bepergian debugging. Eclipse juga tidak diperlukan untuk merekam.

Semua plugin ini cukup serakah dalam sumber daya sehingga yang terbaik untuk memiliki mesin spec yang baik dan menggunakan fitur filternya. Persyaratan yang pasti untuk menjalankannya dengan sukses adalah memperluas ruang heap di eclipse.ini .

Dalam kasus saya, saya sudah mencoba menggunakan JIVE dan Diver untuk men-debug program parsing XML tetapi selalu berakhir dengan pembekuan gerhana karena kurangnya sumber daya. Penyelam mungkin sulit dijalankan di linux 64bit , ini berfungsi di ubuntu 32bit dan mungkin distro 32bit lainnya menggunakan tips ini . Penyelam bekerja pada Windows, lebih baik lagi pada Windows 64bit + 64bit JVM jika tidak, Anda akan dibatasi untuk ruang tumpukan maksimum 1,3-1,6Gb pada windows 32bit . JIVE berfungsi dengan baik di linux 64bit saya, dan sepertinya berfungsi dengan baik pada platform lain.

fmjrey
sumber
Penyelam telah dihentikan
rours
12

Ya , Eclipse CDT memiliki dukungan fitur debugger historis.

Buka Konfigurasi Debug -> Debugger -> Aktifkan Reverse Debugging saat startup .

Daripada Anda dapat menekan shift+F5atau shift+F6untuk mundur seperti F5atau F6untuk maju.

Sergei
sumber
1
Apakah opsi ini ada di semua versi Eclipse? Saya sangat tergantung jika saya dapat menemukannya di mana saja.
EngineerBetter_DJ
1
Fitur GDB-nya sourceware.org/gdb/wiki/ReverseDebug yang didukung di Eclipse oleh bugs.eclipse.org/bugs/show_bug.cgi?id=258284 permintaan. Yah saya kira jawabannya adalah ya sejak tahun 2009.
Sergei
Ini dapat diakses di CDT.
Sergei
Saya seorang pengembang Java, jadi saya kira CDT tidak akan banyak berguna bagi saya?
EngineerBetter_DJ
@Sergei Saya melakukan ini di bawah WIndows 7 SP1 dengan versi Springsource lama. Untuk mengaktifkan debugging terbalik, Anda harus terlebih dahulu men-debug sebagai-> Konfigurasi Debug-> Utama. Di bagian bawah halaman adalah peluncur proses. Itu akan mengatakan "Menggunakan Peluncur Proses Buat Standar" dan akan ada hyperlink ke "Pilih yang lain ...". Klik ini dan pastikan "Gunakan pengaturan konfigurasi khusus" dicentang kemudian pilih "GDB (GSF) Create Process Launcher" dan klik oke. "Menggunakan GDB (GSF) Create Process Launcher" sekarang akan ditampilkan di bagian bawah tab utama.
Sammy
5

Saya bias, tetapi Chronon melakukan apa yang Anda cari.

Drop to Frame tidak persis mundur, karena jika metode telah mengubah apa pun di heap itu tidak akan dikembalikan.

pdeva
sumber
1
Apakah Chronon mengizinkan Anda melakukan itu secara real time? Pemahaman saya adalah bahwa Anda pertama-tama harus merekam sesi menggunakan chronon dan kemudian Anda mungkin dapat melangkah mundur di sesi itu. Bukankah itu sama baiknya dengan me-restart aplikasi? Atau mungkin saya kehilangan sesuatu ..
Raam
2
ya Anda harus merekam aplikasi Anda terlebih dahulu dan kemudian dapat men-debugnya kapan saja setelah rekaman. Berbeda dengan memulai ulang aplikasi karena Anda tidak perlu melalui semua langkah untuk mereproduksi bug. Yang Anda lakukan adalah merekam bug sekali dan kemudian Anda dapat melihatnya kapan saja Anda ingin men-debug hanya menggunakan rekaman. Anda tidak memerlukan bagian dari lingkungan asli untuk memutar rekaman.
pdeva
Apakah Chronon bekerja di lingkungan buruh pelabuhan? Eclise saya tidak ada di lokal ..
Choi
3

Saya mencari fitur ini di gerhana juga. Saya tahu studio visual dapat melakukannya. Sebenarnya Anda dapat menyeret penanda garis saat ini dan memasukkan kode kembali ke mana saja. Saya tidak yakin apakah perubahan variabel dapat dibatalkan. Tapi itu tetap sangat berguna meski begitu dan menghemat banyak waktu. Saya sudah menunggu ini dalam gerhana yang sangat lama.

Bruno VA Pinheiro
sumber
1

Pertanyaannya tidak menentukan bahasa Eclipse, dan banyak dari jawabannya mengasumsikan Java.

Jika menggunakan C ++ dan GCC dengan debugger GDB, Eclipse memiliki Run->Move to Linefungsi dan fungsi seperti Visual Studio Set Next Statement . Dalam hal ini, Eclipse menggunakan kemampuan yang ada di GDB.

Jika menggunakan Java, saya tidak mengetahui cara melakukannya dengan Eclipse atau Netbeans, meskipun jawaban lain menyarankan plugin. Eclipse memang memiliki perintah "drop to frame" yang berfungsi untuk Java dalam versi saya (Juno SR1). Jika saya memodifikasi dan menyimpan kode dalam suatu fungsi dalam mode debug, garis eksekusi secara otomatis pindah ke bagian atas fungsi saat ini dan saya dapat melanjutkan dari sana. Tidak sama dengan menentukan garis, tetapi itu adalah sesuatu.

Gravity Yah
sumber