log.h: LOG_CALLSTACK

This commit is contained in:
Yichao Zhou 2017-04-13 22:06:19 +02:00 committed by Justin M. Keyes
parent ca32eb31b8
commit 5fc775e2ef

View File

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