1 /******************************************************************************* 2 * Copyright (c) 2009, 2020 IBM Corp. 3 * 4 * All rights reserved. This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License v2.0 6 * and Eclipse Distribution License v1.0 which accompany this distribution. 7 * 8 * The Eclipse Public License is available at 9 * https://www.eclipse.org/legal/epl-2.0/ 10 * and the Eclipse Distribution License is available at 11 * http://www.eclipse.org/org/documents/edl-v10.php. 12 * 13 * Contributors: 14 * Ian Craggs - initial API and implementation and/or initial documentation 15 *******************************************************************************/ 16 17 #ifndef STACKTRACE_H_ 18 #define STACKTRACE_H_ 19 20 #if defined(HIGH_PERFORMANCE) 21 #define NOSTACKTRACE 1 22 #endif 23 24 #include <stdio.h> 25 #include "Log.h" 26 #include "Thread.h" 27 28 #if defined(NOSTACKTRACE) 29 #define FUNC_ENTRY 30 #define FUNC_ENTRY_NOLOG 31 #define FUNC_ENTRY_MED 32 #define FUNC_ENTRY_MAX 33 #define FUNC_EXIT 34 #define FUNC_EXIT_NOLOG 35 #define FUNC_EXIT_MED 36 #define FUNC_EXIT_MAX 37 #if defined(IOT_CONNECT) || defined(IOT_LITEOS_ADAPT) 38 #define FUNC_EXIT_RC(x) (void)(x) 39 #else 40 #define FUNC_EXIT_RC(x) 41 #endif 42 #define FUNC_EXIT_MED_RC(x) 43 #define FUNC_EXIT_MAX_RC(x) 44 #else 45 #if defined(_WIN32) || defined(_WIN64) 46 #define inline __inline 47 #define FUNC_ENTRY StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MINIMUM) 48 #define FUNC_ENTRY_NOLOG StackTrace_entry(__FUNCTION__, __LINE__, -1) 49 #define FUNC_ENTRY_MED StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MEDIUM) 50 #define FUNC_ENTRY_MAX StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MAXIMUM) 51 #define FUNC_EXIT StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MINIMUM) 52 #define FUNC_EXIT_NOLOG StackTrace_exit(__FUNCTION__, __LINE__, NULL, -1) 53 #define FUNC_EXIT_MED StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MEDIUM) 54 #define FUNC_EXIT_MAX StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MAXIMUM) 55 #define FUNC_EXIT_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MINIMUM) 56 #define FUNC_EXIT_MED_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MEDIUM) 57 #define FUNC_EXIT_MAX_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MAXIMUM) 58 #else 59 #define FUNC_ENTRY StackTrace_entry(__func__, __LINE__, TRACE_MINIMUM) 60 #define FUNC_ENTRY_NOLOG StackTrace_entry(__func__, __LINE__, -1) 61 #define FUNC_ENTRY_MED StackTrace_entry(__func__, __LINE__, TRACE_MEDIUM) 62 #define FUNC_ENTRY_MAX StackTrace_entry(__func__, __LINE__, TRACE_MAXIMUM) 63 #define FUNC_EXIT StackTrace_exit(__func__, __LINE__, NULL, TRACE_MINIMUM) 64 #define FUNC_EXIT_NOLOG StackTrace_exit(__func__, __LINE__, NULL, -1) 65 #define FUNC_EXIT_MED StackTrace_exit(__func__, __LINE__, NULL, TRACE_MEDIUM) 66 #define FUNC_EXIT_MAX StackTrace_exit(__func__, __LINE__, NULL, TRACE_MAXIMUM) 67 #define FUNC_EXIT_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MINIMUM) 68 #define FUNC_EXIT_MED_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MEDIUM) 69 #define FUNC_EXIT_MAX_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MAXIMUM) 70 #endif 71 #endif 72 73 void StackTrace_entry(const char* name, int line, enum LOG_LEVELS trace); 74 void StackTrace_exit(const char* name, int line, void* return_value, enum LOG_LEVELS trace); 75 76 void StackTrace_printStack(FILE* dest); 77 char* StackTrace_get(thread_id_type, char* buf, int bufsize); 78 79 #endif /* STACKTRACE_H_ */ 80