1 /******************************************************************************* 2 * Copyright (c) 2009, 2017 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 v1.0 6 * and Eclipse Distribution License v1.0 which accompany this distribution. 7 * 8 * The Eclipse Public License is available at 9 * http://www.eclipse.org/legal/epl-v10.html 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 #include <stdio.h> 21 #include "Log.h" 22 #include "Thread.h" 23 24 #if defined(NOSTACKTRACE) 25 #define FUNC_ENTRY 26 #define FUNC_ENTRY_NOLOG 27 #define FUNC_ENTRY_MED 28 #define FUNC_ENTRY_MAX 29 #define FUNC_EXIT 30 #define FUNC_EXIT_NOLOG 31 #define FUNC_EXIT_MED 32 #define FUNC_EXIT_MAX 33 #define FUNC_EXIT_RC(x) (void)(x) 34 #define FUNC_EXIT_MED_RC(x) 35 #define FUNC_EXIT_MAX_RC(x) 36 #else 37 #if defined(WIN32) || defined(WIN64) 38 #define inline __inline 39 #define FUNC_ENTRY StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MINIMUM) 40 #define FUNC_ENTRY_NOLOG StackTrace_entry(__FUNCTION__, __LINE__, -1) 41 #define FUNC_ENTRY_MED StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MEDIUM) 42 #define FUNC_ENTRY_MAX StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MAXIMUM) 43 #define FUNC_EXIT StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MINIMUM) 44 #define FUNC_EXIT_NOLOG StackTrace_exit(__FUNCTION__, __LINE__, -1) 45 #define FUNC_EXIT_MED StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MEDIUM) 46 #define FUNC_EXIT_MAX StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MAXIMUM) 47 #define FUNC_EXIT_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MINIMUM) 48 #define FUNC_EXIT_MED_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MEDIUM) 49 #define FUNC_EXIT_MAX_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MAXIMUM) 50 #else 51 #define FUNC_ENTRY StackTrace_entry(__func__, __LINE__, TRACE_MINIMUM) 52 #define FUNC_ENTRY_NOLOG StackTrace_entry(__func__, __LINE__, -1) 53 #define FUNC_ENTRY_MED StackTrace_entry(__func__, __LINE__, TRACE_MEDIUM) 54 #define FUNC_ENTRY_MAX StackTrace_entry(__func__, __LINE__, TRACE_MAXIMUM) 55 #define FUNC_EXIT StackTrace_exit(__func__, __LINE__, NULL, TRACE_MINIMUM) 56 #define FUNC_EXIT_NOLOG StackTrace_exit(__func__, __LINE__, NULL, -1) 57 #define FUNC_EXIT_MED StackTrace_exit(__func__, __LINE__, NULL, TRACE_MEDIUM) 58 #define FUNC_EXIT_MAX StackTrace_exit(__func__, __LINE__, NULL, TRACE_MAXIMUM) 59 #define FUNC_EXIT_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MINIMUM) 60 #define FUNC_EXIT_MED_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MEDIUM) 61 #define FUNC_EXIT_MAX_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MAXIMUM) 62 #endif 63 #endif 64 65 void StackTrace_entry(const char* name, int line, enum LOG_LEVELS trace); 66 void StackTrace_exit(const char* name, int line, void* return_value, enum LOG_LEVELS trace); 67 68 void StackTrace_printStack(FILE* dest); 69 char* StackTrace_get(thread_id_type, char* buf, int bufsize); 70 71 #endif /* STACKTRACE_H_ */ 72