Rumah  >  Artikel  >  Java  >  Menyahpepijat Aplikasi Tidak Aktif

Menyahpepijat Aplikasi Tidak Aktif

WBOY
WBOYasal
2024-08-19 12:32:341029semak imbas

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.

Depurando Aplicativos Inativos

Dalam apl contoh kami, tidur berlaku apabila anda mengklik Butang N. Walau bagaimanapun, tidak begitu mudah untuk mencari kod yang bertanggungjawab untuk tindakan ini:

Depurando Aplicativos Inativos

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().

Depurando Aplicativos Inativos

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.

Depurando Aplicativos Inativos

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.

Depurando Aplicativos Inativos

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.

Depurando Aplicativos Inativos

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:

Depurando Aplicativos Inativos

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:

Depurando Aplicativos Inativos

Selepas kod sedia, klik Jalankan | Tindakan Penyahpepijatan | Muat Semula Kelas Berubah. Mesej dipaparkan, mengesahkan bahawa kod baharu telah sampai ke VM.

Depurando Aplicativos Inativos

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn