summaryrefslogtreecommitdiffstats
path: root/lib/log.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/log.c')
-rw-r--r--lib/log.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/log.c b/lib/log.c
index f9f9766e..0a3a7fc1 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -312,7 +312,7 @@ zlog_signal(int signo, const char *action, siginfo_t *siginfo,
}
#undef DUMP
- zlog_backtrace_sigsafe(PRI);
+ zlog_backtrace_sigsafe(PRI, program_counter);
#undef PRI
#undef LOC
}
@@ -320,9 +320,10 @@ zlog_signal(int signo, const char *action, siginfo_t *siginfo,
/* Log a backtrace using only async-signal-safe functions.
Needs to be enhanced to support syslog logging. */
void
-zlog_backtrace_sigsafe(int priority)
+zlog_backtrace_sigsafe(int priority, void *program_counter)
{
#ifdef HAVE_GLIBC_BACKTRACE
+ static const char pclabel[] = "Program counter: ";
void *array[20];
int size;
char buf[100];
@@ -338,6 +339,11 @@ zlog_backtrace_sigsafe(int priority)
s = str_append(LOC," stack frames:\n");
#define DUMP(FP) { \
+ if (program_counter) \
+ { \
+ write(fileno(FP),pclabel,sizeof(pclabel)-1); \
+ backtrace_symbols_fd(&program_counter, 1, fileno(FP)); \
+ } \
write(fileno(FP),buf,s-buf); \
backtrace_symbols_fd(array, size, fileno(FP)); \
}