---
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