Menyahpepijat Aplikasi Tidak Aktif
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.
Masalahnya
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.
Titik Putus Kaedah
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.
Jeda Aplikasi
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().
Lambakan Benang
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.
Memahami Masalah
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.
HotSwap
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.
Ringkasan
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:
- Debugger.godMode() – Menggodam Aplikasi JVM dengan Debugger
- Menyelesaikan Masalah Kelambatan Penyahpepijat
- Nyahpepijat tanpa Titik Putus
- Apa yang Salah dengan createDirectories()? - Panduan Profil CPU
Atas ialah kandungan terperinci Menyahpepijat Aplikasi Tidak Aktif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Penyelesaian masalah dan penyelesaian kepada perisian keselamatan syarikat yang menyebabkan beberapa aplikasi tidak berfungsi dengan baik. Banyak syarikat akan menggunakan perisian keselamatan untuk memastikan keselamatan rangkaian dalaman. …

Penyelesaian untuk menukar nama kepada nombor untuk melaksanakan penyortiran dalam banyak senario aplikasi, pengguna mungkin perlu menyusun kumpulan, terutama dalam satu ...

Pemprosesan pemetaan medan dalam dok sistem sering menemui masalah yang sukar ketika melaksanakan sistem dok: bagaimana untuk memetakan medan antara muka sistem dengan berkesan ...

Apabila menggunakan Mybatis-Plus atau Rangka Kerja ORM yang lain untuk operasi pangkalan data, sering diperlukan untuk membina syarat pertanyaan berdasarkan nama atribut kelas entiti. Sekiranya anda secara manual setiap kali ...

Mula musim bunga menggunakan versi IntelliJideaultimate ...

Penukaran objek dan tatasusunan Java: Perbincangan mendalam tentang risiko dan kaedah penukaran jenis cast yang betul Banyak pemula Java akan menemui penukaran objek ke dalam array ...

Penjelasan terperinci mengenai reka bentuk jadual SKU dan SPU di platform e-dagang Artikel ini akan membincangkan isu reka bentuk pangkalan data SKU dan SPU dalam platform e-dagang, terutamanya bagaimana menangani jualan yang ditentukan pengguna ...

Bagaimanakah penyelesaian caching Redis menyedari keperluan senarai kedudukan produk? Semasa proses pembangunan, kita sering perlu menangani keperluan kedudukan, seperti memaparkan ...
