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。
过滤LOG_TAG=appproc
logcat -s appproc