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 f302e8f arch/sim: Implement up_backtrace f302e8f is described below commit f302e8fd401d9ff987aab96a91821cb24c250ed8 Author: Xiang Xiao <xiaoxi...@xiaomi.com> AuthorDate: Sat Dec 25 23:28:16 2021 +0800 arch/sim: Implement up_backtrace Signed-off-by: Xiang Xiao <xiaoxi...@xiaomi.com> --- arch/sim/src/Makefile | 6 +++- arch/sim/src/nuttx-names.in | 1 + arch/sim/src/sim/up_assert.c | 16 ++++++--- .../src/sim/{up_host_abort.c => up_backtrace.c} | 38 +++++++++++++--------- .../sim/src/sim/{up_host_abort.c => up_hostmisc.c} | 9 ++++- arch/sim/src/sim/up_internal.h | 3 +- 6 files changed, 50 insertions(+), 23 deletions(-) diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile index f24045c..67d2ae1 100644 --- a/arch/sim/src/Makefile +++ b/arch/sim/src/Makefile @@ -61,6 +61,10 @@ CSRCS += up_heap.c up_uart.c up_assert.c up_puts.c CSRCS += up_copyfullstate.c CSRCS += up_sigdeliver.c +ifeq ($(CONFIG_SCHED_BACKTRACE),y) +CSRCS += up_backtrace.c +endif + ifeq ($(CONFIG_ARCH_HAVE_VFORK),y) ifeq ($(CONFIG_SCHED_WAITPID),y) CSRCS += up_vfork.c @@ -75,7 +79,7 @@ ifeq ($(CONFIG_HOST_MACOS),y) HOSTCFLAGS += -Wno-deprecated-declarations endif -HOSTSRCS = up_hostirq.c up_hostmemory.c up_hosttime.c up_simuart.c up_host_abort.c +HOSTSRCS = up_hostirq.c up_hostmemory.c up_hosttime.c up_simuart.c up_hostmisc.c STDLIBS += -lpthread ifeq ($(CONFIG_HOST_MACOS),y) ifeq ($(CONFIG_LIBCXX),y) diff --git a/arch/sim/src/nuttx-names.in b/arch/sim/src/nuttx-names.in index 3b3629a..24c6725 100644 --- a/arch/sim/src/nuttx-names.in +++ b/arch/sim/src/nuttx-names.in @@ -35,6 +35,7 @@ NXSYMBOLS(abort) NXSYMBOLS(accept) NXSYMBOLS(access) NXSYMBOLS(atexit) +NXSYMBOLS(backtrace) NXSYMBOLS(bind) NXSYMBOLS(calloc) NXSYMBOLS(chmod) diff --git a/arch/sim/src/sim/up_assert.c b/arch/sim/src/sim/up_assert.c index 51526fa..ed96ace 100644 --- a/arch/sim/src/sim/up_assert.c +++ b/arch/sim/src/sim/up_assert.c @@ -73,6 +73,8 @@ void up_assert(const char *filename, int lineno) { + FAR struct tcb_s *rtcb = running_task(); + /* Flush any buffered SYSLOG data (prior to the assertion) */ syslog_flush(); @@ -82,7 +84,7 @@ void up_assert(const char *filename, int lineno) #ifdef CONFIG_SMP #if CONFIG_TASK_NAME_SIZE > 0 _alert("Assertion failed CPU%d at file:%s line: %d task: %s\n", - up_cpu_index(), filename, lineno, running_task()->name); + up_cpu_index(), filename, lineno, rtcb->name); #else _alert("Assertion failed CPU%d at file:%s line: %d\n", up_cpu_index(), filename, lineno); @@ -90,13 +92,19 @@ void up_assert(const char *filename, int lineno) #else #if CONFIG_TASK_NAME_SIZE > 0 _alert("Assertion failed at file:%s line: %d task: %s\n", - filename, lineno, running_task()->name); + filename, lineno, rtcb->name); #else _alert("Assertion failed at file:%s line: %d\n", filename, lineno); #endif #endif + /* Show back trace */ + +#ifdef CONFIG_SCHED_BACKTRACE + sched_dumpstack(rtcb->pid); +#endif + /* Flush any buffered SYSLOG data (from the above) */ syslog_flush(); @@ -104,14 +112,14 @@ void up_assert(const char *filename, int lineno) /* Allow for any board/configuration specific crash information */ #ifdef CONFIG_BOARD_CRASHDUMP - board_crashdump(up_getsp(), running_task(), filename, lineno); + board_crashdump(up_getsp(), rtcb, filename, lineno); #endif /* Flush any buffered SYSLOG data */ syslog_flush(); - if (CURRENT_REGS || (running_task())->flink == NULL) + if (CURRENT_REGS || rtcb->flink == NULL) { /* Exit the simulation */ diff --git a/arch/sim/src/sim/up_host_abort.c b/arch/sim/src/sim/up_backtrace.c similarity index 75% copy from arch/sim/src/sim/up_host_abort.c copy to arch/sim/src/sim/up_backtrace.c index db288d3..fed2dde 100644 --- a/arch/sim/src/sim/up_host_abort.c +++ b/arch/sim/src/sim/up_backtrace.c @@ -1,5 +1,5 @@ /**************************************************************************** - * arch/sim/src/sim/up_host_abort.c + * arch/sim/src/sim/up_backtrace.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -22,7 +22,10 @@ * Included Files ****************************************************************************/ -#include <stdlib.h> +#include <nuttx/arch.h> +#include <sched/sched.h> + +#include <string.h> #include "up_internal.h" @@ -30,20 +33,23 @@ * Public Functions ****************************************************************************/ -/**************************************************************************** - * Name: host_abort - * - * Description: - * Abort the simulation - * - * Input Parameters: - * status - Exit status to set - ****************************************************************************/ - -void host_abort(int status) +int up_backtrace(struct tcb_s *tcb, void **buffer, int size, int skip) { - /* exit the simulation */ + void *buf[skip + size]; + int ret = 0; - exit(status); -} + if (tcb == running_task()) + { + ret = host_backtrace(buf, skip + size); + } + + if (ret <= skip) + { + return ret < 0 ? ret : 0; + } + ret -= skip; + memcpy(buffer, &buf[skip], ret * sizeof(void *)); + + return ret; +} diff --git a/arch/sim/src/sim/up_host_abort.c b/arch/sim/src/sim/up_hostmisc.c similarity index 91% rename from arch/sim/src/sim/up_host_abort.c rename to arch/sim/src/sim/up_hostmisc.c index db288d3..b7747ee 100644 --- a/arch/sim/src/sim/up_host_abort.c +++ b/arch/sim/src/sim/up_hostmisc.c @@ -1,5 +1,5 @@ /**************************************************************************** - * arch/sim/src/sim/up_host_abort.c + * arch/sim/src/sim/up_hostmisc.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -22,6 +22,7 @@ * Included Files ****************************************************************************/ +#include <execinfo.h> #include <stdlib.h> #include "up_internal.h" @@ -47,3 +48,9 @@ void host_abort(int status) exit(status); } +int host_backtrace(void** array, int size) +{ + /* exit the simulation */ + + return backtrace(array, size); +} diff --git a/arch/sim/src/sim/up_internal.h b/arch/sim/src/sim/up_internal.h index c2ae3e2..29da237 100644 --- a/arch/sim/src/sim/up_internal.h +++ b/arch/sim/src/sim/up_internal.h @@ -142,9 +142,10 @@ void up_copyfullstate(uint32_t *dest, uint32_t *src); void *up_doirq(int irq, void *regs); -/* up_head.c ****************************************************************/ +/* up_hostmisc.c ************************************************************/ void host_abort(int status); +int host_backtrace(void** array, int size); /* up_hostmemory.c **********************************************************/