Hi Hans

Ack

Thanks
Gary

On 16/5/18, 5:27 pm, "Hans Nordeback" <[email protected]> wrote:

    ---
     src/base/daemon.c               | 52 ++++++++++++++++++++++++++++++---
     tools/cluster_sim_uml/build_uml |  1 +
     2 files changed, 49 insertions(+), 4 deletions(-)
    
    diff --git a/src/base/daemon.c b/src/base/daemon.c
    index 361dd8dd6..2ad0dcd2d 100644
    --- a/src/base/daemon.c
    +++ b/src/base/daemon.c
    @@ -608,14 +608,18 @@ static void fatal_signal_handler(int sig, siginfo_t 
*siginfo, void *ctx)
        const int BT_ARRAY_SIZE = 20;
        void *bt_array[BT_ARRAY_SIZE];
        size_t bt_size;
    -   int fd;
        char bt_header[40];
    +   char cmd_buf[200];
    +   char addr2line_buf[120];
    +   Dl_info dl_info;
    +   FILE *fp;
     
    -   if ((fd = open(bt_filename, O_RDWR | O_CREAT, 0644)) < 0) {
    +   int fd = open(bt_filename, O_RDWR | O_CREAT, 0644);
    +
    +   if (fd < 0)
                goto done;
    -   }
     
    -   snprintf(bt_header, sizeof(bt_header), "signal: %d pid: %u uid: %u\n",
    +   snprintf(bt_header, sizeof(bt_header), "signal: %d pid: %u uid: %u\n\n",
                 sig, siginfo->si_pid, siginfo->si_uid);
     
        if (write(fd, bt_header, strlen(bt_header)) < 0) {
    @@ -624,6 +628,45 @@ static void fatal_signal_handler(int sig, siginfo_t 
*siginfo, void *ctx)
        }
     
        bt_size = plibc_backtrace(bt_array, BT_ARRAY_SIZE);
    +
    +   if (system("which addr2line") == 0) {
    +           for (int i = 0; i < bt_size; ++i) {
    +                   memset(&dl_info, 0, sizeof(dl_info));
    +                   dladdr(bt_array[i], &dl_info);
    +                   ptrdiff_t offset = bt_array[i] - dl_info.dli_fbase;
    +
    +                   snprintf(cmd_buf, sizeof(cmd_buf),
    +                            "addr2line %tx -p -f -e %s",
    +                            offset, dl_info.dli_fname);
    +
    +                   fp = popen(cmd_buf, "r");
    +                   if (fp == NULL) {
    +                           syslog(LOG_ERR,
    +                                  "popen failed: %s", strerror(errno));
    +                   } else {
    +                           if (fgets(addr2line_buf,
    +                                     sizeof(addr2line_buf),
    +                                     fp) != NULL) {
    +                                   snprintf(cmd_buf, sizeof(cmd_buf),
    +                                            "# %d %s",
    +                                            i, addr2line_buf);
    +                                   if (write(fd, cmd_buf,
    +                                             strlen(cmd_buf)) < 0) {
    +                                           syslog(LOG_ERR,
    +                                                  "write failed: %s",
    +                                                  strerror(errno));
    +                                   }
    +                           }
    +                           pclose(fp);
    +                   }
    +           }
    +   }
    +
    +   if (write(fd, "\n", 1) < 0) {
    +           syslog(LOG_ERR,
    +                  "write failed: %s", strerror(errno));
    +   }
    +
        plibc_backtrace_symbols_fd(bt_array, bt_size, fd);
     
        close(fd);
    @@ -677,6 +720,7 @@ static void install_fatal_signal_handlers(void)
                         time_string, getpid());
     
                struct sigaction action;
    +
                memset(&action, 0, sizeof(action));
                action.sa_sigaction = fatal_signal_handler;
                sigfillset(&action.sa_mask);
    diff --git a/tools/cluster_sim_uml/build_uml 
b/tools/cluster_sim_uml/build_uml
    index b9f224360..16d49d03e 100755
    --- a/tools/cluster_sim_uml/build_uml
    +++ b/tools/cluster_sim_uml/build_uml
    @@ -176,6 +176,7 @@ cmd_create_rootfs()
         test -e /usr/bin/lsof && install /usr/bin/lsof usr/bin
         test -e /bin/pidof && install /bin/pidof usr/bin
         test -e /usr/sbin/tcpdump && install /usr/sbin/tcpdump usr/sbin
    +    test -e /usr/bin/addr2line && install /usr/bin/addr2line usr/bin
         if test -e /usr/bin/gdb; then
        install /usr/bin/gdb usr/bin
        if test -d /usr/share/gdb; then
    -- 
    2.17.0
    
    



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to