Hi
Here is a REALLY simple blackbox.
Qu: Do we need to store the timestamp? I don't have one in there
yet as I didn't want to use up memory more than I had to.
To extract the blackbox load your core file in gdb and:
set print array on
print blackbox
Simple.
The next thing I want to do is separately keep info on the last X (100)
messages sent or received.
-Info like where it came from, where it's going and it's size.
>From this we could also keep counters like:
-number of TX/RX messages per service
-number of resent/dropped messages, etc...
Any other ideas?
Regards
Angus
diff --git a/exec/logsys.c b/exec/logsys.c
index c919d6f..14e0cf8 100644
--- a/exec/logsys.c
+++ b/exec/logsys.c
@@ -86,12 +86,21 @@ struct logsys_logger logsys_loggers[MAX_LOGGERS];
int logsys_single_id = 0;
+#define MAX_LOG_LENGTH 128
+
+#ifndef MAX_BLACKBOX_LOGS
+#define MAX_BLACKBOX_LOGS 1024
+#endif /* MAX_BLACKBOX_LOG */
+
+static int blackbox_pos = 0;
+static char blackbox[MAX_BLACKBOX_LOGS][MAX_LOG_LENGTH];
+
struct log_entry {
char *file;
int line;
int priority;
- char str[128];
+ char str[MAX_LOG_LENGTH];
struct log_entry *next;
};
@@ -402,6 +411,46 @@ drop_log_msg:
}
}
+/*
+ * save the log to the blackbox
+ */
+static void _blackbox_printf (
+ enum logsys_config_mutex_state config_mutex_state,
+ char *file,
+ int line,
+ char *format,
+ va_list ap)
+{
+ char *p = NULL;
+ char newfmt[MAX_LOG_LENGTH];
+
+ if (config_mutex_state == LOGSYS_CONFIG_MUTEX_UNLOCKED) {
+ pthread_mutex_lock (&logsys_config_mutex);
+ }
+ pthread_mutex_lock (&logsys_new_log_mutex);
+
+ p = strrchr(file, '/');
+ if (p)
+ file = ++p;
+
+ snprintf (newfmt, MAX_LOG_LENGTH, "[%s:%04u] %s", file, line, format);
+ vsnprintf (&blackbox[blackbox_pos], MAX_LOG_LENGTH, newfmt, ap);
+
+ if (blackbox_pos >= (MAX_BLACKBOX_LOGS - 1)) {
+ blackbox_pos = 0;
+ } else {
+ blackbox_pos++;
+ }
+ sprintf(&blackbox[blackbox_pos], "*** END OF BLACK BOX ***");
+
+ pthread_mutex_unlock (&logsys_new_log_mutex);
+ if (config_mutex_state == LOGSYS_CONFIG_MUTEX_UNLOCKED) {
+ pthread_mutex_unlock (&logsys_config_mutex);
+ }
+ return;
+
+}
+
unsigned int _logsys_subsys_create (
const char *subsys,
unsigned int priority)
@@ -532,6 +581,10 @@ void logsys_log_printf (
assert (id < MAX_LOGGERS);
+ va_start (ap, format);
+ _blackbox_printf (LOGSYS_CONFIG_MUTEX_UNLOCKED, file, line, format, ap);
+ va_end(ap);
+
if (LOG_LEVEL(priority) > logsys_loggers[id].priority) {
return;
}
@@ -555,6 +608,10 @@ static void logsys_log_printf_locked (
assert (id < MAX_LOGGERS);
+ va_start (ap, format);
+ _blackbox_printf (LOGSYS_CONFIG_MUTEX_LOCKED, file, line, format, ap);
+ va_end(ap);
+
if (LOG_LEVEL(priority) > logsys_loggers[id].priority) {
return;
}
@@ -577,6 +634,7 @@ void _logsys_log_printf2 (
assert (id < MAX_LOGGERS);
va_start (ap, format);
+ _blackbox_printf (LOGSYS_CONFIG_MUTEX_UNLOCKED, file, line, format, ap);
_log_printf (LOGSYS_CONFIG_MUTEX_UNLOCKED, file, line, priority, id,
format, ap);
va_end(ap);
@@ -584,13 +642,16 @@ void _logsys_log_printf2 (
void _logsys_trace (char *file, int line, int tag, int id, char *format, ...)
{
+ va_list ap;
assert (id < MAX_LOGGERS);
pthread_mutex_lock (&logsys_config_mutex);
- if (tag & logsys_loggers[id].tags) {
- va_list ap;
+ va_start (ap, format);
+ _blackbox_printf (LOGSYS_CONFIG_MUTEX_LOCKED, file, line, format, ap);
+ va_end(ap);
+ if (tag & logsys_loggers[id].tags) {
va_start (ap, format);
_log_printf (LOGSYS_CONFIG_MUTEX_LOCKED, file, line,
LOG_LEVEL_DEBUG, id, format, ap);
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais