# 将Android模拟器启动起来
emulator &
# 激活Android 模拟器中的 Logcat 工具
adb logcat
~/Android/system/core
include
cutils
logprint.h # 处理日志记录的输出
event_tag_map.h # 处理日志记录的输出
logger.h # 定义了一些基础数据结构和宏
android
log.h # 定义了一些基础数据结构和宏
liblog # 处理日志记录的输出
logprint.c
event_tag_map.c
logcat
logcat.cpp # Logcat工具的源代码实现
// system\core\include\cutils\logger.h
// 从Logger日志驱动程序中提取出来的
// 描述一条日志记录
struct logger_entry {
uint16_t len; /* length of the payload */
uint16_t __pad; /* no matter what, we get 2 bytes of padding */
int32_t pid; /* generating process's pid */
int32_t tid; /* generating process's tid */
int32_t sec; /* seconds since Epoch */
int32_t nsec; /* nanoseconds */
char msg[0]; /* the entry's payload */
};
// 描述一条日志记录的最大长度, 包括日志记录头和日志记录有效负载两部分内容的长度
#define LOGGER_ENTRY_MAX_LEN (4*1024)
// 描述日志记录有效负载的最大长度
#define LOGGER_ENTRY_MAX_PAYLOAD \
(LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry))
// system\core\logcat\logcat.cpp
// 描述一个日志记录队列
struct queued_entry_t
{
// Logcat工具将相同类型的日志记录按照写入时间的先后顺序保存在同一个队列中,
//这样在输出日志记录时, 沿着这个队列就可以按照时间顺序来依次输出系统中的日志信息了
// 联合体, 用来描述一条日志记录的内容
union
{
unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1] __attribute__((aligned(4)));
struct logger_entry entry __attribute__((aligned(4)));
};
// 连接下一条日志记录, 从而形成一个队列
queued_entry_t* next;
queued_entry_t()
{
next = NULL;
}
};