diff options
Diffstat (limited to 'src/log.c')
-rwxr-xr-x | src/log.c | 118 |
1 files changed, 5 insertions, 113 deletions
@@ -23,15 +23,14 @@ #include <config.h> #endif -#define _GNU_SOURCE #include <stdio.h> #include <unistd.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> #include <syslog.h> -#include <execinfo.h> #include <dlfcn.h> +#include <signal.h> #include "connman.h" @@ -175,6 +174,9 @@ void __connman_log_s(int log_priority, const char *format, ...) } #endif +/* This makes sure we always have a __debug section. */ +CONNMAN_DEBUG_DEFINE(dummy); + /** * connman_info: * @format: format string @@ -227,7 +229,6 @@ void connman_error(const char *format, ...) vsyslog(LOG_ERR, format, ap); va_end(ap); - fflush(log_file); } /** @@ -246,122 +247,13 @@ void connman_debug(const char *format, ...) vsyslog(LOG_DEBUG, format, ap); va_end(ap); - fflush(log_file); -} - -static void print_backtrace(unsigned int offset) -{ - void *frames[99]; - size_t n_ptrs; - unsigned int i; - int outfd[2], infd[2]; - int pathlen; - pid_t pid; - - if (!program_exec) - return; - - pathlen = strlen(program_path); - - n_ptrs = backtrace(frames, G_N_ELEMENTS(frames)); - if (n_ptrs < offset) - return; - - if (pipe(outfd) < 0) - return; - - if (pipe(infd) < 0) { - close(outfd[0]); - close(outfd[1]); - return; - } - - pid = fork(); - if (pid < 0) { - close(outfd[0]); - close(outfd[1]); - close(infd[0]); - close(infd[1]); - return; - } - - if (pid == 0) { - close(outfd[1]); - close(infd[0]); - - dup2(outfd[0], STDIN_FILENO); - dup2(infd[1], STDOUT_FILENO); - - execlp("addr2line", "-C", "-f", "-e", program_exec, NULL); - - exit(EXIT_FAILURE); - } - - close(outfd[0]); - close(infd[1]); - - connman_error("++++++++ backtrace ++++++++"); - - for (i = offset; i < n_ptrs - 1; i++) { - Dl_info info; - char addr[20], buf[PATH_MAX * 2]; - int len, written; - char *ptr, *pos; - - dladdr(frames[i], &info); - - len = snprintf(addr, sizeof(addr), "%p\n", frames[i]); - if (len < 0) - break; - - written = write(outfd[1], addr, len); - if (written < 0) - break; - - len = read(infd[0], buf, sizeof(buf) - 1); - if (len < 0) - break; - - buf[len] = '\0'; - - pos = strchr(buf, '\n'); -#if defined TIZEN_EXT - if (pos) { -#endif - *pos++ = '\0'; - - if (strcmp(buf, "??") == 0) { - connman_error("#%-2u %p in %s", i - offset, - frames[i], info.dli_fname); - continue; - } - - ptr = strchr(pos, '\n'); - *ptr++ = '\0'; - - if (strncmp(pos, program_path, pathlen) == 0) - pos += pathlen + 1; - - connman_error("#%-2u %p in %s() at %s", i - offset, - frames[i], buf, pos); -#if defined TIZEN_EXT - } -#endif - } - - connman_error("+++++++++++++++++++++++++++"); - - kill(pid, SIGTERM); - - close(outfd[1]); - close(infd[0]); } static void signal_handler(int signo) { connman_error("Aborting (signal %d) [%s]", signo, program_exec); - print_backtrace(2); + print_backtrace(program_path, program_exec, 2); exit(EXIT_FAILURE); } |