『壹』 在android開發中,Logcat是什麼
最後介紹一下Android的Log工具LogCat。
首先在Eclipse中選擇Windows > Show View > Other... > Android > LogCat,確定後會出現LogCat顯示框,用戶添加的Log將會在這里顯示。使用時直接在代碼中插入「Log.i("info","this is a log");」,那麼在執行到該語句時,LogCat顯示框中將出現「this is a log」。
在Eclipse中安裝ADT和android sdk包之後,運行以開發的android程序時,在LogCat窗口中會顯示出一系列的信息,這些信息是每一個程序通過Dalvik虛擬機所傳出的實時信息,可以方便我們對程序的了解。
在log窗口中,每條信息都包含五個部分,Time,標題空白,pid,tag和Message。
1、Time
表示執行的時間,這個信息對於學習生命周期,分析程序運行的先後順序特別有用。
2、標題空白的列
表示的是信息的種類,分為V,D,I,W,E五種。
V:verbose,顯示全部信息
D:Debug,顯示調試信息
I:Info,顯示一般信息
W:Warming,顯示警告信息
E:Error,顯示錯誤信息
可以通過點擊LogCat上面的用圓圈括起來的V,D,I,W,E來改變顯示的范圍。比如選擇了W,那就只有警告信息和錯誤信息可以顯示出來了。
3、pid
表示程序運行時的進程號
4、tag
標簽,通常表示系統中的一些進程名,比如我們運行helloworld程序的話,就會看到activitymanager在運行。
5、Message
表示進程運行時的一些具體信息,比如我們運行helloworld程序的話,就會看到starting activity...helloWorld的字樣
可以輸出LogCat的信息到文本文件中,以方便分析。在下拉框中選擇輸出選擇的信息就可以了。
下面是輸出到文件中的啟動helloWorld程序時的一條信息的例子,分別用5個下劃線標出了上面介紹的內容:
05-20 15:46:10.129: INFO/ActivityManager(60): Starting activity: Intent { act=android.intent.action.MAIN cat=
[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.android.helloworld/.HelloWorld }
6、Filter的使用
可以在Filter中輸入篩選信息,使LogCat中只現實我們需要分析的信息。比如我們只想看和HelloWorld相關的信息,就可以在
Filter中輸入HelloWorld,這樣只有Message 中包含HelloWorld的內容才會顯示出來。
7、LogCat中信息不能顯示
上面說了這么多關於logCat的使用,可能LogCat中根本就什麼信息都沒有顯示!沒關系,只要在Eclipse中選擇window-
>show view->other->android->devices就可以 了。
8、在LogCat中輸出程序的運行信息
a、在程序中導入相應的包:import android.util.Log;
b、在需要輸出信息的函數中增加相關的調試代碼:Log.i("hi world","oncreate");
方法i是Log類的靜態方法,可以直接使用,我們看著各類的定義可以看到,它提供了多種輸出方法,分別對應我們上面提到的V,D,I,W,E。用哪個方法就決定了輸出的類型,這里用i,表示輸出的是information。
這個方法中的第一個參數就是要顯示在Tag那一欄的內容,把這條語句加到OnCreate方法中,執行時LogCat中就會顯示如下的信息: 05-22 21:58:22.894 I 3910 hi world onCreate
9、創建新的Filter
有時候只想看我們程序中用Log類的相關方法輸出的各種信息,這時就可以考慮新建一個過濾器。點擊LogCat的右上角的「+」號,可以創建一個新的過濾器。比如我們在by Log Tag的選項中填入上面程序輸出的"hi world"這個tag。這樣再運行時在我們新創建的Filter中就只顯示hi world這個tag標記出來的信息了。
Android開發中的logcat工具使用詳解--------
logcat是Android中一個命令行工具,可以用於得到程序的log信息。
logcat使用方法如下所示:
logcat [options] [filterspecs]
logcat的選項包括:
-s 設置過濾器,例如指定 '*:s'
-f <filename> 輸出到文件,默認情況是標准輸出。
-r [<kbytes>] Rotate log every kbytes. (16 if unspecified). Requires -f
-n <count> Sets max number of rotated logs to <count>, default 4
-v <format> 設置log的列印格式, <format> 是下面的一種:
brief process tag thread raw time threadtime long
-c 清除所有log並退出
-d 得到所有log並退出 (不阻塞)
-g 得到環形緩沖區的大小並退出
-b <buffer> 請求不同的環形緩沖區 ('main' (默認), 'radio', 'events')
-B 輸出log到二進制中。
過濾器的格式是一個這樣的串:
<tag>[:priority]
其中 <tag> 表示log的component, tag (或者使用 * 表示所有) , priority 如下所示:
V Verbose
D Debug
I Info
W Warn
E Error
F Fatal
S Silent
事實上logcat的功能 是由Android的類android.util.Log決定的,在程序中log的使用方法如下所示:
Log.v() -------------------- VERBOSE
Log.d() -------------------- DEBUG
Log.i() -------------------- INFO
Log.w() -------------------- WARN
Log.e() -------------------- ERROR
以上log的級別依次升高,DEBUG信息應當只存在於開發中,INFO, WARN,ERROR這三種log將出現在發布版本中。
對於java類,可以聲明一個字元串常量TAG,Logcat可以根據他來區分不同的log,例如在計算器(Calculator)的類中,定義如下所示:
public class Calculator extends Activity {
/* ...... */
private static final String LOG_TAG = "Calculator";
private static final boolean DEBUG = false;
private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
/* ...... */
由此,所有在Calculator中使用的log,均以"Calculator"為開頭。
例如使用方法如下所示:
# logcat &
< 得到一個log片段 >
W/KeyCharacterMap( 130): No keyboard for id 0
W/KeyCharacterMap( 130): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
I/ActivityManager( 52): Displayed activity com.android.contacts/.: 983 ms
I/ARMAsse mbler( 52): generated scanline__00000077:03545404_00000A04_00000000 [ 29 ipp] (51 ins) at [0x25c978:0x25ca44] in 1764174 ns
I/ARMAssembler( 52): generated scanline__00000077:03515104_00000001_00000000 [ 46 ipp] (65 ins) at [0x25d1c8:0x25d2cc] in 776789 ns
D / dalvikvm ( 130 ): GC freed 834 objects / 81760 bytes in 63ms
D/dalvikvm( 52): GC freed 10588 objects / 425776 bytes in 94ms
其中W/I/D 表示log的級別,「dalvikvm 」「ARMAssembler 」等是不同組件(component)的名稱,後面括弧裡面的數字 表示了發出log的進程號。
使用技巧:
1.使用logcat &在後台運行
2.使用-d得到所有log
3.使用-f或者重定向(>和>>)輸出到文件
4.使用-s設置過濾器,得到想要的log。
當然,最重要的還是在程序中加入恰當的log.
許多初次接觸Android開發的朋友會遇到調試的問題,如何能夠根據錯誤提示迅速的找到「出事地點呢」?在Eclipse+ADT的開發環境中沒有好的直接跟蹤對象內容的方法,通過使用android.util.Log類可以幫助你自己查找錯誤和列印系統日誌消息。它是一個進行日誌輸出的API,我們在Android 程序中可以隨時為某一個對象插入一個Log,然後在DDMS中觀察Logcat的輸出是否正常。
android.util.Log常用的方法有以下5個:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() 。根據首字母對應VERBOSE,DEBUG,INFO, WARN,ERROR。當我們在DDMS進行調試時他們的區別並不大,只是顯示的顏色不同,但通過Logcat的過濾器我們可以過濾顯示某類的,一般對於執行錯誤的斷點,下在Log.e比較合適。但是Android開發網根據規范建議VERBOSE,DEBUG信息應當只存在於開發中,最終版本只可以包含 INFO, WARN,ERROR這三種日誌信息。在實際使用中,我們最好為每一個類聲明一個字元串常量TAG,這樣在Logcat中我們可以容易區分不同的類的日誌。例如:
private static final String TAG = "MyActivity";
接下來我們就可以用Log隨心所欲的觀察Android代碼中的每個細節:Log.e(TAG, "android123.com.cn"); 但是要記住這個Log類的參數都是String類型的。
『貳』 在android程序中,log.w用於輸出什麼級別的日誌信息 a調試 b信息 c警告 d
[W]:警告(Warn)信息,輸出顏色為橙色
在LogCat的右上方的5個字母分別表示了5種不同類型的日誌信息(並以不同顏色加以區分,級別越高,顏色越突出):
1. [V]:詳細(Verbose)信息,輸出顏色為黑色
2. [D]:調試(Debug)信息,輸出顏色是藍色
3. [I]:通告(Info)信息,輸出顏色為綠色
4. [W]:警告(Warn)信息,輸出顏色為橙色
5. [E]:錯誤(Error)信息,輸出顏色為紅色,這里錯誤信息的級別最高,其次是警告信息,然後是通知信息和調試信息,級別最低的是詳細信息。
6.[assert],新版本加入的。
『叄』 android開發中, Log.e(TAG )與System列印有什麼區別,我用System列印一樣
用log的話你可以自定tag,還可以用v、d、i、w、e等,它們列印的顏色是不同的,如v是黑色,w是黃色,e是紅色……在你輸出調試信息、錯誤信息等的時候可以更容易從眾多信息中找出
『肆』 Android SDK Manager log 裡面有紅色字體是什麼情況
Log.e出現的。其它Log.i Log.d顏色綠色的。紅色就是為了提示一下用戶出錯了。
『伍』 如何分析Android的Log
首先,讓我們看一看AndroidLog的格式。下面這段log是以所謂的long格式列印出來的。從前面Logcat的介紹中可以知道,long格式會把時間,標簽等作為單獨的一行顯示。
[ 12-09 21:39:35.510 396: 416 I/ActivityManager ]
Start procnet.coollet.infzmreader:umengService_v1 for service
net.coollet.infzmreader/com.umeng.message.
UmengService:pid=21745 uid=10039 gids={50039, 3003, 1015,1028}
[ 12-09 21:39:35.518 21745:21745I/dalvikvm ]
Turning on JNI app bug workarounds fortarget SDK version 8...
[ 12-09 21:39:35.611 21745:21745D/AgooService ]
onCreate()
我們以第一行為例:12-09 是日期,21:39:35.510是時間396是進程號,416是線程號;I代表log優先順序,ActivityManager是log標簽。
在應用開發中,這些信息的作用可能不是很大。但是在系統開發中,這些都是很重要的輔助信息。開發工程師分析的log很多都是由測試工程師抓取的,所以可能有些log根本就不是當時出錯的log。如果出現這種情況,無論你怎麼分析都不太可能得出正確的結論。如何能最大限度的避免這種情況呢?筆者就要求測試工程師報bug時必須填上bug發生的時間。這樣結合log里的時間戳信息就能大致判斷是否是發生錯誤時的log。而且根據測試工程師提供的bug發生時間點,開發工程師可以在長長的log信息中快速的定位錯誤的位置,縮小分析的范圍。
同時我們也要注意,時間信息在log分析中可能被錯誤的使用。例如:在分析多線程相關的問題時,我們有時需要根據兩段不同線程中log語句執行的先後順序來判斷錯誤發生的原因,但是我們不能以兩段log在log文件中出現的先後做為判斷的條件,這是因為在小段時間內兩個線程輸出log的先後是隨機的,log列印的先後順序並不完全等同於執行的順序。那麼我們是否能以log的時間戳來判斷呢?同樣是不可以,因為這個時間戳實際上是系統列印輸出log時的時間,並不是調用log函數時的時間。遇到這種情況唯一的辦法是在輸出log前,調用系統時間函數獲取當時時間,然後再通過log信息列印輸出。這樣雖然麻煩一點,但是只有這樣取得的時間才是可靠的,才能做為我們判斷的依據。
另外一種誤用log中時間戳的情況是用它來分析程序的性能。一個有多年工作經驗的工程師拿著他的性能分析結果給筆者看,但是筆者對這份和實際情況相差很遠的報告表示懷疑,於是詢問這位工程師是如何得出結論的。他的回答讓筆者很驚訝,他計算所採用的數據就是log信息前面的時間戳。前面我們已經講過,log前面時間戳和調用log函數的時間並不相同,這是由於系統緩沖log信息引起的,而且這兩個時間的時間差並不固定。所以用log信息前附帶的時間戳來計算兩段log間代碼的性能會有比較大的誤差。正確的方法還是上面提到的:在程序中獲取系統時間然後列印輸出,利用我們列印的時間來計算所花費的時間。
了解了時間,我們再談談進程Id和線程Id,它們也是分析log時很重要的依據。我們看到的log文件,不同進程的log信息實際上是混雜在一起輸出的,這給我們分析log帶來了很大的麻煩。有時即使是一個函數內的兩條相鄰的log,也會出現不同進程的log交替輸出的情況,也就是A進程的第一條log後面跟著的是B進程的第二條log,對於這樣的組合如果不細心分析,就很容易得出錯誤的結論。這時一定要仔細看log前面的進程Id,把相同Id的log放到一起看。
不同進程的log有這樣的問題,不同的線程輸出的log當然也存在著相同的問題。Logcat加上-vthread就能列印出線程Id。但是有一點也要引起注意,就是Android的線程Id和我們平時所講的linux線程Id並不完全等同。首先,在Android系統中,C++層使用的Linux獲取線程Id的函數gettid()是不能得到線程Id的,調用gettid()實際上返回的是進程Id。作為替代,我們可以調用pthread_self()得到一個唯一的值來標示當前的native線程。Android也提供了一個函數androidGetThreaId()來獲取線程Id,這個函數實際上就是在調用pthread_self函數。但是在Java層線程Id又是另外一個值,Java層的線程Id是通過調用Thread的getId方法得到的,這個方法的返回值實際上來自Android在每個進程的java層中維護的一個全局變數,所以這個值和C++層所獲得的值並不相同。這也是我們分析log時要注意的問題,如果是Java層線程Id,一般值會比較小,幾百左右;如果是C++層的線程,值會比較大。在前裡面的log樣本中,就能很容易的看出,第一條log是Jave層輸出的log,第二條是native層輸出的。明白了這些,我們在分析log時就不要看見兩段log前面的線程Id不相同就得出是兩個不同線程log的簡單結論,還要注意Jave層和native層的區別,這樣才能防止被誤導。
AndroidLog的優先順序在列印輸出時會被轉換成V,I,D,W,E等簡單的字元標記。在做系統log分析時,我們很難把一個log文件從頭看到尾,都是利用搜索工具來查找出錯的標記。比如搜索「E/」來看看有沒有指示錯誤的log。所以如果參與系統開發的每個工程師都能遵守Android定義的優先順序含義來輸出log,這會讓我們繁重的log分析工作變得相對輕鬆些。
Android比較常見的嚴重問題有兩大類,一是程序發生崩潰;二是產生了ANR。程序崩潰和ANR既可能發生在java層,也可能發生在native層。如果問題發生在java層,出錯的原因一般比較容易定位。如果是native層的問題,在很多情況下,解決問題就不是那麼的容易了。我們先看一個java層的崩潰例子:
I/ActivityManager( 396): Start proccom.test.crash for activity com.test.crash/.MainActivity:
pid=1760 uid=10065 gids={50065, 1028}
D/AndroidRuntime( 1760): Shutting downVM
W/dalvikvm( 1760): threadid=1: threadexiting with uncaught exception(group=0x40c38930)
E/AndroidRuntime( 1760): FATALEXCEPTION: main
E/AndroidRuntime( 1760):java.lang.RuntimeException: Unable to start activityComponentInfo
{com.test.crash/com.test.crash.MainActivity}:java.lang.NullPointerException
E/AndroidRuntime( 1760): atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
E/AndroidRuntime( 1760): atandroid.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
E/AndroidRuntime( 1760): atandroid.app.ActivityThread.access$600(ActivityThread.java:141)
E/AndroidRuntime( 1760): atandroid.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
E/AndroidRuntime( 1760): atandroid.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 1760): atandroid.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 1760): atandroid.app.ActivityThread.main(ActivityThread.java:5050)
E/AndroidRuntime( 1760): atjava.lang.reflect.Method.invokeNative(NativeMethod)
E/AndroidRuntime( 1760): atjava.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 1760): atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:793)
E/AndroidRuntime( 1760): atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime( 1760): atdalvik.system.NativeStart.main(NativeMethod)
E/AndroidRuntime( 1760): Caused by:java.lang.NullPointerException
E/AndroidRuntime( 1760): atcom.test.crash.MainActivity.setViewText(MainActivity.java:29)
E/AndroidRuntime( 1760): atcom.test.crash.MainActivity.onCreate(MainActivity.java:17)
E/AndroidRuntime( 1760): atandroid.app.Activity.performCreate(Activity.java:5104)
E/AndroidRuntime( 1760): atandroid.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
E/AndroidRuntime( 1760): atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
E/AndroidRuntime( 1760): ... 11more
I/Process ( 1760): Sending signal.PID: 1760 SIG: 9
W/ActivityManager( 396): Force finishing activitycom.test.crash/.MainActivity
Jave層的代碼發生crash問題時,系統往往會列印出很詳細的出錯信息。比如上面這個例子,不但給出了出錯的原因,還有出錯的文件和行數。根據這些信息,我們會很容易的定位問題所在。native層的crash雖然也有棧log信息輸出,但是就不那麼容易看懂了。下面我們再看一個native層crash的例子:
F/libc ( 2102): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread2102 (testapp)
D/dalvikvm(26630):GC_FOR_ALLOC freed 604K, 11% free 11980K/13368K, paused 36ms, total36ms
I/dalvikvm-heap(26630):Grow heap (frag case) to 11.831MB for 102416-byteallocation
D/dalvikvm(26630):GC_FOR_ALLOC freed 1K, 11% free 12078K/13472K, paused 34ms, total34ms
I/DEBUG ( 127):*** *** *** *** *** *** *** *** *** *** *** *** *** *** ******
I/DEBUG ( 127):Build fingerprint:
'Android/full_maguro/maguro:4.2.2/JDQ39/eng.liuchao.20130619.201255:userdebug/test-keys'
I/DEBUG ( 127):Revision: '9'
I/DEBUG ( 127):pid: 2102, tid: 2102, name: testapp >>>./testapp <<<
I/DEBUG ( 127):signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr00000000
I/DEBUG ( 127): r0 00000020 r173696874 r2 400ff520 r300000000
I/DEBUG ( 127): r4 400ff469 r5beb4ab24 r6 00000001 r7beb4ab2c
I/DEBUG ( 127): r8 00000000 r900000000 sl 00000000 fpbeb4ab1c
I/DEBUG ( 127): ip 4009b5dc spbeb4aae8 lr 400ff46f pc400ff45e cpsr 60000030
I/DEBUG ( 127): d0 000000004108dae8 d1 4108ced84108cec8
I/DEBUG ( 127): d2 4108cef84108cee8 d3 4108cf184108cf08
I/DEBUG ( 127): d4 4108c5a84108c598 d5 4108ca084108c5b8
I/DEBUG ( 127): d6 4108ce684108ce58 d7 4108ce884108ce78
I/DEBUG ( 127): d8 0000000000000000 d9 0000000000000000
I/DEBUG ( 127): d10 0000000000000000 d110000000000000000
I/DEBUG ( 127): d120000000000000000 d130000000000000000
I/DEBUG ( 127): d14 0000000000000000 d150000000000000000
I/DEBUG ( 127): d16 c1dcf7c087fec8b4 d173f50624dd2f1a9fc
I/DEBUG ( 127): d18 41c7b1ac89800000 d190000000000000000
I/DEBUG ( 127): d20 0000000000000000 d210000000000000000
I/DEBUG ( 127): d22 0000000000000000 d230000000000000000
I/DEBUG ( 127): d24 0000000000000000 d250000000000000000
I/DEBUG ( 127): d26 0000000000000000 d270000000000000000
I/DEBUG ( 127): d28 0000000000000000 d290000000000000000
I/DEBUG ( 127): d30 0000000000000000 d310000000000000000
I/DEBUG ( 127): scr 00000010
I/DEBUG ( 127):
I/DEBUG ( 127):backtrace:
I/DEBUG ( 127): #00 pc0000045e /system/bin/testapp
I/DEBUG ( 127): #01 pc0000046b /system/bin/testapp
I/DEBUG ( 127): #02 pc0001271f /system/lib/libc.so (__libc_init+38)
I/DEBUG ( 127): #03 pc00000400 /system/bin/testapp
I/DEBUG ( 127):
I/DEBUG ( 127):stack:
I/DEBUG ( 127): beb4aaa8 000000c8
I/DEBUG ( 127): beb4aaac 00000000
I/DEBUG ( 127): beb4aab0 00000000
I/DEBUG ( 127): beb4aab4 401cbee0 /system/bin/linker
I/DEBUG ( 127): beb4aab8 00001000
I/DEBUG ( 127): beb4aabc 4020191d /system/lib/libc.so (__libc_fini)
I/DEBUG ( 127): beb4aac0 4020191d /system/lib/libc.so (__libc_fini)
I/DEBUG ( 127): beb4aac4 40100eac /system/bin/testapp
I/DEBUG ( 127): beb4aac8 00000000
I/DEBUG ( 127): beb4aacc 400ff469 /system/bin/testapp
I/DEBUG ( 127): beb4aad0 beb4ab24 [stack]
I/DEBUG ( 127): beb4aad4 00000001
I/DEBUG ( 127): beb4aad8 beb4ab2c [stack]
I/DEBUG ( 127): beb4aadc 00000000
I/DEBUG ( 127): beb4aae0 df0027ad
I/DEBUG ( 127): beb4aae4 00000000
I/DEBUG ( 127): #00 beb4aae8 00000000
I/DEBUG ( 127): ........ ........
I/DEBUG ( 127): #01 beb4aae8 00000000
I/DEBUG ( 127): beb4aaec 401e9721 /system/lib/libc.so (__libc_init+40)
I/DEBUG ( 127): #02 beb4aaf0 beb4ab08 [stack]
I/DEBUG ( 127): beb4aaf4 00000000
I/DEBUG ( 127): beb4aaf8 00000000
I/DEBUG ( 127): beb4aafc 00000000
I/DEBUG ( 127): beb4ab00 00000000
I/DEBUG ( 127): beb4ab04 400ff404 /system/bin/testapp
I/DEBUG ( 127):
這個log就不那麼容易懂了,但是還是能從中看出很多信息,讓我們一起來學習如何分析這種log。首先看下面這行:
pid: 2102, tid: 2102,name: testapp >>>./testapp <<<
從這一行我們可以知道crash進程的pid和tid,前文我們已經提到過,Android調用gettid函數得到的實際是進程Id號,所以這里的pid和tid相同。知道進程號後我們可以往前翻翻log,看看該進程最後一次列印的log是什麼,這樣能縮小一點范圍。
接下來內容是進程名和啟動參數。再接下來的一行比較重要了,它告訴了我們從系統角度看,出錯的原因:
signal 11 (SIGSEGV), code 1(SEGV_MAPERR), fault addr 00000000
signal11是Linux定義的信號之一,含義是Invalidmemory reference,無效的內存引用。加上後面的「faultaddr 00000000」我們基本可以判定這是一個空指針導致的crash。當然這是筆者為了講解而特地製造的一個Crash的例子,比較容易判斷,大部分實際的例子可能就沒有那麼容易了。
再接下來的log列印出了cpu的所有寄存器的信息和堆棧的信息,這裡面最重要的是從堆棧中得到的backtrace信息:
I/DEBUG ( 127):backtrace:
I/DEBUG ( 127): #00 pc0000045e /system/bin/testapp
I/DEBUG ( 127): #01 pc0000046b /system/bin/testapp
I/DEBUG ( 127): #02 pc0001271f /system/lib/libc.so (__libc_init+38)
I/DEBUG ( 127): #03 pc00000400 /system/bin/testapp
因為實際的運行系統里沒有符號信息,所以列印出的log里看不出文件名和行數。這就需要我們藉助編譯時留下的符號信息表來翻譯了。Android提供了一個工具可以來做這種翻譯工作:arm-eabi-addr2line,位於prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin目錄下。用法很簡單:
#./arm-eabi-addr2line -f -eout/target/proct/hammerhead/symbols/system/bin/testapp0x0000045e
參數-f表示列印函數名;參數-e表示帶符號表的模塊路徑;最後是要轉換的地址。這條命令在筆者的編譯環境中得到的結果是:
memcpy /home/rd/compile/android-4.4_r1.2/bionic/libc/include/string.h:108
剩餘三個地址翻譯如下:
main /home/rd/compile/android-4.4_r1.2/packages/apps/testapp/app_main.cpp:38
out_vformat /home/rd/compile/android-4.4_r1.2/bionic/libc/bionic/libc_logging.cpp:361
_start libgcc2.c:0
利用這些信息我們很快就能定位問題了。不過這樣手動一條一條的翻譯比較麻煩,筆者使用的是從網上找到的一個腳本,可以一次翻譯所有的行,有需要的讀者可以在網上找一找。
『陸』 Android studio怎麼自定義logcat提示信息
進行點擊android studio菜單中的file的選項之後,彈出了下拉菜單中進行選擇為「settings」的選項。
進入到了settings的選項框中,進行選中列表中的editor的選項。
進行點擊editor的會展開,進行點擊android logcat的選項。
由於默認的設置是不能修改的所以需要自己進行創建,進行點擊save as的選項,需要輸入文件名,名字可以隨意去
新建的android logcat還是不能直接修改,把use inherited attribute的溝去掉。
這些設置主要進行設置顏色的選項,進行點擊顏色按鈕。
彈出了select color的窗口之後,進行選擇需要的顏色,然後進行點擊choose。
可以看到assert在logcat預覽中顯示為深藍的顏色。其它設置的設置也是類似。
『柒』 android中的幾個log的功能及作用
android.util.Log常用的方法有以下5個:Log.v() Log.d() Log.i() Log.w() 以及 Log.e()
Log.v 的調試顏色為黑色的,任何消息都會輸出,這里的v代表verbose啰嗦的意思,平時使用就是Log.v("","");
Log.d的輸出顏色是藍色的,僅輸出debug調試的意思,但他會輸出上層的信息,過濾起來可以通過DDMS的Logcat標簽來選擇.
Log.i的輸出為綠色,一般提示性的消息information,它不會輸出Log.v和Log.d的信息,但會顯示i、w和e的信息
Log.w的意思為橙色,可以看作為warning警告,一般需要我們注意優化Android代碼,同時選擇它後還會輸出Log.e的信息。
Log.e為紅色,可以想到error錯誤,這里僅顯示紅色的錯誤信息,這些錯誤就需要我們認真的分析,查看棧的信息了。
以下是使用方法:
Log.v(LogDemo.ACTIVITY_TAG, "This is Verbose.");
Log.d(LogDemo.ACTIVITY_TAG, "This is Debug.");
Log.i(LogDemo.ACTIVITY_TAG, "This is Information");
Log.w(LogDemo.ACTIVITY_TAG, "This is Warnning.");
Log.e(LogDemo.ACTIVITY_TAG, "This is Error.");
『捌』 android studio怎麼設置android Logcat字體顏色
獲得文本控制項TextView,取名為tv。 通過TextView的setTextColor方法進行文本顏色的設置,這里可以有3種方式進行設置。 tv.setTextColor(android.graphics.Color.RED);//系統自帶的顏色類。 tv.setTextColor(0xffff00ff);//0xffff00ff是int類型的數據,分組一下0xffff00ff,0x 是代表顏色整數的標記,ff是表示透明度,ff00ff表示顏色,注意:這里ffff00ff必須是8個的顏色表示,不接受ff00ff這種6個的顏色表 示。 tv.setTextColor(this.getResources().getColor(R.color.red));//通過獲得資源文件 進行設置。根據不同的情況R.color.red也可以是R.string.red或者R.drawable.red,當然前提是需要在相應的配置文件里 做相應的配置。 6 通過在Activity類中設置文本顏色,我們可以實現文本顏色的動態化。如果想保持文本顏色靜態不變的話,可以直接通過上一篇中講的通過直接配置即可。
『玖』 Android 各種log 的介紹
包含設備日誌,堆棧跟蹤和其他診斷信息,可幫助您查找和修復應用中的錯誤。
安卓bugreport主要用於分析手機的狀態。其包含: main log , kernel log ,cpuinfo等信息。bugreport是一個可執行文件,編譯後的路徑為system/bin/bugreport,源碼位於framework/native/cmds/bugreport。其核心在於啟動mpsys服務。bugreport同mpstate服務建立socket通信(建立連接20次,超時3min無數據等容錯)。連接之後,將接收到的數據定向到文件中。
因此我們看到的bugreport數據均來自mpstate。
bugreport通過socket與mpstate服務建立通信,在mpstate.cpp中的mpstate()方法完成核心功能。分別輸出: current log、 last log、 vm trace、 mpsys、 system info
其詳細內容主要有: 系統build及運行時長等信息、 內存和CPU進程的信息、 kernel log、 system log、 radio log、 event log 等等。實際來說,bugreport中顯示的大部分為信息,都有對應的命令方式可以獲取。bugreport只是作為一個在不打擾用戶的前提下執行的一套命令集合。
1). main_log 記錄手機android上層app以及framework相關活動的log,比如你寫的app列印的log,就在這裡面
2). events_log 主要是ActivityManager、powerManager等相關的log
3). kernel Log 驅動相關的log
Logcat是內置在Android系統中的一個可執行工具,用於轉儲系統消息日誌,其中包括設備引發錯誤時的堆棧追蹤以及從您的應用當使用 Log 類編寫的消息。可以在主機上通過adb logcat命令來查看模擬機上日誌信息。
Android tcpmp是命令行數據包捕獲實用程序。它可以捕獲來自您的Wi-Fi連接,蜂窩連接以及您在android設備上可能具有的任何其他網路連接的數據包
modem 是手機里負責搜網和sim卡數據操作底層模塊,每個手機都有,md log 用於分析掉網、掉話、無信號等問題
系統崩潰時留下的遺言,怎麼死的,死哪了,死的多慘。
當一個動態庫(native 程序)開始執行時,系統會注冊一些連接到 debuggerd 的 signal handlers,當系統 crash(崩潰) 的時候,會保存一個 tombstone 文件到/data/tombstones目錄下(Logcat中也會有相應的信息),文件的確就像墓碑一樣記錄了死亡了的進程的基本信息(例如進程的進程號,線程號),死亡的地址(在哪個地址上發生了 Crash),死亡時的現場是什麼樣的(記錄了一系列的堆棧調用信息)等等。
6. netlog 網路相關
看網路鏈接情況,抓取網路包等等
7. QXDM(the Qualcomm eXtensible Diagnostic Monitor)高通可擴展診斷監視器
該工具適用於擁有使用Qualcomm ASIC和試用硬體的設備的人,並允許他們測試,評估和潛在診斷其移動設備的RF性能問題。通常使用它來促進這些設備的產品開發。
使用該軟體,用戶可以查看他們的移動設備發出的所有信令消息,因為該軟體會生成它們的日誌。這些日誌也可以通過軟體進行注釋。可以將網路和電話參數的任何混合添加到屏幕,並且允許用戶在使用其參數時使用復雜的公式。該程序還實時生成大量統計數據,以便用戶可以更好地識別潛在的性能問題。用戶可以訪問Markov統計信息,Mux統計信息,RLP統計信息,塊錯誤率,移動性管理數據,尋呼和訪問統計信息,前向和反向鏈路統計信息等等。該程序還為用戶提供了攜帶型設備信號的圖形顯示。該程序與Windows操作系統兼容。
8. init Log(init進程log)
9. Crashlog(崩潰日誌)
『拾』 android,log.d()與log.i()什麼區別
1、概念不同
Log.d()是僅輸出debug調試的意思。
Log.i()指一般提示性的消息information。
2、輸出顏色不同
Log.d()的輸出顏色是藍色的。
Log.i()的輸出顏色為綠色。
3、作用不同
Log.d()會輸出上層信息,過濾起來可以通過DDMS的Logcat標簽來選擇;
Log.i()不會輸出Log.v和Log.d的信息,但會顯示i、w和e的信息。
4、列印方法不同
Log.d()列印一些調試信息(logd+tab)。
Log.i()列印一些比較重要的數據,可幫助用戶分析行為數據(logi+tab)。