Triky na ladenie IntelliJ

1. Prehľad

V tejto príručke sa pozrieme na niektoré z nich pokročilé možnosti ladenia IntelliJ.

Predpokladá sa, že základy ladenia sú už známe (ako začať s ladením, Vstúpiť do, Prekročiť akcie atď.) Ak nie, nájdete ďalšie podrobnosti v tomto článku.

2. Inteligentný krok do toho

Existujú situácie, kedy sa na jednom riadku zdrojového kódu volá viac metód, ako napr doJob (getArg1 (), getArg2 ()). Ak zavoláme Vstúpiť do akcie (F7), ladiaci program prejde do metód v poradí, ktoré používa JVM na hodnotenie: getArg1getArg2doJob.

Avšak možno budeme chcieť preskočiť všetky sprostredkujúce vyvolania a priamo prejsť na cieľovú metódu. Smart Step Into akcia to umožňuje.

Je to viazaný na Shift + F7 predvolene a pri vyvolaní vyzerá takto:

Teraz môžeme zvoliť cieľovú metódu, ktorá bude pokračovať. Pamätajte tiež, že IntelliJ vždy umiestňuje najvzdialenejšiu metódu na začiatok zoznamu. To znamená, že k nej môžeme rýchlo prejsť stlačením Shift + F7 | Zadajte.

3. Drop rám

Môžeme si uvedomiť, že nejaké spracovanie, ktoré nás zaujíma, sa už stalo (napr. Výpočet argumentu súčasnej metódy). V tomto prípade, je možné zrušiť súčasné rámce (-y) JVM zásobníka, aby ste ich mohli znova spracovať.

Zvážte nasledujúcu situáciu:

Predpokladajme, že nás zaujíma ladenie getArg1 spracovanie, tak zrušíme súčasný rámec (doJob metóda):

Teraz sme v predchádzajúcej metóde:

Argumenty volania sú však už v tomto okamihu vypočítané, takže musíme zrušiť aj súčasný rámec:

Teraz môžeme znova spustiť spracovanie volaním Vstúpiť do.

4. Hraničné body poľa

Nesúkromné ​​polia niekedy upravujú iné triedy, a to nie prostredníctvom nastavovačov, ale priamo (to je prípad knižníc tretích strán, kde neovládame zdrojový kód).

V takýchto situáciách môže byť ťažké pochopiť, kedy je vykonaná úprava. IntelliJ umožňuje vytvárať lomové body na úrovni poľa a sledovať ich.

Nastavujú sa ako obvykle - ľavým tlačidlom myši kliknite na ľavý odkvap editora na poľnej čiare. Potom je to možné otvorte vlastnosti bodu prerušenia (kliknite pravým tlačidlom myši na značku bodu prerušenia) a nakonfigurujte, či nás zaujímajú čítanie, zápis alebo oboje v poli:

5. Hraničné hodnoty zaznamenávania

Niekedy vieme, že v aplikácii je rasový stav, ale nevieme, kde presne to je. Môže to byť výzva, aby ste to zaklincovali, najmä pri práci s novým kódom.

Môžeme pridať ladiace príkazy k zdrojom nášho programu. Pre knižnice tretích strán však taká schopnosť neexistuje.

IDE tu môže pomôcť - umožňuje nastavenie hraničných hodnôt, ktoré neblokujú vykonanie po dosiahnutí, ale namiesto toho vytvárajú protokolovacie príkazy.

Uvažujme o nasledujúcom príklade:

public static void main (String [] args) {ThreadLocalRandom random = ThreadLocalRandom.current (); počet int = 0; pre (int i = 0; i <5; i ++) {if (isInterested (random.nextInt (10))) {count ++; }} System.out.printf ("Nájdené% d zaujímavé hodnoty% n", počet); } private static boolean isInterested (int i) {return i% 2 == 0; }

Predpokladajme, že máme záujem o prihlásenie skutočných je zaujatý parametre hovoru.

Vytvorme v cieľovej metóde neblokujúci bod prerušenia (Posun + kliknite ľavým tlačidlom myši na ľavý žľab editora). Potom otvorme jeho vlastnosti (kliknite pravým tlačidlom myši na bod zlomu) a definovať cieľový výraz, ktorý sa má prihlásiť:

Pri spustení aplikácie (všimnite si, že je stále potrebné používať režim Debug), uvidíme výstup:

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

6. Podmienené hraničné hodnoty

Môže sa vyskytnúť situácia, že sa konkrétna metóda volá z viacerých vlákien súčasne a musíme ladiť spracovanie iba pre konkrétny argument.

IntelliJ umožňuje vytváranie hraničných bodov, ktoré pozastavia vykonávanie, iba ak je splnená používateľom definovaná podmienka.

Tu je príklad, ktorý používa vyššie uvedený zdrojový kód:

Teraz sa debugger zastaví na zarážke, iba ak je daný argument väčší ako 3.

7. Značky objektov

Toto je najvýkonnejšia a najmenej známa funkcia IntelliJ. Je to v podstate celkom jednoduché - môžeme k objektom JVM pripevniť vlastné štítky.

Pozrime sa na aplikáciu, ktorú použijeme na ich demonštráciu:

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 (držiteľ zbierky) {int i = ThreadLocalRandom.current (). nextInt (10); if (i% 3 == 0) {holder.add (i); }} private static class Úloha implementuje Runnable {private final Collection holder = new ArrayList (); @Override public void run () {for (int i = 0; i <20; i ++) {mayBeAdd (držiteľ); }}}}

7.1. Vytváranie značiek

Objekt je možné označiť, keď je aplikácia zastavená na zarážke a cieľ je dosiahnuteľný z rámcov zásobníka.

Vyberte ho a stlačte F11 (Označiť objekt akcia) a definujte cieľový názov:

7.2. Zobraziť značky

Teraz môžeme vidieť naše vlastné štítky objektov aj v iných častiach aplikácie:

Super je, že aj keď označený objekt nie je v súčasnosti dosiahnuteľný z rámcov stohu, stále môžeme vidieť jeho stav - otvoriť Vyhodnoťte výraz dialógové okno alebo pridajte nové hodinky a začnite písať názov značky.

IntelliJ ponúka na doplnenie _DebugLabel prípona:

Keď to vyhodnotíme, zobrazí sa stav cieľového objektu:

7.3. Označí ako podmienky

Značky je možné použiť aj v podmienkach zlomu:

8. Záver

Počas ladenia viacvláknovej aplikácie sme skontrolovali množstvo techník, ktoré výrazne zvyšujú produktivitu.

Toto je zvyčajne náročná úloha a tu nemôžeme podceňovať dôležitosť pomoci nástrojov.