Kirjoita ja katsele lokit Logcatilla

Android Studion Logcat-ikkunassa näkyvät järjestelmän viestit, kuten garbagecollectionin tapahtuminen, sekä viestit, jotka olet lisännyt sovellukseesi Log-luokan avulla. Se näyttää viestit reaaliajassa ja säilyttää historian, jotta voit tarkastella vanhempia viestejä.

Näyttääksesi vain kiinnostavat tiedot voit luoda suodattimia, muokata sitä, kuinka paljon tietoa viesteissä näytetään, asettaa prioriteettitasoja, näyttää vain sovelluksen koodin tuottamat viestit ja tehdä hakuja lokista. Oletusarvoisesti logcatsnäyttää vain viimeksi suoritettuun sovellukseen liittyvät lokitulosteet.

Kun sovellus heittää poikkeuksen, logcat näyttää viestin, jota seuraa siihen liittyvä pinojälki, joka sisältää linkit koodiriville.

Android Studio 2.2:sta lähtien Suorita-ikkunassa näkyvät myös käynnissä olevan sovelluksen lokiviestit. Huomaa, että voit määrittää logcat-tulosteen näytön, mutta et Runwindow-ikkunaa.

Katsele sovelluksen lokeja

Sovelluksen lokiviestien näyttäminen:

  1. Rakenna ja suorita sovellus laitteessa.
  2. Napsauta Näytä > Työkaluikkunat > Logcat (tai napsauta Logcat työkaluikkunapalkissa).

Logcat-ikkunassa näkyvät valitun sovelluksen lokiviestit, jotka on valittu ikkunan yläosassa olevista pudotusvalikoista, kuten kuvassa 1 näkyy.

Kuva 1. Logcat-ikkuna. Logcat-ikkuna

Oletusarvoisesti logcat näyttää vain laitteessa käynnissä olevan sovelluksen lokiviestit. Jos haluat muuttaa tätä oletusarvoa, katso Logcat-viestien suodattaminen.

Logcat-työkalurivillä on seuraavat painikkeet:

  1. Tyhjennä logcat : Tyhjennä näkyvä loki napsauttamalla tätä.
  2. Selaa loppuun : Napsauttamalla tätä voit siirtyä lokin loppuun ja nähdä viimeisimmät lokiviestit. Jos napsautat tämän jälkeen jotakin lokiriviä, näkymä keskeyttää vierityksen kyseiseen kohtaan.
  3. Pinojälki ylös ja Pinojälki alas : Napsauttamalla tätä voit siirtyä ylös- ja alaspäin lokin pinojäljissä valitsemalla seuraavat tiedostonimet (ja katsomalla vastaavat rivinumerot editorissa), jotka näkyvät tulostetuissa poikkeuksissa. Tämä on sama käyttäytyminen kuin napsauttamalla tiedostonimeä lokissa.
  4. Käytä pehmeitä kääreitä : Napsauttamalla tätä voit ottaa rivinvaihdon käyttöön ja estää vaakasuuntaisen vierityksen (vaikkakin kaikki katkeamattomat merkkijonot vaativat edelleen vaakasuuntaista vieritystä).
  5. Tulosta : Klikkaa tulostaaksesi logcat-viestit. Kun olet valinnut tulostusasetukset avautuvassa valintaikkunassa, voit myös tallentaa PDF-tiedostoksi.
  6. Käynnistä uudelleen : Tyhjennä loki ja käynnistä logcat uudelleen napsauttamalla tätä. Toisin kuin Tyhjennä logcat-painike, tämä palauttaa ja näyttää aiemmat lokiviestit, joten siitä on eniten hyötyä, jos Logcat ei reagoi ja et halua menettää lokiviestejä.
  7. Logcatin otsikko : Napsauttamalla tätä voit avata Configure Logcat Header -valintaikkunan, jossa voit mukauttaa kunkin logcat-viestin ulkoasua, esimerkiksi sen, näytetäänkö päivämäärä ja kellonaika.
  8. Screen capture : Napsauttamalla tätä voit ottaa kuvakaappauksen.
  9. Näyttötallenne : Napsauttamalla tätä voit tallentaa videon laitteesta (enintään 3 minuuttia).

Lokiviestien kirjoittaminen

Luokan Log avulla voit luoda lokiviestejä, jotka näkyvät logcatissa. Yleensä kannattaa käyttää seuraavia lokimenetelmiä, jotka on lueteltu järjestyksessä korkeimmasta alhaisimpaan prioriteettiin (tai vähiten yksityiskohtaisesta kaikkein yksityiskohtaisimpaan):

  • Log.e(String, String) (virhe)
  • Log.w(String, String) (varoitus)
  • Log.i(String, String) (tieto)
  • Log.d(String, String) (virheenkorjaus)
  • Log.v(String, String) (yksityiskohtainen)

Katsokaa luokkakuvausta Logluokan kuvauksesta täydellisemmän luettelon vaihtoehdoista.

Se ei saisi koskaan kääntää verbose-lokeja sovellukseen, paitsi kehitystyön aikana. Debug-lokit käännetään, mutta ne poistetaan ajonaikana, kun taas error-, warning- ja info-lokit säilytetään aina.

Kunkin lokimenetelmän ensimmäisen parametrin tulisi olla yksilöllinen tunniste ja toisen parametrin viesti. Järjestelmälokiviestin tunniste on lyhyt merkkijono, joka ilmaisee järjestelmäkomponentin, josta viesti on peräisin (esimerkiksi ActivityManager). Tunnisteesi voi olla mikä tahansa hyödylliseksi katsomasi merkkijono, kuten nykyisen luokan nimi.

Hyvä tapa on ilmoittaa luokassasi TAG-vakio, jota voit käyttää ensimmäisessä parametrissa. Voit esimerkiksi luoda informaatiolokiviestin seuraavasti:

Kotlin

private const val TAG = "MyActivity"...Log.i(TAG, "MyClass.getView() — get item number $position")

Java

private static final String TAG = "MyActivity";...Log.i(TAG, "MyClass.getView() — get item number " + position);

Huomautus: Tunnisteen nimet, jotka ovat yli 23 merkkiä pitempiä, typistetään logcat-tulosteessa.

Logcat-viestin formaatti

Jokaisella Androidin lokiviestillä on tunniste (tagi) ja prioriteetti. Järjestelmälokiviestin tunniste on lyhyt merkkijono, joka osoittaa järjestelmäkomponentin, josta viesti on peräisin (esimerkiksi ActivityManager). Käyttäjän määrittelemä tunniste voi olla mikä tahansa hyödylliseksi katsomasi merkkijono, kuten nykyisen luokan nimi (suositeltava tunniste). Määrität sen Log-metodikutsussa, esimerkiksi:

Kotlin

Log.d(tag, message)

Java

Log.d(tag, message);

Prioriteetti on jokin seuraavista arvoista:

  • V: Verbose (alhaisin prioriteetti)
  • D: Debug
  • I: Info
  • W: Warning
  • E: Error
  • A: Assert

Lokiviestin muoto on:

date time PID-TID/package priority/tag: message

Esimerkiksi seuraavan lokiviestin prioriteetti on V ja tunniste AuthZen:

12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: Handling delegate intent.

PID tarkoittaa prosessin tunnusta ja TID säikeen tunnusta; ne voivat olla samat, jos säikeitä on vain yksi.

Lokitason asettaminen

Voit säätää, kuinka monta viestiä näkyy logcatissa asettamalla lokitason. Voit näyttää kaikki viestit tai vain vakavimmista olosuhteista kertovat viestit.

Muista, että logcat jatkaa kaikkien viestien keräämistä lokitason asetuksesta riippumatta. Asetus vain määrittää, mitä logcat näyttää.

Valitse Log level -valikosta jokin seuraavista arvoista:

  • Verbose: Näyttää kaikki lokiviestit (oletusarvo).
  • Debug: Näytä debug-lokiviestit, jotka ovat hyödyllisiä vain kehityksen aikana, sekä tässä luettelossa alempana olevat viestitasot.
  • Info: Näytä odotetut lokiviestit tavanomaista käyttöä varten sekä tässä luettelossa alempana olevat viestitasot.
  • Warn: Näyttää mahdolliset ongelmat, jotka eivät vielä ole virheitä, sekä tässä luettelossa alempana olevat viestitasot.
  • Virhe: Näyttää ongelmat, jotka ovat aiheuttaneet virheitä, sekä tässä luettelossa alempana olevat viestitasot.
  • Assert: Näytä ongelmat, joiden kehittäjä olettaa, ettei niitä saisi koskaan tapahtua.

Haku logcat-viesteistä

Voit hakea logcatissa tällä hetkellä näkyviä viestejä:

  1. Vaihtoehtoisesti voit valita Regex, jos haluat käyttää säännöllisen lausekkeen hakukuviota.
  2. Kirjoita merkkijono hakukenttään .

    Logcat-tulostusnäyttö muuttuu vastaavasti.

  3. Tallenna hakujono valikkoon tämän istunnon aikana painamalla Enter-näppäintä.
  4. Voit toistaa haun valitsemalla sen hakuvalikosta. Valitse Regex tai poista sen valinta tarpeen mukaan (asetusta ei muisteta).

Suodata logcat-viestejä

Yksi tapa vähentää lokitulosteet hallittavaan tasoon on rajoittaa niitä suodattimella.

Huomautus: Suodatin koskee koko logcat-historiaa, ei vain logcatissa parhaillaan näkyviä viestejä. Varmista, että muut näyttöasetukset on asetettu asianmukaisesti, jotta näet suodattimen tulosteen, jota haluat tutkia.

Suodattimen määrittäminen ja soveltaminen:

  1. Valitse suodatinvalikosta suodatinvaihtoehto:
    • Näytä vain valittu sovellus: Näytä vain sovelluskoodin tuottamat viestit (oletusasetus). Logcat suodattaa lokiviestit aktiivisen sovelluksen PID:n avulla.
    • Ei suodattimia: Ei sovella suodattimia. Logcat näyttää kaikki laitteen lokiviestit riippumatta siitä, mikä prosessi on valittu.
    • Muokkaa suodatinmääritystä: Luo tai muokkaa mukautettua suodatinta. Voit esimerkiksi luoda suodattimen, joka näyttää kahden sovelluksen lokiviestit samanaikaisesti.

    Kun olet määritellyt suodattimet, voit myös valita ne valikosta. Voit poistaa ne valikosta poistamalla ne.

  2. Jos valitsit Muokkaa suodattimen määritystä, luo tai muokkaa suodatinta:
    1. Määritä suodatinparametrit Luo uusi Logcat-suodatin -valintaikkunassa:
      • Suodattimen nimi: Kirjoita määritettävän suodattimen nimi tai valitse se vasemmasta ruudusta, jos haluat muokata olemassa olevaa suodatinta. Nimi voi sisältää vain pieniä kirjaimia, alleviivauksia ja numeroita.
      • Lokitunniste: Määritä valinnaisesti tunniste. Lisätietoja on kohdassa logcat-viestin muoto.
      • Lokiviesti: Määritä valinnaisesti lokiviestin teksti. Lisätietoja on kohdassa logcat Message Format.
      • Paketin nimi: Määritä valinnaisesti paketin nimi. Lisätietoja on kohdassa logcat Message Format.
      • PID: Vaihtoehtoisesti määritetään prosessin tunnus. Lisätietoja on kohdassa logcat Message Format.
      • Lokitaso: Valitse valinnaisesti lokitaso. Lisätietoja on kohdassa Lokitason asettaminen.
      • Regex: Valitse tämä vaihtoehto, jos haluat käyttää säännöllisen lausekkeen syntaksia kyseiselle parametrille.
    2. Lisää suodatinmääritys vasempaan ruutuun napsauttamalla +.

      Jos haluat poistaa suodattimen, valitse se vasemmasta ruudusta ja napsauta -.

    3. Kun olet valmis, napsauta OK.

Jos et usko näkeväsi haluamiasi lokiviestejä, kokeile valita Ei suodattimia ja etsiä tiettyjä lokiviestejä.

Lue roskienkeräysviestejä

Joskus roskienkeräystapahtuman sattuessa ne tulostuvat logcatiin.

Jos haluat lisätietoja sovelluksesi muistista, käytäMuistiprofiilia.

Dalvikin lokiviestit

Dalvikissa (mutta ei ART:ssa) jokainen GC tulostaa seuraavat tiedot logcatiin:

D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats, Pause_time

Esimerkki:

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

GC Reason Mikä laukaisi GC:n ja minkälainen keräys se on. Syitä, jotka voivat näkyä, ovat muun muassa:GC_CONCURRENTSamanaikainen GC, joka vapauttaa muistia, kun kasa alkaa täyttyä.GC_FOR_MALLOCGC:n aiheutti se, että sovelluksesi yritti varata muistia, kun kasa oli jo täynnä, joten järjestelmän oli pysäytettävä sovelluksesi ja otettava muistia takaisin.GC_HPROF_DUMP_HEAPGC, joka aiheutuu, kun pyydät luomaan HPROF-tiedoston kasasi analysoimiseksi.GC_EXPLICITEksplisiittinen GC, esimerkiksi kun kutsutgc()(jonka kutsumista kannattaa välttää ja luottaa sen sijaan siihen, että GC suoritetaan tarvittaessa).GC_EXTERNAL_ALLOCTämä tapahtuu vain API-tasolla 10 ja alemmilla (uudemmat versiot allokoivat kaiken Dalvikheapissa). GC ulkoisesti allokoidulle muistille (kuten pikselidata, joka on tallennettu innatiiviseen muistiin tai NIO:n tavupuskureihin). Amount freed Tästä GC:stä palautetun muistin määrä. Heap stats Vapaan muistikasan prosenttiosuus ja (elävien objektien määrä)/(koko kasan koko). Ulkoisen muistin tilastot Ulkoisesti varattu muisti API-tasolla 10 ja sitä alemmilla tasoilla (varatun muistin määrä) / (raja, jolla keräys tapahtuu). Taukoaika Suuremmilla kasoilla on suuremmat taukoajat. Samanaikaiset taukoajat osoittavat kaksi taukoa: yksi keräyksen alussa ja toinen lähellä sen loppua.

Kun nämä lokiviestit kerääntyvät, pidä silmällä kasan tilastojen kasvua (arvo 3571K/9991K edellä olevassa esimerkissä). Jos tämä arvo jatkaa kasvuaan, sinulla saattaa olla muistivuoto.

ARTin lokiviestit

Toisin kuin Dalvik, ART ei kirjaa viestejä GC:stä, jota ei ole nimenomaisesti pyydetty. GC:t tulostetaan vain silloin, kun ne katsotaan hitaiksi. Tarkemmin sanottuna, jos GC-tauko ylittää 5 ms tai GC:n kesto ylittää 100 ms. Jos sovellus ei ole tauon havaittavissa olevassa tilassa (esimerkiksi kun sovellus on taustalla, jolloin käyttäjä ei voi havaita GC-taukoa), mitään sen GC:tä ei pidetä hitaana. Eksplisiittiset GC:t kirjataan aina lokiin.

ART sisältää seuraavat tiedot garbage collection -lokiviesteissään:

I/art: GC_Reason GC_Name Objects_freed(Size_freed) AllocSpace Objects, Large_objects_freed(Large_object_size_freed) Heap_stats LOS objects, Pause_time(s)

Esimerkki:

I/art : Explicit concurrent mark sweep GC freed 104710(7MB) AllocSpace objects, 21(416KB) LOS objects, 33% free, 25MB/38MB, paused 1.230ms total 67.216ms

GC Reason Mikä GC:n laukaisi ja minkälainen keräys se on. Syitä, jotka voivat näkyä, ovat muun muassa:ConcurrentSamanaikainen GC, joka ei keskeytä sovelluksen säikeitä. Tämä GC suoritetaan taustasäikeessäeikä estä allokaatioita.AllocGC käynnistettiin, koska sovelluksesi yritti varata muistia, kun kasa oli jo täynnä. Tässä tapauksessa roskienkeruu tapahtui allokoivassa säikeessä.ExplicitSovellus pyysi roskienkeräystä nimenomaisesti, esimerkiksi kutsumallagc()taigc(). Kuten Dalvikissa, ART:ssä paras käytäntö on, että luotat GC:hen ja vältät eksplisiittisen GC:n pyytämistä, jos mahdollista.Eksplisiittistä GC:tä ei suositella, koska se tukkii allokoivan säikeen ja tuhlaa tarpeettomasti prosessorisykliä. Eksplisiittiset GC:t voivat myös aiheuttaa jankkausta (stuttering, juddering tai pysähtyminen sovelluksessa), jos ne aiheuttavat sen, että muut säikeet joutuvat etuoikeutetuiksi.NativeAllocKeräyksen aiheutti natiivien muistipaine natiivien allokaatioiden, kuten bittikarttojen taiRenderScript-allokaatioobjektien, aiheuttama muistipaine.CollectorTransitionKeräyksen aiheutti heap-siirtymä; tämä aiheutuu GC-strategian muuttumisesta ajonaikana (esimerkiksi kun sovellus vaihtuu taukotilojen välillä). Keräyssiirtymät koostuvat kaikkien objektien kopioimisestavapaanlistan tukemasta tilasta kuopan osoittimen tilaan (tai päinvastoin).

Tämä esiintyy vain vähäisellä RAM-muistilla varustetussa laitteessa ennen Android 8:aa.0, kun sovellus vaihtaa prosessitilaa taukoa havaittavasta tilasta (esimerkiksi kun sovellus on etualalla, jolloin käyttäjä voihavaita GC-tauon) ei-taukoa havaittavaan tilaan (tai päinvastoin).

HomogeneousSpaceCompactHomogeenisen tilan tiivistäminen on vapaan listan tilasta vapaan listan tilaan tapahtuvaa tiivistämistä, joka yleensätapahtuukin, kun sovellus siirretään taukoa ei-havaittavaan prosessitilaan. Tärkeimmät syyt tämän tekemiseen ovat RAM-muistin käytön vähentäminen ja heapin hajottaminen.DisableMovingGcTämä ei ole varsinainen GC-syy, vaan huomautus siitä, että keräys oli estetty GetPrimitiveArrayCriticalin käytön vuoksi. kun samanaikainen kasan tiivistäminen tapahtuu. Yleisesti ottaenGetPrimitiveArrayCriticalin käyttöä ei suositella, koska se rajoittaa keräilijöiden siirtämistä.HeapTrimTämä ei ole GC-syy, vaan huomautus siitä, että keräily on estetty, kunnes kasan trimmaus on valmis. GC Name ART:ssä on useita erilaisia GC:tä, jotka voidaan ajaa.Concurrent mark sweep (CMS)Koko kasan kerääjä, joka vapauttaa kerää kaikki muut tilat kuin kuva-avaruuden.Concurrent partial mark sweepEnimmäkseen koko kasan kerääjä, joka kerää kaikki muut tilat kuin image- ja zygote-tilat.Concurrent sticky mark sweepSukupolven keräilijä, joka voi vapauttaa vain viimeisimmän GC:n jälkeen allokoituja objekteja. Tämä garbagecollection ajetaan useammin kuin koko tai osittainen merkkipyyhkäisy, koska se on nopeampi ja sillä on vähemmän taukoja.Marksweep + semispaceEi-rinnakkainen, kopioiva GC, jota käytetään kasan siirtymisiin sekä homogeeniseen tilojen tiivistämiseen (kasan defragmentointiin). Vapautetut objektit Niiden objektien lukumäärä, jotka palautettiin tästä GC:stä muusta kuin suurobjektiavaruudesta. Size freed Niiden tavujen määrä, jotka palautettiin tällä GC:llä muusta kuin suurten objektien tilasta. Large objects freed Suurten objektien tilassa olevien, tästä roskakokoelmasta vapautettujen objektien määrä. Large object size freed Suurten objektien koko Vapautettujen tavujen määrä suuressa objektiavaruudessa, joka on otettu talteen tästä garbagecollectionista. Kasan tilastot Vapaiden objektien prosenttiosuus ja (elävien objektien määrä)/(kasan koko). Taukoaika Yleensä taukoaika on verrannollinen niiden objektiviittausten määrään, joita muutettiin GC:n ollessa käynnissä. Tällä hetkellä ART CMS GC:ssä on vain yksi tauko, joka on lähellä GC:n loppua.Liikkuvissa GC:ssä on pitkä tauko, joka kestää suurimman osan GC:n kestosta.

Jos näet suuren määrän GC:tä logcatissa, etsi kasvua kasan tilastoissa (arvo25MB/38MB yllä olevassa esimerkissä). Jos tämä arvo kasvaa jatkuvasti eikä näytä pienenevän, sinulla voi olla muistivuoto. Vaihtoehtoisesti, jos näet GC:n, jonka syy on ”Alloc”, olet jo lähellä kasan kapasiteettia ja voit odottaaOOM-poikkeuksia lähitulevaisuudessa.

Vastaa

Sähköpostiosoitettasi ei julkaista.