This is an automated email from the ASF dual-hosted git repository. archer pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push: new 20bbdd0 libc: Add backtrace_symbols[_fd] functions 20bbdd0 is described below commit 20bbdd099780bd30558eb120453c720ff6a4f852 Author: Xiang Xiao <xiaoxi...@xiaomi.com> AuthorDate: Fri Dec 24 23:00:37 2021 +0800 libc: Add backtrace_symbols[_fd] functions specified here: https://linux.die.net/man/3/backtrace_symbols Signed-off-by: Xiang Xiao <xiaoxi...@xiaomi.com> --- include/execinfo.h | 3 + libs/libc/misc/Make.defs | 2 +- .../execinfo.h => libs/libc/misc/lib_execinfo.c | 81 ++++++++++++++-------- 3 files changed, 56 insertions(+), 30 deletions(-) diff --git a/include/execinfo.h b/include/execinfo.h index 0f7df07..6380eaf 100644 --- a/include/execinfo.h +++ b/include/execinfo.h @@ -59,6 +59,9 @@ extern "C" #define EXTERN extern #endif +FAR char **backtrace_symbols(FAR void *const *buffer, int size); +void backtrace_symbols_fd(FAR void *const *buffer, int size, int fd); + #undef EXTERN #if defined(__cplusplus) } diff --git a/libs/libc/misc/Make.defs b/libs/libc/misc/Make.defs index 74aea90..5710b7f 100644 --- a/libs/libc/misc/Make.defs +++ b/libs/libc/misc/Make.defs @@ -36,7 +36,7 @@ endif CSRCS += lib_dumpbuffer.c lib_dumpvbuffer.c lib_fnmatch.c lib_debug.c CSRCS += lib_crc64.c lib_crc32.c lib_crc16.c lib_crc8.c lib_crc8ccitt.c -CSRCS += lib_crc8table.c lib_glob.c +CSRCS += lib_crc8table.c lib_glob.c lib_execinfo.c # Keyboard driver encoder/decoder diff --git a/include/execinfo.h b/libs/libc/misc/lib_execinfo.c similarity index 58% copy from include/execinfo.h copy to libs/libc/misc/lib_execinfo.c index 0f7df07..bee7f56 100644 --- a/include/execinfo.h +++ b/libs/libc/misc/lib_execinfo.c @@ -1,5 +1,5 @@ /**************************************************************************** - * include/execinfo.h + * libs/libc/misc/lib_execinfo.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -18,50 +18,73 @@ * ****************************************************************************/ -#ifndef __INCLUDE_EXECINFO_H -#define __INCLUDE_EXECINFO_H - /**************************************************************************** * Included Files ****************************************************************************/ -#include <sys/types.h> -#include <sched.h> +#include <execinfo.h> +#include <stdio.h> + +#include "libc.h" /**************************************************************************** - * Pre-processor Definitions + * Private Functions ****************************************************************************/ -#if defined(CONFIG_SCHED_BACKTRACE) +static FAR char **backtrace_malloc(FAR void *const *buffer, int size) +{ + size_t length = 0; -/* Store up to SIZE return address of the current back trace in - * ARRAY and return the exact number of values stored. - */ + if (size <= 0) + { + return NULL; + } -#define backtrace(buffer, size) sched_backtrace(gettid(), buffer, size) -#define dump_stack() sched_dumpstack(gettid()) + while (size-- > 0) + { + int ret = sprintf(NULL, "%pS", *buffer++); + if (ret < 0) + { + return NULL; + } -#else -# define backtrace(buffer, size) 0 -# define dump_stack() -#endif + length += sizeof(FAR char *) + ret + 1; + } + + return lib_malloc(length); +} /**************************************************************************** - * Public Function Prototypes + * Public Functions ****************************************************************************/ -#undef EXTERN -#if defined(__cplusplus) -#define EXTERN extern "C" -extern "C" +FAR char **backtrace_symbols(FAR void *const *buffer, int size) { -#else -#define EXTERN extern -#endif + FAR char **syms; + FAR char *buf; + int i; -#undef EXTERN -#if defined(__cplusplus) + syms = backtrace_malloc(buffer, size); + if (syms != NULL) + { + buf = syms[size]; + for (i = 0; i < size; i++) + { + syms[i] = buf; + buf += sprintf(buf, "%pS", buffer[i]); + buf += 1; + } + } + + return syms; } -#endif -#endif /* __INCLUDE_EXECINFO_H */ +void backtrace_symbols_fd(FAR void *const *buffer, int size, int fd) +{ + int i; + + for (i = 0; i < size; i++) + { + dprintf(fd, "%pS\n", buffer[i]); + } +}