trace: initial import of a stack backtrace function for native

Sometimes the debugger just isn't fast enough to debug that pesky race
conditions. This module provides at least a little help.
This commit is contained in:
Martine Lenders 2017-06-16 13:30:59 +02:00 committed by Martine Lenders
parent 565341c9fd
commit 875a5c165d
4 changed files with 88 additions and 0 deletions

View File

@ -22,6 +22,9 @@ endif
ifneq (,$(filter can_linux,$(USEMODULE)))
DIRS += can
endif
ifneq (,$(filter trace,$(USEMODULE)))
DIRS += trace
endif
include $(RIOTBASE)/Makefile.base

View File

@ -0,0 +1,49 @@
/*
* Copyright (C) 2017 Freie Universität Berlin
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @defgroup trace Stack traceback (only under native)
* @ingroup core_util
* @brief Address-trace back.
*
* If you call the @ref trace_print() function a stack traceback of all return
* addresses up to @ref TRACE_SIZE will be printed from the point of execution.
*
* @{
*
* @file
* @brief
*
* @author Martine Lenders <m.lenders@fu-berlin.de>
*/
#ifndef TRACE_H
#define TRACE_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Maximum number of return addresses to print
*/
#ifndef TRACE_SIZE
#define TRACE_SIZE (4U)
#endif
/**
* @brief Print the last @ref TRACE_SIZE return addresses from call of this
* function
*/
void trace_print(void);
#ifdef __cplusplus
}
#endif
#endif /* TRACE_H */
/** @} */

View File

@ -0,0 +1 @@
include $(RIOTBASE)/Makefile.base

35
cpu/native/trace/trace.c Normal file
View File

@ -0,0 +1,35 @@
/*
* Copyright (C) 2017 Freie Universität Berlin
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @{
*
* @file
* @author Martine Lenders <m.lenders@fu-berlin.de>
*/
#include <execinfo.h>
#include <stddef.h>
#include <stdio.h>
#include "trace.h"
void trace_print(void)
{
void *array[TRACE_SIZE + 1];
size_t size;
size = backtrace(array, TRACE_SIZE + 1);
/* skip above line's return address and start with 1 */
for (size_t i = 1; i < size; i++) {
printf("%p\n", array[i]);
}
}
/** @} */