androidstuido 查看logs_使用 Logcat 写入和查看日志
Android Studio 中的 Logcat 窗口會(huì)顯示系統(tǒng)消息,例如在進(jìn)行垃圾回收時(shí)顯示的消息,以及使用 Log 類添加到應(yīng)用的消息。此窗口可以實(shí)時(shí)顯示消息,也可以保留歷史記錄,因此您可以查看較早的消息。
要僅顯示感興趣的信息,您可以創(chuàng)建過濾器、修改消息中顯示的信息量、設(shè)置優(yōu)先級(jí)、僅顯示通過應(yīng)用代碼生成的消息以及搜索日志。默認(rèn)情況下,logcat 僅顯示與最近運(yùn)行的應(yīng)用相關(guān)的日志輸出。
如果應(yīng)用拋出異常,logcat 會(huì)顯示一條消息,后跟相關(guān)聯(lián)的堆棧軌跡,其中包含指向相應(yīng)代碼行的鏈接。
從 Android Studio 2.2 開始,Run 窗口還會(huì)顯示當(dāng)前正在運(yùn)行的應(yīng)用的日志消息。請注意,您可以配置 logcat 輸出顯示,但無法配置 Run 窗口。
查看應(yīng)用日志
如需顯示應(yīng)用的日志消息,請執(zhí)行以下操作:
依次點(diǎn)擊 View > Tool Windows > Logcat(或點(diǎn)擊工具窗口欄中的 Logcat 圖標(biāo)
)。
Logcat 窗口會(huì)顯示所選應(yīng)用(從窗口頂部的下拉列表中選擇)的日志消息,如圖 1 所示。
圖 1. Logcat 窗口
默認(rèn)情況下,logcat 僅顯示在設(shè)備上運(yùn)行的應(yīng)用的日志消息。要更改此默認(rèn)設(shè)置,請參閱如何過濾 logcat 消息。
Logcat 工具欄中提供以下按鈕:
Clear logcat
:點(diǎn)擊此按鈕可以清除顯示的日志。
Scroll to the end
:點(diǎn)擊此按鈕可以跳轉(zhuǎn)到日志底部并查看最新的日志消息。如果您先點(diǎn)擊此按鈕,然后點(diǎn)擊日志中的某一行,則視圖會(huì)在相應(yīng)位置暫停滾動(dòng)。
Up the stack trace
和 Down the stack trace
:點(diǎn)擊相應(yīng)按鈕可以在日志的堆棧軌跡中進(jìn)行上下導(dǎo)航,從而選擇輸出的異常中顯示的后續(xù)文件名(以及在編輯器中查看相應(yīng)行號(hào))。這與您在日志中點(diǎn)擊某個(gè)文件名時(shí)的行為相同。
Use soft wraps
:點(diǎn)擊此按鈕可以啟用換行并防止水平滾動(dòng)(盡管所有非間斷字符串仍然需要進(jìn)行水平滾動(dòng))。
:點(diǎn)擊此按鈕可以輸出 logcat 消息。在顯示的對話框中選擇輸出偏好設(shè)置后,您還可以選擇將其保存為 PDF 格式。
Restart
:點(diǎn)擊此按鈕可以清除日志并重啟 logcat。與 Clear logcat 按鈕不同,此按鈕可以恢復(fù)并顯示之前的日志消息,因此當(dāng) Logcat 無響應(yīng)而您又不想失去日志消息時(shí),此按鈕是最有用的。
Logcat header
:點(diǎn)擊此按鈕可以打開 Configure Logcat Header 對話框,在該對話框中,您可以自定義各個(gè) logcat 消息的外觀,例如是否顯示日期和時(shí)間。
Screen capture
:點(diǎn)擊此按鈕可以截取屏幕截圖。
Screen record
:點(diǎn)擊此按鈕可以錄制設(shè)備屏幕的視頻(時(shí)長不超過 3 分鐘)。
寫入日志消息
通過
有關(guān)更完整的選項(xiàng)列表,請參閱
除開發(fā)期間外,其他任何時(shí)候都絕不應(yīng)將詳細(xì)日志編譯到您的應(yīng)用中。雖然會(huì)編譯調(diào)試日志,但會(huì)在運(yùn)行時(shí)將其去掉,而錯(cuò)誤、警告和信息日志會(huì)始終保留。
對于每種日志方法,第一個(gè)參數(shù)都應(yīng)是唯一標(biāo)記,第二個(gè)參數(shù)都應(yīng)是消息。系統(tǒng)日志消息的標(biāo)記是一個(gè)簡短的字符串,指示消息所源自的系統(tǒng)組件(例如 ActivityManager)。標(biāo)記可以是您認(rèn)為有用的任何字符串,例如當(dāng)前類的名稱。
一種比較好的做法是,在要用于第一個(gè)參數(shù)的類中聲明 TAG 常量。例如,您可以按如下方式創(chuàng)建一條信息日志消息:
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);
注意:長度超過 23 個(gè)字符的標(biāo)記名稱在 logcat 輸出中會(huì)被截?cái)唷?/p>
Logcat 消息格式
每個(gè) Android 日志消息都有一個(gè)與之相關(guān)聯(lián)的標(biāo)記和優(yōu)先級(jí)。系統(tǒng)日志消息的標(biāo)記是一個(gè)簡短的字符串,指示消息所源自的系統(tǒng)組件(例如 ActivityManager)。用戶定義的標(biāo)記可以是您認(rèn)為有用的任何字符串,例如當(dāng)前類的名稱(建議的標(biāo)記)。您可以在 Log 方法調(diào)用中定義它,例如:
Kotlin
Log.d(tag, message)Java
Log.d(tag, message);
優(yōu)先級(jí)是以下值之一:
V:詳細(xì)(優(yōu)先級(jí)最低)
D:調(diào)試
I:信息
W:警告
E:錯(cuò)誤
A:斷言
日志消息的格式為:
date time PID-TID/package priority/tag: message
例如,下面的日志消息的優(yōu)先級(jí)為 V,標(biāo)記為 AuthZen:
12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: Handling delegate intent.
PID 代表進(jìn)程標(biāo)識(shí)符,TID 則為線程標(biāo)識(shí)符;如果僅有一個(gè)線程,兩者可以相同。
設(shè)置日志級(jí)別
您可以通過設(shè)置日志級(jí)別來控制 logcat 中顯示的消息數(shù)量。您可以顯示所有消息,也可以僅顯示指示最嚴(yán)重情況的消息。
請注意,無論日志級(jí)別設(shè)置如何,logcat 都會(huì)繼續(xù)收集所有消息。此設(shè)置僅決定 logcat 顯示什么。
在“Log level”菜單中,選擇以下值之一:
Verbose:顯示所有日志消息(默認(rèn)值)。
Debug:顯示僅在開發(fā)期間有用的調(diào)試日志消息,以及此列表中較低的消息級(jí)別。
Info:顯示常規(guī)使用情況的預(yù)期日志消息,以及此列表中較低的消息級(jí)別。
Warn:顯示尚不是錯(cuò)誤的潛在問題,以及此列表中較低的消息級(jí)別。
Error:顯示已經(jīng)引發(fā)錯(cuò)誤的問題,以及此列表中較低的消息級(jí)別。
Assert:顯示開發(fā)者預(yù)計(jì)絕不會(huì)發(fā)生的問題。
搜索 logcat 消息
要搜索 logcat 中當(dāng)前顯示的消息,請執(zhí)行以下操作:
(可選)如果您想要使用正則表達(dá)式搜索模式,請選擇 Regex。
在搜索字段
中輸入字符序列。
Logcat 輸出會(huì)相應(yīng)地顯示更改。
按 Enter 鍵以在此會(huì)話期間將搜索字符串保存到菜單中。
要重復(fù)搜索,請從搜索菜單中選擇。根據(jù)需要選擇或取消選擇 Regex(不建議使用此設(shè)置)。
過濾 logcat 消息
將日志輸出減少至可管理水平的一種方法是,使用過濾器施加限制。
注意:過濾器會(huì)應(yīng)用于 logcat 的全部歷史記錄,而不僅僅是 logcat 中當(dāng)前顯示的消息。確保適當(dāng)?shù)卦O(shè)置其他顯示選項(xiàng),以便您能夠看到想要檢查的過濾器輸出。
要定義并應(yīng)用過濾器,請執(zhí)行以下操作:
在過濾器菜單中,選擇一個(gè)過濾選項(xiàng):
Show only selected application:僅顯示通過應(yīng)用代碼生成的消息(默認(rèn)選項(xiàng))。Logcat 使用正在運(yùn)行的應(yīng)用的 PID 來過濾日志消息。
No Filters:不應(yīng)用過濾器。無論您選擇哪個(gè)進(jìn)程,logcat 都會(huì)顯示設(shè)備中的所有日志消息。
Edit Filter Configuration:創(chuàng)建或修改自定義過濾器。例如,您可以創(chuàng)建一個(gè)過濾器,以同時(shí)查看兩個(gè)應(yīng)用中的日志消息。
定義過濾器后,您還可以在菜單中選擇它們。要從菜單中移除過濾器,刪除即可。
如果您選擇了 Edit Filter Configuration,請創(chuàng)建或修改過濾器:
在“Create New Logcat Filter”對話框中指定過濾器參數(shù):
Filter Name:輸入要設(shè)定的過濾器的名稱,或者從左側(cè)窗格中進(jìn)行選擇以修改現(xiàn)有過濾器。名稱只能包含小寫字符、下劃線和數(shù)字。
Log Tag:(可選)指定標(biāo)記。如需了解詳情,請參閱 Logcat 消息格式。
Log Message:(可選)指定日志消息文本。如需了解詳情,請參閱 Logcat 消息格式。
Package Name:(可選)指定軟件包名稱。如需了解詳情,請參閱 Logcat 消息格式。
PID:(可選)指定進(jìn)程 ID。如需了解詳情,請參閱 Logcat 消息格式。
Log Level:(可選)選擇日志級(jí)別。如需了解詳情,請參閱 設(shè)置日志級(jí)別。
Regex:選擇此選項(xiàng)可以為相應(yīng)參數(shù)使用正則表達(dá)式語法。
點(diǎn)擊 +,將過濾器定義添加到左側(cè)窗格中。
要移除過濾器,請?jiān)谧髠?cè)窗格中將其選中,然后點(diǎn)擊 -。
完成后,點(diǎn)擊 OK。
如果您認(rèn)為并沒有看到想要檢查的日志消息,請嘗試選擇 No filters 并搜索特定日志消息。
讀取垃圾回收消息
有時(shí),發(fā)生垃圾回收事件時(shí),相應(yīng)消息會(huì)輸出到 logcat 中。
如需詳細(xì)了解應(yīng)用的內(nèi)存,請使用內(nèi)存性能剖析器。
Dalvik 日志消息
在 Dalvik(而不是 ART)中,每個(gè) GC 都會(huì)將以下信息輸出到 logcat 中:
D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats, Pause_time
示例:
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
GC 原因
什么觸發(fā)了 GC 以及是哪種回收。可能的原因包括:
GC_CONCURRENT
在您的堆開始占用內(nèi)存時(shí)釋放內(nèi)存的并發(fā) GC。
GC_FOR_MALLOC
您的堆已滿而系統(tǒng)不得不停止您的應(yīng)用并回收內(nèi)存時(shí),您的應(yīng)用嘗試分配內(nèi)存而引起的 GC。
GC_HPROF_DUMP_HEAP
當(dāng)您請求創(chuàng)建 HPROF 文件來分析堆時(shí)發(fā)生的 GC。
GC_EXPLICIT顯式 GC,例如當(dāng)您調(diào)用
GC_EXTERNAL_ALLOC
這僅適用于 API 級(jí)別 10 及更低級(jí)別(更新的版本會(huì)在 Dalvik 堆中分配任何內(nèi)存)。外部分配內(nèi)存的 GC(例如存儲(chǔ)在原生內(nèi)存或 NIO 字節(jié)緩沖區(qū)中的像素?cái)?shù)據(jù))。
釋放量
從此次 GC 中回收的內(nèi)存量。
堆統(tǒng)計(jì)數(shù)據(jù)
堆的可用空間百分比與(活動(dòng)對象數(shù)量)/(堆總大小)。
外部內(nèi)存統(tǒng)計(jì)數(shù)據(jù)
API 級(jí)別 10 及更低級(jí)別的外部分配內(nèi)存(已分配內(nèi)存量)/(發(fā)生回收的限值)。
暫停時(shí)間
堆越大,暫停時(shí)間越長。并發(fā)暫停時(shí)間顯示兩個(gè)暫停:一個(gè)出現(xiàn)在回收開始時(shí),另一個(gè)出現(xiàn)在回收快要完成時(shí)。
在此類日志消息積聚時(shí),請注意堆統(tǒng)計(jì)數(shù)據(jù)(上面示例中的 3571K/9991K 值)的增大情況。如果此值繼續(xù)增大,可能會(huì)出現(xiàn)內(nèi)存泄露。
ART 日志消息
與 Dalvik 不同,ART 不會(huì)為未明確請求的 GC 記錄消息。只有在系統(tǒng)認(rèn)為 GC 速度較慢時(shí)才會(huì)輸出 GC 消息。更確切地說,僅在 GC 暫停時(shí)間超過 5 毫秒或 GC 持續(xù)時(shí)間超過 100 毫秒時(shí)。如果應(yīng)用未處于可察覺到暫停的狀態(tài)(例如應(yīng)用在后臺(tái)運(yùn)行時(shí),這種情況下,用戶無法察覺 GC 暫停),則其所有 GC 都不會(huì)被視為速度較慢。系統(tǒng)一直會(huì)記錄顯式 GC。
ART 會(huì)在其垃圾回收日志消息中包含以下信息:
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)
示例:
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 原因
什么觸發(fā)了 GC 以及是哪種回收。可能的原因包括:
Concurrent
不會(huì)掛起應(yīng)用線程的并發(fā) GC。此 GC 在后臺(tái)線程中運(yùn)行,而且不會(huì)阻止分配。
Alloc
您的應(yīng)用在堆已滿時(shí)嘗試分配內(nèi)存而引起的 GC。在這種情況下,垃圾回收在分配線程中發(fā)生。
Explicit由應(yīng)用明確請求的垃圾回收,例如,通過調(diào)用
NativeAlloc
原生分配(例如位圖或 RenderScript 分配對象)導(dǎo)致出現(xiàn)原生內(nèi)存壓力,進(jìn)而引起的回收。
CollectorTransition
由堆轉(zhuǎn)換引起的回收;這由在運(yùn)行時(shí)變更 GC 策略引起(例如應(yīng)用在可察覺到暫停的狀態(tài)之間切換時(shí))。回收器轉(zhuǎn)換包括將所有對象從空閑列表空間復(fù)制到碰撞指針空間(反之亦然)。
回收器轉(zhuǎn)換僅在以下情況下出現(xiàn):在 Android 8.0 之前的低內(nèi)存設(shè)備上,應(yīng)用將進(jìn)程狀態(tài)從可察覺到暫停的狀態(tài)(例如應(yīng)用在前臺(tái)運(yùn)行時(shí),這種情況下,用戶可以察覺 GC 暫停)更改為察覺不到暫停的狀態(tài)(反之亦然)。
HomogeneousSpaceCompact
同構(gòu)空間壓縮是空閑列表空間到空閑列表空間壓縮,通常在應(yīng)用進(jìn)入到察覺不到暫停的進(jìn)程狀態(tài)時(shí)發(fā)生。這樣做的主要原因是減少內(nèi)存使用量并對堆進(jìn)行碎片整理。
DisableMovingGc
這不是真正的 GC 原因,但請注意,由于在發(fā)生并發(fā)堆壓縮時(shí)使用了 GetPrimitiveArrayCritical,回收遭到阻止。一般情況下,強(qiáng)烈建議不要使用 GetPrimitiveArrayCritical,因?yàn)樗谝苿?dòng)回收器方面存在限制。
HeapTrim
這不是 GC 原因,但請注意,在堆修剪完成之前,回收會(huì)一直受到阻止。
GC 名稱
ART 具有可以運(yùn)行的多種不同的 GC。
Concurrent mark sweep (CMS)
整個(gè)堆回收器,會(huì)釋放和回收除映像空間以外的所有其他空間。
Concurrent partial mark sweep
幾乎整個(gè)堆回收器,會(huì)回收除映像空間和 Zygote 空間以外的所有其他空間。
Concurrent sticky mark sweep
分代回收器,只能釋放自上次 GC 后分配的對象。此垃圾回收比完整或部分標(biāo)記清除運(yùn)行得更頻繁,因?yàn)樗焖偾視和r(shí)間更短。
Marksweep + semispace
非并發(fā)、復(fù)制 GC,用于堆轉(zhuǎn)換以及同構(gòu)空間壓縮(對堆進(jìn)行碎片整理)。
釋放的對象
此 GC 從非大型對象空間回收的對象數(shù)量。
釋放的大小
此 GC 從非大型對象空間回收的字節(jié)數(shù)量。
釋放的大型對象
此垃圾回收從大型對象空間回收的對象數(shù)量。
釋放的大型對象大小
此垃圾回收從大型對象空間回收的字節(jié)數(shù)量。
堆統(tǒng)計(jì)數(shù)據(jù)
可用空間百分比與(活動(dòng)對象數(shù)量)/(堆總大小)。
暫停時(shí)間
通常情況下,暫停時(shí)間與 GC 運(yùn)行時(shí)修改的對象引用數(shù)量成正比。當(dāng)前,ART CMS GC 僅在 GC 即將完成時(shí)暫停一次。
移動(dòng) GC 的暫停時(shí)間較長,會(huì)在 GC 的大部分時(shí)間持續(xù)。
如果您在 logcat 中看到大量 GC,請注意堆統(tǒng)計(jì)數(shù)據(jù)(上面示例中的 25MB/38MB 值)的增大情況。如果此值繼續(xù)增大,且始終沒有變小的趨勢,可能會(huì)出現(xiàn)內(nèi)存泄漏。或者,如果您看到原因?yàn)椤癆lloc”的 GC,則您已快要達(dá)到堆容量上限,并且很快會(huì)出現(xiàn) OOM 異常。
總結(jié)
以上是生活随笔為你收集整理的androidstuido 查看logs_使用 Logcat 写入和查看日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 取值方法_我国细骨料试验方法标准分析及修
- 下一篇: layui关闭表格编辑_告别复制粘贴,表