Loading debuggerd/tombstone.cpp +27 −9 Original line number Diff line number Diff line Loading @@ -31,9 +31,10 @@ #include <private/android_filesystem_config.h> #include <cutils/properties.h> #include <log/log.h> #include <log/logger.h> #include <cutils/properties.h> #include <log/logprint.h> #include <backtrace/Backtrace.h> #include <backtrace/BacktraceMap.h> Loading Loading @@ -459,6 +460,8 @@ static bool dump_sibling_thread_report( // that don't match the specified pid, and writes them to the tombstone file. // // If "tail" is set, we only print the last few lines. static EventTagMap* g_eventTagMap = NULL; static void dump_log_file(log_t* log, pid_t pid, const char* filename, unsigned int tail) { bool first = true; Loading Loading @@ -521,7 +524,28 @@ static void dump_log_file(log_t* log, pid_t pid, const char* filename, if (!hdr_size) { hdr_size = sizeof(log_entry.entry_v1); } char* msg = (char *)log_entry.buf + hdr_size; char* msg = reinterpret_cast<char*>(log_entry.buf) + hdr_size; char timeBuf[32]; time_t sec = static_cast<time_t>(entry->sec); struct tm tmBuf; struct tm* ptm; ptm = localtime_r(&sec, &tmBuf); strftime(timeBuf, sizeof(timeBuf), "%m-%d %H:%M:%S", ptm); if (log_entry.id() == LOG_ID_EVENTS) { if (!g_eventTagMap) { g_eventTagMap = android_openEventTagMap(EVENT_TAG_MAP_FILE); } AndroidLogEntry e; char buf[512]; android_log_processBinaryLogBuffer(entry, &e, g_eventTagMap, buf, sizeof(buf)); _LOG(log, 0, "%s.%03d %5d %5d %c %-8s: %s\n", timeBuf, entry->nsec / 1000000, entry->pid, entry->tid, 'I', e.tag, e.message); continue; } unsigned char prio = msg[0]; char* tag = msg + 1; msg = tag + strlen(tag) + 1; Loading @@ -534,13 +558,6 @@ static void dump_log_file(log_t* log, pid_t pid, const char* filename, char prioChar = (prio < strlen(kPrioChars) ? kPrioChars[prio] : '?'); char timeBuf[32]; time_t sec = static_cast<time_t>(entry->sec); struct tm tmBuf; struct tm* ptm; ptm = localtime_r(&sec, &tmBuf); strftime(timeBuf, sizeof(timeBuf), "%m-%d %H:%M:%S", ptm); // Look for line breaks ('\n') and display each text line // on a separate line, prefixed with the header, like logcat does. do { Loading @@ -565,6 +582,7 @@ static void dump_log_file(log_t* log, pid_t pid, const char* filename, static void dump_logs(log_t* log, pid_t pid, unsigned tail) { dump_log_file(log, pid, "system", tail); dump_log_file(log, pid, "main", tail); dump_log_file(log, pid, "events", tail); } static void dump_abort_message(Backtrace* backtrace, log_t* log, uintptr_t address) { Loading logcat/logcat.cpp +8 −7 Original line number Diff line number Diff line Loading @@ -623,19 +623,20 @@ int main(int argc, char **argv) } if (!devices) { devices = new log_device_t("main", false, 'm'); dev = devices = new log_device_t("main", false, 'm'); android::g_devCount = 1; if (android_name_to_log_id("system") == LOG_ID_SYSTEM) { devices->next = new log_device_t("system", false, 's'); dev = dev->next = new log_device_t("system", false, 's'); android::g_devCount++; } if (android_name_to_log_id("crash") == LOG_ID_CRASH) { if (devices->next) { devices->next->next = new log_device_t("crash", false, 'c'); } else { devices->next = new log_device_t("crash", false, 'c'); dev = dev->next = new log_device_t("crash", false, 'c'); android::g_devCount++; } if (android_name_to_log_id("events") == LOG_ID_EVENTS) { dev = dev->next = new log_device_t("events", true, 'e'); android::g_devCount++; needBinary = true; } } Loading logd/Android.mk +3 −2 Original line number Diff line number Diff line Loading @@ -17,7 +17,8 @@ LOCAL_SRC_FILES := \ LogStatistics.cpp \ LogWhiteBlackList.cpp \ libaudit.c \ LogAudit.cpp LogAudit.cpp \ event.logtags LOCAL_SHARED_LIBRARIES := \ libsysutils \ Loading @@ -25,7 +26,7 @@ LOCAL_SHARED_LIBRARIES := \ libcutils \ libutils LOCAL_CFLAGS := -Werror LOCAL_CFLAGS := -Werror $(shell sed -n 's/^\([0-9]*\)[ \t]*auditd[ \t].*/-DAUDITD_LOG_TAG=\1/p' $(LOCAL_PATH)/event.logtags) include $(BUILD_EXECUTABLE) Loading logd/LogAudit.cpp +15 −31 Original line number Diff line number Diff line Loading @@ -54,9 +54,6 @@ bool LogAudit::onDataAvailable(SocketClient *cli) { return true; } #define AUDIT_LOG_ID LOG_ID_MAIN #define AUDIT_LOG_PRIO ANDROID_LOG_WARN int LogAudit::logPrint(const char *fmt, ...) { if (fmt == NULL) { return -EINVAL; Loading Loading @@ -115,43 +112,30 @@ int LogAudit::logPrint(const char *fmt, ...) { strcpy(pidptr, cp); } static const char comm_str[] = " comm=\""; char *comm = strstr(str, comm_str); if (comm) { cp = comm; comm += sizeof(comm_str) - 1; char *ecomm = strchr(comm, '"'); if (ecomm) { *ecomm = '\0'; } comm = strdup(comm); if (ecomm) { strcpy(cp, ecomm + 1); } } else if (pid == getpid()) { pid = tid; comm = strdup("auditd"); } else if (!(comm = logbuf->pidToName(pid))) { comm = strdup("unknown"); } size_t l = strlen(comm) + 1; size_t n = l + strlen(str) + 2; size_t n = strlen(str); n += sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint32_t); char *newstr = reinterpret_cast<char *>(malloc(n)); if (!newstr) { free(comm); free(str); return -ENOMEM; } *newstr = AUDIT_LOG_PRIO; strcpy(newstr + 1, comm); free(comm); strcpy(newstr + 1 + l, str); char *msg = newstr; *msg++ = AUDITD_LOG_TAG & 0xFF; *msg++ = (AUDITD_LOG_TAG >> 8) & 0xFF; *msg++ = (AUDITD_LOG_TAG >> 16) & 0xFF; *msg++ = (AUDITD_LOG_TAG >> 24) & 0xFF; *msg++ = EVENT_TYPE_STRING; size_t l = n - sizeof(uint32_t) - sizeof(uint8_t) - sizeof(uint32_t); *msg++ = l & 0xFF; *msg++ = (l >> 8) & 0xFF; *msg++ = (l >> 16) & 0xFF; *msg++ = (l >> 24) & 0xFF; memcpy(msg, str, l); free(str); logbuf->log(AUDIT_LOG_ID, now, uid, pid, tid, newstr, logbuf->log(LOG_ID_EVENTS, now, uid, pid, tid, newstr, (n <= USHRT_MAX) ? (unsigned short) n : USHRT_MAX); reader->notifyNewLog(); Loading logd/event.logtags 0 → 100644 +36 −0 Original line number Diff line number Diff line # The entries in this file map a sparse set of log tag numbers to tag names. # This is installed on the device, in /system/etc, and parsed by logcat. # # Tag numbers are decimal integers, from 0 to 2^31. (Let's leave the # negative values alone for now.) # # Tag names are one or more ASCII letters and numbers or underscores, i.e. # "[A-Z][a-z][0-9]_". Do not include spaces or punctuation (the former # impacts log readability, the latter makes regex searches more annoying). # # Tag numbers and names are separated by whitespace. Blank lines and lines # starting with '#' are ignored. # # Optionally, after the tag names can be put a description for the value(s) # of the tag. Description are in the format # (<name>|data type[|data unit]) # Multiple values are separated by commas. # # The data type is a number from the following values: # 1: int # 2: long # 3: string # 4: list # # The data unit is a number taken from the following list: # 1: Number of objects # 2: Number of bytes # 3: Number of milliseconds # 4: Number of allocations # 5: Id # 6: Percent # Default value for data of type int/long is 2 (bytes). # # TODO: generate ".java" and ".h" files with integer constants from this file. 1003 auditd (avc|3) Loading
debuggerd/tombstone.cpp +27 −9 Original line number Diff line number Diff line Loading @@ -31,9 +31,10 @@ #include <private/android_filesystem_config.h> #include <cutils/properties.h> #include <log/log.h> #include <log/logger.h> #include <cutils/properties.h> #include <log/logprint.h> #include <backtrace/Backtrace.h> #include <backtrace/BacktraceMap.h> Loading Loading @@ -459,6 +460,8 @@ static bool dump_sibling_thread_report( // that don't match the specified pid, and writes them to the tombstone file. // // If "tail" is set, we only print the last few lines. static EventTagMap* g_eventTagMap = NULL; static void dump_log_file(log_t* log, pid_t pid, const char* filename, unsigned int tail) { bool first = true; Loading Loading @@ -521,7 +524,28 @@ static void dump_log_file(log_t* log, pid_t pid, const char* filename, if (!hdr_size) { hdr_size = sizeof(log_entry.entry_v1); } char* msg = (char *)log_entry.buf + hdr_size; char* msg = reinterpret_cast<char*>(log_entry.buf) + hdr_size; char timeBuf[32]; time_t sec = static_cast<time_t>(entry->sec); struct tm tmBuf; struct tm* ptm; ptm = localtime_r(&sec, &tmBuf); strftime(timeBuf, sizeof(timeBuf), "%m-%d %H:%M:%S", ptm); if (log_entry.id() == LOG_ID_EVENTS) { if (!g_eventTagMap) { g_eventTagMap = android_openEventTagMap(EVENT_TAG_MAP_FILE); } AndroidLogEntry e; char buf[512]; android_log_processBinaryLogBuffer(entry, &e, g_eventTagMap, buf, sizeof(buf)); _LOG(log, 0, "%s.%03d %5d %5d %c %-8s: %s\n", timeBuf, entry->nsec / 1000000, entry->pid, entry->tid, 'I', e.tag, e.message); continue; } unsigned char prio = msg[0]; char* tag = msg + 1; msg = tag + strlen(tag) + 1; Loading @@ -534,13 +558,6 @@ static void dump_log_file(log_t* log, pid_t pid, const char* filename, char prioChar = (prio < strlen(kPrioChars) ? kPrioChars[prio] : '?'); char timeBuf[32]; time_t sec = static_cast<time_t>(entry->sec); struct tm tmBuf; struct tm* ptm; ptm = localtime_r(&sec, &tmBuf); strftime(timeBuf, sizeof(timeBuf), "%m-%d %H:%M:%S", ptm); // Look for line breaks ('\n') and display each text line // on a separate line, prefixed with the header, like logcat does. do { Loading @@ -565,6 +582,7 @@ static void dump_log_file(log_t* log, pid_t pid, const char* filename, static void dump_logs(log_t* log, pid_t pid, unsigned tail) { dump_log_file(log, pid, "system", tail); dump_log_file(log, pid, "main", tail); dump_log_file(log, pid, "events", tail); } static void dump_abort_message(Backtrace* backtrace, log_t* log, uintptr_t address) { Loading
logcat/logcat.cpp +8 −7 Original line number Diff line number Diff line Loading @@ -623,19 +623,20 @@ int main(int argc, char **argv) } if (!devices) { devices = new log_device_t("main", false, 'm'); dev = devices = new log_device_t("main", false, 'm'); android::g_devCount = 1; if (android_name_to_log_id("system") == LOG_ID_SYSTEM) { devices->next = new log_device_t("system", false, 's'); dev = dev->next = new log_device_t("system", false, 's'); android::g_devCount++; } if (android_name_to_log_id("crash") == LOG_ID_CRASH) { if (devices->next) { devices->next->next = new log_device_t("crash", false, 'c'); } else { devices->next = new log_device_t("crash", false, 'c'); dev = dev->next = new log_device_t("crash", false, 'c'); android::g_devCount++; } if (android_name_to_log_id("events") == LOG_ID_EVENTS) { dev = dev->next = new log_device_t("events", true, 'e'); android::g_devCount++; needBinary = true; } } Loading
logd/Android.mk +3 −2 Original line number Diff line number Diff line Loading @@ -17,7 +17,8 @@ LOCAL_SRC_FILES := \ LogStatistics.cpp \ LogWhiteBlackList.cpp \ libaudit.c \ LogAudit.cpp LogAudit.cpp \ event.logtags LOCAL_SHARED_LIBRARIES := \ libsysutils \ Loading @@ -25,7 +26,7 @@ LOCAL_SHARED_LIBRARIES := \ libcutils \ libutils LOCAL_CFLAGS := -Werror LOCAL_CFLAGS := -Werror $(shell sed -n 's/^\([0-9]*\)[ \t]*auditd[ \t].*/-DAUDITD_LOG_TAG=\1/p' $(LOCAL_PATH)/event.logtags) include $(BUILD_EXECUTABLE) Loading
logd/LogAudit.cpp +15 −31 Original line number Diff line number Diff line Loading @@ -54,9 +54,6 @@ bool LogAudit::onDataAvailable(SocketClient *cli) { return true; } #define AUDIT_LOG_ID LOG_ID_MAIN #define AUDIT_LOG_PRIO ANDROID_LOG_WARN int LogAudit::logPrint(const char *fmt, ...) { if (fmt == NULL) { return -EINVAL; Loading Loading @@ -115,43 +112,30 @@ int LogAudit::logPrint(const char *fmt, ...) { strcpy(pidptr, cp); } static const char comm_str[] = " comm=\""; char *comm = strstr(str, comm_str); if (comm) { cp = comm; comm += sizeof(comm_str) - 1; char *ecomm = strchr(comm, '"'); if (ecomm) { *ecomm = '\0'; } comm = strdup(comm); if (ecomm) { strcpy(cp, ecomm + 1); } } else if (pid == getpid()) { pid = tid; comm = strdup("auditd"); } else if (!(comm = logbuf->pidToName(pid))) { comm = strdup("unknown"); } size_t l = strlen(comm) + 1; size_t n = l + strlen(str) + 2; size_t n = strlen(str); n += sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint32_t); char *newstr = reinterpret_cast<char *>(malloc(n)); if (!newstr) { free(comm); free(str); return -ENOMEM; } *newstr = AUDIT_LOG_PRIO; strcpy(newstr + 1, comm); free(comm); strcpy(newstr + 1 + l, str); char *msg = newstr; *msg++ = AUDITD_LOG_TAG & 0xFF; *msg++ = (AUDITD_LOG_TAG >> 8) & 0xFF; *msg++ = (AUDITD_LOG_TAG >> 16) & 0xFF; *msg++ = (AUDITD_LOG_TAG >> 24) & 0xFF; *msg++ = EVENT_TYPE_STRING; size_t l = n - sizeof(uint32_t) - sizeof(uint8_t) - sizeof(uint32_t); *msg++ = l & 0xFF; *msg++ = (l >> 8) & 0xFF; *msg++ = (l >> 16) & 0xFF; *msg++ = (l >> 24) & 0xFF; memcpy(msg, str, l); free(str); logbuf->log(AUDIT_LOG_ID, now, uid, pid, tid, newstr, logbuf->log(LOG_ID_EVENTS, now, uid, pid, tid, newstr, (n <= USHRT_MAX) ? (unsigned short) n : USHRT_MAX); reader->notifyNewLog(); Loading
logd/event.logtags 0 → 100644 +36 −0 Original line number Diff line number Diff line # The entries in this file map a sparse set of log tag numbers to tag names. # This is installed on the device, in /system/etc, and parsed by logcat. # # Tag numbers are decimal integers, from 0 to 2^31. (Let's leave the # negative values alone for now.) # # Tag names are one or more ASCII letters and numbers or underscores, i.e. # "[A-Z][a-z][0-9]_". Do not include spaces or punctuation (the former # impacts log readability, the latter makes regex searches more annoying). # # Tag numbers and names are separated by whitespace. Blank lines and lines # starting with '#' are ignored. # # Optionally, after the tag names can be put a description for the value(s) # of the tag. Description are in the format # (<name>|data type[|data unit]) # Multiple values are separated by commas. # # The data type is a number from the following values: # 1: int # 2: long # 3: string # 4: list # # The data unit is a number taken from the following list: # 1: Number of objects # 2: Number of bytes # 3: Number of milliseconds # 4: Number of allocations # 5: Id # 6: Percent # Default value for data of type int/long is 2 (bytes). # # TODO: generate ".java" and ".h" files with integer constants from this file. 1003 auditd (avc|3)