Trik Penyahpepijatan IntelliJ

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat beberapa kemudahan debugging IntelliJ yang maju .

Diandaikan bahawa asas debugging sudah diketahui (bagaimana memulakan debugging, Langkah Into , Step Over tindakan dll). Sekiranya tidak, rujuk artikel ini untuk maklumat lebih lanjut mengenai perkara itu.

2. Langkah Pintar Ke

Terdapat situasi apabila beberapa kaedah dipanggil pada satu baris kod sumber, seperti doJob (getArg1 (), getArg2 ()) . Sekiranya kita memanggil tindakan Langkah Into (F7), penyahpepijat menggunakan kaedah mengikut urutan yang digunakan oleh JVM untuk penilaian: getArg1 - getArg2 - doJob .

Walau bagaimanapun, kami mungkin ingin melangkau semua permintaan pertengahan dan terus ke kaedah sasaran secara langsung . Tindakan Smart Step Into membolehkan melakukannya.

Ia terikat pada Shift + F7 secara lalai dan kelihatan seperti ini apabila dipanggil:

Sekarang kita boleh memilih kaedah sasaran untuk meneruskan. Juga, perhatikan bahawa IntelliJ selalu meletakkan kaedah terluar di bahagian atas senarai. Ini bermaksud bahawa kita dapat dengan cepat pergi ke sana dengan menekan Shift + F7 | Masukkan .

3. Jatuhkan Bingkai

Kami mungkin menyedari bahawa beberapa pemprosesan yang kami minati telah berlaku (contohnya pengiraan argumen kaedah semasa). Dalam kes ini, mungkin untuk menjatuhkan bingkai timbunan JVM semasa untuk memprosesnya semula.

Pertimbangkan keadaan berikut:

Katakan kita berminat untuk menyahpepijat pemprosesan getArg1 , jadi kita menjatuhkan bingkai semasa ( kaedah doJob ):

Sekarang kita menggunakan kaedah sebelumnya :

Walau bagaimanapun, argumen panggilan sudah dikira pada ketika ini, jadi, kita juga perlu menjatuhkan bingkai semasa :

Sekarang kita dapat menjalankan semula pemprosesan dengan memanggil Step Into .

4. Titik Putus Padang

Kadang kala bidang bukan peribadi diubah suai oleh kelas lain, bukan melalui setter tetapi secara langsung (begitulah keadaannya dengan perpustakaan pihak ketiga di mana kita tidak mengawal kod sumber).

Dalam situasi seperti itu, mungkin sukar untuk dimengerti ketika pengubahsuaian dilakukan. IntelliJ membolehkan membuat titik putus peringkat lapangan untuk mengesannya.

Mereka diatur seperti biasa - klik kiri pada selokan editor kiri di garis lapangan. Selepas itu, mungkin untuk membuka sifat breakpoint (klik kanan pada tanda breakpoint) dan konfigurasikan jika kita berminat dengan bacaan, penulisan, atau keduanya di lapangan :

5. Memecahkan titik putus

Kadang-kadang kita tahu bahawa ada syarat perlumbaan dalam aplikasi tetapi tidak tahu di mana sebenarnya. Ini mungkin menjadi cabaran untuk memakainya, terutama ketika menggunakan kod baru.

Kami dapat menambahkan penyataan penyahpepijatan ke sumber program kami. Namun, tidak ada kemampuan seperti itu untuk perpustakaan pihak ketiga.

IDE dapat membantu di sini - ia membolehkan menetapkan titik putus yang tidak menyekat pelaksanaan sekali tekan, tetapi menghasilkan pernyataan pembalakan .

Pertimbangkan contoh berikut:

public static void main(String[] args) { ThreadLocalRandom random = ThreadLocalRandom.current(); int count = 0; for (int i = 0; i < 5; i++) { if (isInterested(random.nextInt(10))) { count++; } } System.out.printf("Found %d interested values%n", count); } private static boolean isInterested(int i) { return i % 2 == 0; }

Anggaplah kita berminat untuk log masuk parameter panggilan InInntested sebenarnya .

Mari buat breakpoint yang tidak menyekat dalam kaedah sasaran ( Shift + klik kiri pada selokan editor kiri). Selepas itu mari kita buka sifatnya (klik kanan pada breakpoint) dan tentukan ekspresi sasaran untuk log :

Semasa menjalankan aplikasi (perhatikan bahawa masih perlu menggunakan mod Debug), kita akan melihat outputnya:

isInterested(1) isInterested(4) isInterested(3) isInterested(1) isInterested(6) Found 2 interested values

6. Titik Pecah Bersyarat

Kita mungkin mempunyai situasi di mana kaedah tertentu dipanggil dari pelbagai utas secara serentak dan kita perlu melakukan debug pemprosesan hanya untuk argumen tertentu.

IntelliJ membolehkan membuat titik putus yang menghentikan pelaksanaan hanya jika keadaan yang ditentukan pengguna dipenuhi .

Berikut adalah contoh yang menggunakan kod sumber di atas:

Sekarang debugger akan berhenti di breakpoint hanya jika argumen yang diberikan lebih besar daripada 3.

7. Tanda Objek

Ini adalah ciri IntelliJ yang paling kuat dan paling tidak diketahui. Intinya cukup mudah - kita boleh melekatkan label khusus pada objek JVM .

Mari kita lihat aplikasi yang akan kita gunakan untuk menunjukkannya:

public class Test { public static void main(String[] args) { Collection tasks = Arrays.asList(new Task(), new Task()); tasks.forEach(task -> new Thread(task).start()); } private static void mayBeAdd(Collection holder) { int i = ThreadLocalRandom.current().nextInt(10); if (i % 3 == 0) { holder.add(i); } } private static class Task implements Runnable { private final Collection holder = new ArrayList(); @Override public void run() { for (int i = 0; i < 20; i++) { mayBeAdd(holder); } } } }

7.1. Membuat Tanda

Objek dapat ditandai ketika aplikasi dihentikan pada titik putus dan sasaran dapat dicapai dari bingkai tumpukan.

Pilihnya , tekan F11 ( Tandakan tindakan objek ) dan tentukan nama sasaran:

7.2. Lihat Tanda

Sekarang kita dapat melihat label objek khusus kita walaupun di bahagian lain aplikasi:

Perkara yang menarik ialah walaupun objek bertanda tidak dapat dicapai dari bingkai tumpukan pada masa ini, kita masih dapat melihat keadaannya - buka dialog Evaluate Expression atau tambahkan jam tangan baru dan mulailah mengetik nama tanda.

IntelliJ menawarkan untuk melengkapkannya dengan akhiran _DebugLabel :

Apabila kita menilai, keadaan objek sasaran ditunjukkan:

7.3. Tanda sebagai Syarat

Anda juga boleh menggunakan tanda dalam keadaan breakpoint:

8. Kesimpulannya

Kami memeriksa sebilangan teknik yang meningkatkan produktiviti dengan banyak semasa menyahpepijat aplikasi multi-utas.

Ini biasanya merupakan tugas yang mencabar, dan kita tidak dapat memahami betapa pentingnya bantuan perkakas di sini.