IntelliJ hibakeresési trükkök

1. Áttekintés

Ebben az oktatóanyagban megvizsgálunk néhányat fejlett IntelliJ hibakeresési lehetőségek.

Feltételezzük, hogy a hibakeresés alapjai már ismertek (hogyan lehet elkezdeni a hibakeresést, Belép, Átlép cselekvések stb.). Ha nem, kérjük, olvassa el ezt a cikket további részletekért.

2. Okos lépés

Vannak olyan helyzetek, amikor több metódust hívnak meg egy forráskódsoron, például doJob (getArg1 (), getArg2 ()). Ha hívunk Belép művelet (F7), a hibakereső a JVM által az értékeléshez használt sorrendben megy bele a módszerekbe: getArg1getArg2doJob.

Azonban, érdemes kihagyni az összes közbenső invokációt, és közvetlenül a cél módszerhez haladni. Okos lépés cselekvés lehetővé teszi ezt.

Ez az kötve a Shift + F7 alapértelmezés szerint és így néz ki, amikor meghívják:

Most kiválaszthatjuk a célzási módszert a folytatáshoz. Vegye figyelembe azt is, hogy az IntelliJ mindig a legkülső módszert helyezi a lista elejére. Ez azt jelenti, hogy a megnyomásával gyorsan elmehetünk hozzá Shift + F7 | Belép.

3. Dobd el a keretet

Rájöhetünk, hogy valamilyen feldolgozás, amely érdekel minket, már megtörtént (pl. A jelenlegi módszer argumentumának kiszámítása). Ebben az esetben, lehetséges az aktuális JVM veremkeret (ek) eldobása az újrafeldolgozás érdekében.

Vegye figyelembe a következő helyzetet:

Tegyük fel, hogy érdekel minket a hibakeresés getArg1 feldolgozás, ezért eldobjuk az aktuális keretet (doJob módszer):

Most az előző módszerben vagyunk:

A hívás argumentumokat azonban már ezen a ponton kiszámoltuk, tehát le kell dobnunk az aktuális keretet is:

Most újraindíthatjuk a feldolgozást hívással Belép.

4. Terepi töréspontok

Előfordul, hogy a nem privát mezőket más osztályok módosítják, nem a beállítókon keresztül, hanem közvetlenül (ez a helyzet a harmadik féltől származó könyvtárakkal, ahol nem a forráskódot irányítjuk).

Ilyen helyzetekben nehéz lehet megérteni, amikor a módosítás megtörtént. Az IntelliJ lehetővé teszi terepi szintű töréspontok létrehozását ennek nyomon követésére.

A szokásos módon vannak beállítva - kattintson a bal egérgombbal a bal oldali szerkesztő ereszcsatornájára a mező sorában. Ezek után lehetséges nyissa meg a töréspont tulajdonságait (kattintson jobb gombbal a töréspont jelére), és konfigurálja, ha érdekel a mező olvasása, írása vagy mindkettő:

5. Töréspontok naplózása

Néha tudjuk, hogy van versenyfeltétel az alkalmazásban, de nem tudjuk, hol van pontosan. Kihívás lehet a leszögezése, különösen új kóddal való munka közben.

Hibakeresési utasításokat adhatunk programunk forrásaihoz. Harmadik fél könyvtárai számára azonban nincs ilyen képesség.

Az IDE itt segíthet - lehetővé teszi olyan töréspontok beállítását, amelyek nem blokkolják a végrehajtást, ha elérik, hanem naplózási utasításokat állítanak elő.

Tekintsük a következő példát:

public static void main (String [] args) {ThreadLocalRandom random = ThreadLocalRandom.current (); int szám = 0; mert (int i = 0; i <5; i ++) {if (érdekelt (véletlen.nextInt (10))) {count ++; }} System.out.printf ("% d érdeklődő értéket talált% n", szám); } privát statikus logikai isérdekelt (int i) {return i% 2 == 0; }

Tegyük fel, hogy érdekel minket a tényleges naplózás érdekli hívás paraméterei.

Hozzunk létre egy nem blokkoló töréspontot a cél módszerben (Váltás + bal gombbal kattintson a bal oldali szerkesztő csatornára). Ezt követően nyissuk meg a tulajdonságait (jobb gombbal kattintsunk a töréspontra) és határozza meg a naplózandó célkifejezést:

Az alkalmazás futtatásakor (vegye figyelembe, hogy továbbra is szükséges a Debug mód használata), meglátjuk a kimenetet:

isInterested (1) isInterested (4) isInterested (3) isInterested (1) isInterested (6) Talált 2 érdekelt értéket

6. Feltételes töréspontok

Előfordulhat olyan helyzetünk, amikor egy adott metódust egyszerre több szálból hívunk meg, és csak egy adott argumentumhoz kell hibakeresést végeznünk.

IntelliJ megengedi olyan töréspontok létrehozása, amelyek csak akkor szüneteltetik a végrehajtást, ha a felhasználó által meghatározott feltétel teljesül.

Íme egy példa, amely a fenti forráskódot használja:

Most a hibakereső csak akkor áll meg a törésponton, ha az adott argumentum nagyobb, mint 3.

7. Tárgyjelek

Ez a legerősebb és legkevésbé ismert IntelliJ szolgáltatás. Ez lényegében nagyon egyszerű - egyedi címkéket csatolhatunk a JVM objektumokhoz.

Vessen egy pillantást egy alkalmazásra, amelyet bemutatunk majd nekik:

public class Test {public static void main (String [] args) {Gyűjtési feladatok = Tömbök.asList (új feladat (), új feladat ()); task.forEach (feladat -> új Szál (feladat) .start ()); } private static void mayBeAdd (Gyűjtemény birtokosa) {int i = ThreadLocalRandom.current (). nextInt (10); if (i% 3 == 0) {tulajdonos.add (i); }} privát statikus osztály A feladat végrehajtja a Runnable {private final collection holder = new ArrayList (); @Orride public void run () {for (int i = 0; i <20; i ++) {mayBeAdd (tulajdonos); }}}}

7.1. Jelek létrehozása

Az objektum akkor jelölhető meg, ha egy alkalmazás le van állítva egy törésponton, és a cél a veremkeretekből érhető el.

Válassza ki, nyomja meg a gombot F11 (Object megjelölése művelet) és határozza meg a cél nevét:

7.2. Nézd meg a jeleket

Most már láthatjuk az egyedi objektumcímkéinket még az alkalmazás más részein is:

A klassz dolog az akkor is, ha a megjelölt objektum jelenleg nem érhető el a veremkeretekből, akkor is láthatjuk annak állapotát - nyisson meg egy Értékelje a kifejezést párbeszédpanelt, vagy adjon hozzá egy új órát, és kezdje el beírni a védjegy nevét.

Az IntelliJ felajánlja, hogy kiegészíti a _DugugLabel utótag:

Amikor kiértékeljük, megjelenik a célobjektum állapota:

7.3. Jelölések mint feltételek

Töréspontos körülmények között is használható jelölések:

8. Következtetés

Számos olyan technikát ellenőriztünk, amelyek nagyban növelik a termelékenységet, miközben többszálú alkalmazást hibakeresünk.

Ez általában kihívást jelentő feladat, és itt nem tudjuk lebecsülni a szerszámok segítségének fontosságát.