Android LOG使用

1. 場景

想調試zygote的程序,C++寫的,需要AVLOG宏打印調試信息。

2. AVLOG

打開AVLOG

在文件system/core/liblog/include/log/log_main.h中:

#ifndef LOG_NDEBUG                                                              
#ifdef NDEBUG                                                                   
#define LOG_NDEBUG 1                                                            
#else                                                                           
#define LOG_NDEBUG 0                                                            
#endif                                                                          
#endif 

在文件frameworks/ex/framesequence/jni/utils/log.h定義如下:

/*                                                                                 
 * Simplified macro to send a verbose log message using the current LOG_TAG.       
 */                                                                                
#ifndef ALOGV                                                                      
#if /*                                                                                 
 * Simplified macro to send a verbose log message using the current LOG_TAG.       
 */                                                                                
#ifndef ALOGV                                                                      
#if LOG_NDEBUG                                                                     
#define ALOGV(...)   ((void)0)                                                                        
#else                                                                              
#define ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))                 
#endif                                                                             
#endif                                                                      

如果打開ALOGV,滿足兩個條件:1. 沒有定義ALOGV 2. LOG_NDEBUG爲0。
ALOGV沒有定義,顯然LOG_NDEBUG爲0滿足進行。

在log_main.h中,LOG_NDEBUG爲0,需要滿足兩個條件:
1)沒有定義LOG_NDEBUG。
2)沒有定義NDEBUG。

在app_main.cpp添加如下語句:

  8 #define LOG_TAG "appproc"                                                       
  9                                                                                 
 10 #undef LOG_NDEBUG                                                               
 11 #undef NDEBUG                                                                   
 12                                                                                 
 13 #include <stdio.h>                                                              
 14 #include <stdlib.h>                                                             
 15 #include <sys/prctl.h>                                                          
 16 #include <sys/stat.h>                                                           
 17 #include <unistd.h>  

添加10行和11行語句,便可以打開調試信息。

3. 測試

代碼調試信息:

190 int main(int argc, char* const argv[])                                                                   
191 {                                                                                                        
192     //if (!LOG_NDEBUG) {                                                                                 
193     if(1) {                                                                                              
194       String8 argv_String;                                                                               
195       for (int i = 0; i < argc; ++i) {                                                                   
196         argv_String.append("\"");                                                                        
197         argv_String.append(argv[i]);                                                                     
198         argv_String.append("\" ");                                                                       
199       }                                                                                                  
200       ALOGV("app_process main with argv: %s", argv_String.string());            
201     }                                                                                                    
202                                                                                                          
203     AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));               
204     // Process command line arguments                                                                    
205     // ignore argv[0]                                                                                    
206     argc--;                                                                                              
207     argv++;                                                                                              
208     ALOGV("tom app_run=%d", __LINE__);  
354     if (zygote) {                                                               
355     ALOGV("tom app_run=%d", __LINE__);                                          
356         runtime.start("com.android.internal.os.ZygoteInit", args, zygote);      
357     } else if (className) {                                                     
358     ALOGV("tom app_run=%d", __LINE__);                                          
359         runtime.start("com.android.internal.os.RuntimeInit", args, zygote);     
360     } else {                                                                    
361     ALOGV("tom app_run=%d", __LINE__);                                          
362         fprintf(stderr, "Error: no class name or --zygote supplied.\n");        
363         app_usage();                                                            
364         LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");   
365     }                                                                           
366 }  

通過logcat查看調試信息,因爲LOG_TAG是appproc。
123
過濾LOG_TAG=appproc

logcat -s appproc

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章