android alogd,Android调试源码正确姿势打开ALOGV

本文介绍了如何在Android C++源码中启用ALOGV日志,通过分析ALOGV的控制代码,了解到其主要受LOG_NDEBUG宏控制。通过在代码中添加特定宏定义,可以打开ALOGV日志,以便于调试。以zygote进程为例,展示了如何在相应模块添加代码来打印ALOGV日志。
摘要由CSDN通过智能技术生成

Android调试源码正确姿势打开ALOGV

前言

当我沉浸在Android C++的世界中,准备通过其相关的ALOGV日志显示出来的时候,却发现怎么在logcat里面也找不到相关的日志,也许对Android ALOG日志有一定了解的会说实在不行通过ALOGD,ALOGW,ALOGE显示出来不就好了。这个是可以做到,但是不能通过相关的宏进行控制不是十分友好,而且如果Android原来的ALOGV打印的很多,难不成一个个的去修改。在本篇章我将带领打过彻底了解ALOGV的控制机制。

注意:ALOG日志等级的优先级秉承如下的顺序:

ALOGV < ALOGD < ALOGW < ALOGE

一.ALOGV控制相关代码

ALOG相关定义在system/core/include/log/log.h里面,具体如下:

#ifndef LOG_NDEBUG

#ifdef NDEBUG

#define LOG_NDEBUG 1

#else

#define LOG_NDEBUG 0

#endif

#endif

/*

* This is the local tag used for the following simplified

* logging macros. You can change this preprocessor definition

* before using the other macros to change the tag.

*/

#ifndef LOG_TAG

#define LOG_TAG NULL

#endif

#ifndef ALOGV

#define __ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))

#if LOG_NDEBUG

#define ALOGV(...) do { if (0) { __ALOGV(__VA_ARGS__); } } while (0)

#else

#define ALOGV(...) __ALOGV(__VA_ARGS__)

#endif

#endif

#ifndef ALOGD

#define ALOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))

#endif

#ifndef ALOGW

#define ALOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__))

#endif

#ifndef ALOGE

#define ALOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))

#endif

通过上面的源码我们发现,ALOGV主要受LOG_NDEBUG和LOG_NDEBUG的控制,并且假如你没有定义LOG_TAG 该头文件提供一个默认的为NULL。

二.ALOGV日志打开万能方法

好了,对于原理分析清楚了,那么我们要来讲讲万能方法了,这里我们以zygote进程为例说明,其代码路径在frameworks/base/cmds/app_process/app_main.cpp中,我们想要打印出zygote启动传入的参数,添加如下调试信息:

int main(int argc, char* const argv[])

{

......

if (1) {

String8 argv_String;

for (int i = 0; i < argc; ++i) {

argv_String.append("\"");

argv_String.append(argv[i]);

argv_String.append("\" ");

}

ALOGV("app_process main with argv: %s", argv_String.string());

}

......

}

这里我们可以直接在app_main.cpp加上如下代码,就可以打印出所有的ALOGV信息了,同理也可以扩展到其它的模块上面:

#define LOG_TAG "appproc"

#undef NDEBUG

#define LOG_NDEBUG 0

相关的打印日志如下:

06-04 15:39:00.834 2901 2901 V appproc : app_process main with argv: "-Xzygote" "/system/bin" "--zygote" "--start-system-server" "--socket-name=zygote"

06-04 15:39:16.532 3331 3331 V appproc : app_process main with argv: "/system/bin" "com.android.commands.settings.SettingsCmd" "get" "secure" "bluetooth_address"

结语

好了,Android调试源码正确姿势打开ALOGV就这么多了,终极大法就是在你所要打印的C++模块的起始代码端加入如下代码段,就万事OK了。

#define LOG_TAG "appproc"

#undef NDEBUG

#define LOG_NDEBUG 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值