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