Lire dans d'autres langues: Anglais Português 中文
Il existe de nombreux didacticiels de débogage qui vous apprennent à définir des points d'arrêt de ligne, à enregistrer des valeurs ou à évaluer des expressions. Bien que ces connaissances vous donnent à elles seules de nombreux outils pour déboguer votre application, les scénarios du monde réel peuvent être un peu plus compliqués et nécessiter une approche plus avancée.
Dans cet article, nous apprendrons comment localiser le code qui provoque un crash de l'interface utilisateur sans grande connaissance préalable du projet et réparer le code cassé à la volée.
Si vous souhaitez suivre l'exemple, commencez par cloner ce dépôt : https://github.com/flounder4130/debugger-example
Supposons que vous ayez une application complexe qui se bloque lorsque vous effectuez une action. Vous savez comment reproduire l'erreur, mais la difficulté est que vous ne savez pas quelle partie du code est responsable de cette fonctionnalité.
Dans notre exemple d'application, le crash se produit lorsque vous cliquez sur leBouton N. Cependant, il n'est pas si simple de trouver le code responsable de cette action :
Voyons comment utiliser le débogueur pour le trouver.
L'avantage des points d'arrêt de méthode par rapport aux points d'arrêt de ligne est qu'ils peuvent être utilisés dans des hiérarchies de classes entières. En quoi est-ce utile dans notre cas ?
Si vous regardez l'exemple de projet, vous verrez que toutes les classes d'actions sont dérivées de l'interface Action avec une seule méthode : perform().
La définition d'un point d'arrêt de méthode sur cette méthode d'interface suspendra l'application à chaque fois qu'une des méthodes dérivées est appelée. Pour définir un point d'arrêt de méthode, cliquez sur la ligne qui déclare la méthode.
Démarrez la session de débogage et cliquez sur leBouton N. L'application est suspendue sur ActionImpl14. Nous savons désormais où se trouve le code correspondant à ce bouton.
Bien que dans cet article nous nous concentrions sur la recherche du bug, cette technique peut également vous faire gagner beaucoup de temps lorsque vous souhaitez comprendre comment quelque chose fonctionne dans une grande base de code.
L'approche avec les points d'arrêt de méthode fonctionne bien, mais elle repose sur l'hypothèse que nous connaissons quelque chose sur l'interface parent. Que se passe-t-il si cette hypothèse est fausse ou si nous ne pouvons pas utiliser cette approche pour une autre raison ?
Eh bien, nous pouvons même le faire sans points d'arrêt. Cliquez sur leBouton Net pendant que l'application se bloque, accédez à IntelliJ IDEA. Dans le menu principal, sélectionnezExécuter|Actions de débogage|Programme Pause.
L'application se suspendra, nous permettant d'examiner l'état actuel des fils de discussion dans l'ongletThreads & Variables. Cela nous donne une idée de ce que fait l'application à ce moment-là. Puisqu'il est bloqué, nous pouvons identifier la méthode à l'origine du blocage et la retracer jusqu'au site d'appel.
Cette approche présente certains avantages par rapport à un thread dump plus traditionnel, que nous aborderons sous peu. Par exemple, il vous fournit des informations sur les variables sous une forme pratique et vous permet de contrôler l'exécution ultérieure du programme.
Astuce: Pour plus de trucs et astuces avecPause Program, voir Débogage sans points d'arrêt et Debugger.godMode()
Enfin, nous pouvons utiliser un thread dump, qui n'est pas strictement une fonctionnalité du débogueur. Il est disponible que vous utilisiez ou non le débogueur.
Cliquez sur leBouton N. Pendant que l'application plante, accédez à IntelliJ IDEA. Dans le menu principal, sélectionnezExécuter|Actions de débogage|Obtenir le vidage du fil.
Explorez les discussions disponibles sur la gauche et dansAWT-EventQueuevous verrez la cause du problème.
Kelemahan pembuangan benang ialah ia hanya memberikan gambaran keadaan program pada masa ia dibuat. 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 apabila anda cuba menyahpepijat aplikasi yang telah 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 pengangkatan berat (atau banyak tidur dalam kes ini) dipanggil pada utas UI dan menyekatnya sehingga kaedah selesai. Itulah sebabnya kami tidak boleh melakukan apa-apa dalam UI untuk seketika selepas mengklikButang N.
Sekarang kita telah menemui punca ralat, mari kita betulkan masalah itu.
Kita boleh menghentikan program, menyusun semula kod dan kemudian menjalankannya semula. Walau bagaimanapun, tidak semestinya bijak untuk menggunakan semula keseluruhan aplikasi hanya kerana perubahan kecil telah dibuat.
Jom buat dengan cara yang bijak. Mula-mula, betulkan kod menggunakan pembetulan pantas yang dicadangkan:
Setelah kod siap, klikRun|Tindakan Penyahpepijatan|Muat Semula Kelas Berubah. Belon muncul, mengesahkan bahawa kod baharu telah tiba dalam VM.
Jom kembali ke apl dan semak. MengklikButang Ntidak lagi merosakkan apl.
Petua: Perlu diingat bahawa HotSwap mempunyai hadnya. Jika anda berminat dengan keupayaan HotSwap lanjutan, 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 ranap UI dalam projek kami. Kami kemudiannya meneruskan untuk membetulkan kod tanpa membuang masa pada penyusunan semula dan pengagihan semula, yang boleh menjadi panjang dalam projek dunia sebenar.
Saya harap anda mendapati teknik yang diterangkan berguna. Beritahu saya pendapat anda!
Jika anda berminat dengan lebih banyak artikel berkaitan penyahpepijatan dan pemprofilan, lihat beberapa artikel saya yang lain:
Nantikan lebih banyak lagi!
Atas ialah kandungan terperinci Nyahpepijat Aplikasi Tidak Responsif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!