Baca dalam bahasa lain: Bahasa Inggeris Português 中文
Terdapat banyak tutorial penyahpepijat yang mengajar anda cara menetapkan titik putus baris, nilai log atau menilai ungkapan. Walaupun pengetahuan ini sahaja memberi anda banyak alatan untuk nyahpepijat aplikasi anda, senario dunia sebenar boleh menjadi lebih rumit dan memerlukan pendekatan yang lebih maju.
Dalam artikel ini, kita akan belajar cara mencari kod yang menyebabkan ranap UI tanpa pengetahuan awal tentang projek dan membetulkan kod yang rosak dengan segera.
Jika anda ingin mengikuti contoh, mulakan dengan mengkloning 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 ralat, tetapi kesukarannya ialah anda tidak tahu bahagian mana kod yang bertanggungjawab untuk fungsi ini.
Dalam apl contoh kami, ranap sistem 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 dalam keseluruhan 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 setiap kali salah satu kaedah terbitan dipanggil. Untuk menetapkan titik putus kaedah, klik baris yang mengisytiharkan kaedah.
Mulakan sesi penyahpepijatan dan klik Butang N. Permohonan digantung pada ActionImpl14. Sekarang kita tahu di mana kod yang sepadan dengan butang ini terletak.
Walaupun dalam artikel ini kami menumpukan pada mencari pepijat, teknik ini juga boleh menjimatkan banyak masa anda apabila anda ingin memahami cara sesuatu berfungsi dalam pangkalan kod yang besar.
Pendekatan dengan titik putus 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 juga boleh melakukannya tanpa titik putus. Klik Butang N dan semasa aplikasi digantung, pergi ke IntelliJ IDEA. Daripada menu utama, pilih Jalankan | Tindakan Penyahpepijatan | Program Jeda.
Aplikasi akan digantung, membolehkan kami memeriksa keadaan semasa urutan dalam tab Benang & Pembolehubah. Ini memberi kita gambaran tentang apa yang dilakukan oleh aplikasi pada masa itu. Memandangkan ia tergantung, kami boleh mengenal pasti kaedah yang menyebabkan sekatan dan mengesannya kembali ke tapak panggilan.
Pendekatan ini mempunyai beberapa kelebihan berbanding pembuangan benang yang lebih tradisional, yang akan kami bincangkan sebentar lagi. Contohnya, ia memberikan anda maklumat tentang pembolehubah dalam bentuk yang mudah dan membolehkan anda mengawal pelaksanaan program selanjutnya.
Petua: Untuk mendapatkan 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.
Klik Butang N. Semasa aplikasi ranap, pergi ke IntelliJ IDEA. Daripada menu utama, pilih Jalankan | Tindakan Penyahpepijatan | Dapatkan Thread Dump.
Terokai urutan yang tersedia di sebelah kiri dan dalam AWT-EventQueue anda akan melihat perkara yang menyebabkan masalah.
Der Nachteil von Thread-Dumps besteht darin, dass sie nur eine Momentaufnahme des Programmstatus zum Zeitpunkt ihrer Erstellung liefern. Sie können Thread-Dumps nicht verwenden, um Variablen zu untersuchen oder die Programmausführung zu steuern.
In unserem Beispiel müssen wir nicht auf einen Thread-Dump zurückgreifen. Ich wollte diese Technik jedoch dennoch erwähnen, da sie in anderen Fällen nützlich sein kann, beispielsweise wenn Sie versuchen, eine Anwendung zu debuggen, die ohne den Debug-Agenten gestartet wurde.
Unabhängig von der Debugging-Technik kommen wir zu ActionImpl14. In dieser Klasse wollte jemand die Arbeit in einem separaten Thread erledigen, verwechselte jedoch Thread.start() mit Thread.run(), das Code im selben Thread wie der aufrufende Code ausführt.
Der statische Analysator von IntelliJ IDEA warnt uns sogar zur Entwurfszeit davor:
Eine Methode, die viel Arbeit leistet (oder in diesem Fall viel schläft), wird im UI-Thread aufgerufen und blockiert ihn, bis die Methode abgeschlossen ist. Aus diesem Grund können wir in der Benutzeroberfläche eine Zeit lang nichts tun, nachdem wir auf die Schaltfläche N geklickt haben.
Da wir nun die Fehlerursache entdeckt haben, beheben wir das Problem.
Wir könnten das Programm stoppen, den Code neu kompilieren und ihn dann erneut ausführen. Allerdings ist es nicht immer sinnvoll, die gesamte Anwendung erneut bereitzustellen, nur weil eine kleine Änderung vorgenommen wurde.
Lass es uns auf die intelligente Art und Weise tun. Korrigieren Sie zunächst den Code mit der vorgeschlagenen Schnellkorrektur:
Sobald der Code fertig ist, klicken Sie auf Ausführen | Debugging-Aktionen | Geänderte Klassen neu laden. Eine Sprechblase erscheint und bestätigt, dass der neue Code in der VM angekommen ist.
Gehen wir zurück zur App und überprüfen es. Durch Klicken auf die Schaltfläche N stürzt die App nicht mehr ab.
Tipp: Bedenken Sie, dass HotSwap seine Grenzen hat. Wenn Sie an erweiterten HotSwap-Funktionen interessiert sind, ist es möglicherweise eine gute Idee, einen Blick auf erweiterte Tools wie DCEVM oder JRebel zu werfen
Anhand unserer Überlegungen und einiger Debugger-Funktionen konnten wir den Code finden, der einen Absturz der Benutzeroberfläche in unserem Projekt verursacht hat. Anschließend korrigierten wir den Code, ohne Zeit mit der Neukompilierung und Neuverteilung zu verschwenden, was in realen Projekten langwierig sein kann.
Ich hoffe, dass Sie die beschriebenen Techniken nützlich finden. Teilen Sie mir Ihre Meinung mit!
Wenn Sie an weiteren Artikeln zum Thema Debuggen und Profiling interessiert sind, schauen Sie sich einige meiner anderen Artikel an:
Bleiben Sie dran für mehr!
Atas ialah kandungan terperinci Nyahpepijat Aplikasi Tidak Responsif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!