Baca dalam bahasa lain: English Español 中文
Terdapat banyak tutorial penyahpepijat di luar sana yang mengajar anda cara menetapkan titik putus baris, nilai log atau menilai ungkapan. Walaupun pengetahuan ini sahaja menyediakan banyak alat untuk menyahpepijat aplikasi anda, senario dunia sebenar boleh menjadi sedikit lebih kompleks dan memerlukan pendekatan yang lebih maju.
Dalam artikel ini, kita akan belajar cara mencari kod yang menyebabkan UI membeku tanpa banyak pengetahuan reka bentuk dan membetulkan kod yang rosak dalam masa nyata.
Jika anda ingin mengikuti, mulakan dengan mengklon repositori ini: https://github.com/flounder4130/debugger-example
Andaikan anda mempunyai aplikasi kompleks yang ranap apabila anda melakukan sesuatu tindakan. Anda tahu cara menghasilkan semula pepijat, tetapi kesukarannya ialah anda tidak tahu bahagian mana kod yang bertanggungjawab untuk fungsi ini.
Dalam apl contoh kami, tidur berlaku apabila anda mengklik Butang N. Walau bagaimanapun, tidak begitu mudah untuk mencari kod yang bertanggungjawab untuk tindakan ini:
Mari kita lihat bagaimana kita boleh menggunakan penyahpepijat untuk mencarinya.
Kelebihan titik putus kaedah berbanding titik putus baris ialah ia boleh digunakan merentas seluruh hierarki kelas. Bagaimanakah ini berguna dalam kes kami?
Jika anda melihat contoh projek, anda akan melihat bahawa semua kelas tindakan diperoleh daripada antara muka Tindakan dengan satu kaedah: perform().
Menetapkan titik putus kaedah pada kaedah antara muka ini akan menggantung aplikasi apabila salah satu kaedah terbitan dipanggil. Untuk menetapkan titik putus kaedah, klik pada baris yang mengisytiharkan kaedah.
Mulakan sesi nyahpepijat dan klik Butang N. Permohonan digantung dalam ActionImpl14. Sekarang kita tahu di mana kod yang sepadan dengan butang ini terletak.
Walaupun dalam artikel ini kami memberi tumpuan untuk mencari pepijat, teknik ini juga boleh menjimatkan banyak masa apabila anda ingin memahami cara sesuatu berfungsi dalam pangkalan kod yang besar.
Pendekatan dengan titik kunci kaedah berfungsi dengan baik, tetapi berdasarkan andaian bahawa kita mengetahui sesuatu tentang antara muka induk. Bagaimana jika andaian ini salah, atau kita tidak boleh menggunakan pendekatan ini atas sebab lain?
Nah, kita boleh melakukan ini walaupun tanpa titik putus. Klik Butang N, dan semasa aplikasi dikunci, pergi ke IntelliJ IDEA. Daripada menu utama, pilih Jalankan | Tindakan Penyahpepijatan | Program Jeda.
Aplikasi akan digantung, membolehkan kami memeriksa keadaan semasa rangkaian dalam tab Benang & Pembolehubah. Ini memberi kita pemahaman tentang perkara yang sedang dilakukan oleh aplikasi itu. Memandangkan ia dikunci, kami boleh mengenal pasti kaedah penguncian dan mengesannya kembali ke lokasi panggilan.
Pendekatan ini mempunyai beberapa kelebihan berbanding pembuangan benang yang lebih tradisional, yang akan kami bincangkan sebentar lagi. Contohnya, ia menyediakan maklumat tentang pembolehubah dengan cara yang mudah dan membolehkan anda mengawal pelaksanaan program selanjutnya.
Nota: Untuk lebih banyak petua dan helah dengan Program Jeda lihat Nyahpepijat tanpa Titik Putus dan Debugger.godMode().
Akhir sekali, kita boleh menggunakan pembuangan benang, yang bukan sahaja ciri penyahpepijat. Ia tersedia tanpa mengira sama ada anda menggunakan penyahpepijat atau tidak.
Klik Butang N. Semasa aplikasi dikunci, pergi ke IntelliJ IDEA. Daripada menu utama, pilih Jalankan | Tindakan Penyahpepijatan | Dapatkan Thread Dump.
Lihat pada urutan yang tersedia di sebelah kiri, dan di bawah AWT-EventQueue anda akan melihat apa yang menyebabkan masalah.
Kelemahan pembuangan benang ialah ia hanya memberikan gambaran keadaan program pada masa ia diambil. Anda tidak boleh menggunakan pembuangan benang untuk meneroka pembolehubah atau mengawal pelaksanaan program.
Dalam contoh kami, kami tidak perlu menggunakan pembuangan benang. Walau bagaimanapun, saya masih ingin menyebut teknik ini kerana ia boleh berguna dalam kes lain, seperti semasa anda cuba menyahpepijat aplikasi yang dilancarkan tanpa ejen nyahpepijat.
Tidak kira teknik penyahpepijatan, kami tiba di ActionImpl14. Dalam kelas ini, seseorang berhasrat untuk melakukan kerja dalam urutan yang berasingan, tetapi mengelirukan Thread.start() dengan Thread.run(), yang menjalankan kod dalam urutan yang sama dengan kod panggilan.
Penganalisis statik IntelliJ IDEA malah memberi amaran kepada kami tentang perkara ini pada masa reka bentuk:
Kaedah yang melakukan kerja berat (atau tidur berat dalam kes ini) dipanggil pada utas UI dan menyekatnya sehingga kaedah selesai. Itulah sebabnya kami tidak boleh melakukan apa-apa dalam UI untuk beberapa lama selepas mengklik Butang N.
Sekarang kita telah menemui punca pepijat, mari kita selesaikan masalah itu.
Kami boleh menghentikan program, menyusun semula kod dan kemudian menjalankannya semula. Walau bagaimanapun, ia tidak selalunya mudah untuk melipat semula keseluruhan aplikasi hanya demi perubahan kecil.
Mari kita lakukan ini dengan cara yang bijak. Mula-mula, betulkan kod menggunakan pembetulan pantas yang dicadangkan:
Selepas kod sedia, klik Jalankan | Tindakan Penyahpepijatan | Muat Semula Kelas Berubah. Mesej dipaparkan, mengesahkan bahawa kod baharu telah sampai ke VM.
Mari kembali ke apl dan semak. Mengklik Butang N tidak lagi merosakkan apl.
Petua: Ingat bahawa HotSwap mempunyai hadnya. Jika anda berminat dengan keupayaan lanjutan HotSwap, mungkin idea yang baik untuk melihat alat lanjutan seperti DCEVM atau JRebel.
Menggunakan alasan kami dan beberapa ciri penyahpepijat, kami dapat mencari kod yang menyebabkan UI menjadi beku dalam projek kami. Kami kemudiannya meneruskan untuk membetulkan kod tanpa membuang masa pada penyusunan semula dan penempatan semula, yang boleh memakan masa dalam projek dunia sebenar.
Saya harap anda mendapati teknik yang diterangkan berguna. Beritahu saya apa yang anda fikirkan!
Jika anda berminat dengan lebih banyak artikel yang berkaitan dengan penyahpepijatan dan pemprofilan, lihat beberapa artikel saya yang lain:
Atas ialah kandungan terperinci Menyahpepijat Aplikasi Tidak Aktif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!