aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/log.h24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/nvim/log.h b/src/nvim/log.h
index 221f0bbaf6..48be7606e7 100644
--- a/src/nvim/log.h
+++ b/src/nvim/log.h
@@ -61,6 +61,30 @@
__VA_ARGS__)
#endif
+#if defined(__linux__)
+# include <execinfo.h>
+# define LOG_CALLSTACK(prefix) \
+ do { \
+ void *trace[100]; \
+ int trace_size = backtrace(trace, 100); \
+ \
+ char exe[1024]; \
+ ssize_t elen = readlink("/proc/self/exe", exe, sizeof(exe) - 1); \
+ exe[elen] = 0; \
+ \
+ for (int i = 1; i < trace_size; i++) { \
+ char buf[256]; \
+ snprintf(buf, sizeof(buf), "addr2line -e %s -f -p %p", exe, trace[i]); \
+ FILE *fp = popen(buf, "r"); \
+ while (fgets(buf, sizeof(buf) - 1, fp) != NULL) { \
+ buf[strlen(buf)-1] = 0; \
+ do_log(DEBUG_LOG_LEVEL, __func__, __LINE__, true, prefix "%s", buf); \
+ } \
+ fclose(fp); \
+ } \
+ } while (0)
+#endif
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "log.h.generated.h"
#endif