android C/C++ native编程中logcat的使用

本帖最后由 lxp 于 2017-7-22 10:18 编辑

一.ALOG

参考:system/core/include/cutils/log.h

以ALOGV为例:

#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
/*
* Basic log message macro.
*
* Example:
* ALOG(LOG_WARN, NULL, "Failed with error %d", errno);
*
* The second argument may be NULL or "" to indicate the "global" tag.
*/
#ifndef ALOG
#define ALOG(priority, tag, ...) \
LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
#endif
/*
* Log macro that allows you to specify a number for the priority.
*/
#ifndef LOG_PRI
#define LOG_PRI(priority, tag, ...) \
android_printLog(priority, tag, __VA_ARGS__)
#endif
#define android_printLog(prio, tag, fmt...) \
__android_log_print(prio, tag, fmt)

#define android_vprintLog(prio, cond, tag, fmt...) \
__android_log_vprint(prio, tag, fmt)

__android_log_print(prio, tag, fmt)在 liblog 中的 logd_write.c 中实现了.

再来看一下LOG_NDEBUG

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

LOG_NDEBUG受到NDEBUG的影响

因此,想在logcat中利用ALOG打印log,分以下2步

1.在c,c++层添加

#include <cutils/log.h>

#undef NDEBUG    //取消NDEBUG的定义

2.定义LOG_TAG

[b]

/*
  * 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

[/b]在文件中定义TAG

#define LOG_TAG “ProjectName”

这样就可以在logcat中查看Tag为ProjectName的日志

3.在需要调用Log的地方执行:ALOGV,ALOGD,ALOGI,ALOGW,ALOGE。

二.直接调用__android_log_print

1.在Android.mk文件中加入LOCAL_LDLIBS := -llog 或 LOCAL_SHARED_LIBRARIES := \ libutils \ liblog \ libcutils

2.在CPP文件中加入

#include <android/log.h>

 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "ProjectName", __VA_ARGS__);

ANDROID_LOG_DEBUG是LOG的等级中的debug

其他等级分别是

Verbose,Debug,Info,Warn,Error

"ProjectName"是Log中的Tag

__VA_ARGS__是要打印的内容

3.直接在代码中调用LOGD(“XXXXX”),就可以在logcat中查看调试信息