diff --git a/lib/include/srslte/common/backtrace.h b/lib/include/srslte/common/backtrace.h new file mode 100644 index 000000000..63537e332 --- /dev/null +++ b/lib/include/srslte/common/backtrace.h @@ -0,0 +1,45 @@ +/* + * Copyright 2013-2019 Software Radio Systems Limited + * + * This file is part of srsLTE. + * + * srsLTE is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * srsLTE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * A copy of the GNU Affero General Public License can be found in + * the LICENSE file in the top-level directory of this distribution + * and at http://www.gnu.org/licenses/. + * + */ + +/****************************************************************************** + * File: backtrace.h + * + * Description: print backtrace in runtime. + * + * Reference: + *****************************************************************************/ + +#ifndef SRSLTE_BACKTRACE_H +#define SRSLTE_BACKTRACE_H + +#include "srslte/config.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +SRSLTE_API void srslte_backtrace_print(FILE* f); + +#ifdef __cplusplus +} +#endif // __cplusplus +#endif // SRSLTE_BACKTRACE_H diff --git a/lib/src/common/backtrace.c b/lib/src/common/backtrace.c new file mode 100644 index 000000000..6d5890b92 --- /dev/null +++ b/lib/src/common/backtrace.c @@ -0,0 +1,39 @@ +/* + * Copyright 2013-2019 Software Radio Systems Limited + * + * This file is part of srsLTE. + * + * srsLTE is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * srsLTE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * A copy of the GNU Affero General Public License can be found in + * the LICENSE file in the top-level directory of this distribution + * and at http://www.gnu.org/licenses/. + * + */ +#include +#include + +void srslte_backtrace_print(FILE* f) +{ + void* array[128] = {}; + int size = 0; + + if (f) { + // Get all stack traces + size = backtrace(array, 128); + + char** symbols = backtrace_symbols(array, size); + + for (int i = 1; i < size; i++) { + fprintf(f, "\t%s\n", symbols[i]); + } + } +} diff --git a/lib/src/common/crash_handler.c b/lib/src/common/crash_handler.c index 071b95a0c..32a256e63 100644 --- a/lib/src/common/crash_handler.c +++ b/lib/src/common/crash_handler.c @@ -21,31 +21,22 @@ #include #include -#include #include #include -#include "srslte/version.h" +#include "srslte/common/backtrace.h" #include "srslte/common/crash_handler.h" +#include "srslte/version.h" const static char crash_file_name[] = "./srsLTE.backtrace.crash"; static int bt_argc; static char **bt_argv; static void crash_handler(int sig) { - void *array[128]; - int size; - - - /* Get all stack traces */ - size = backtrace(array, 128); - FILE *f = fopen(crash_file_name, "a"); if (!f) { printf("srsLTE crashed... we could not save backtrace in '%s'...\n", crash_file_name); } else { - char **symbols = backtrace_symbols(array, size); - time_t lnTime; struct tm *stTime; char strdate[32]; @@ -61,9 +52,7 @@ static void crash_handler(int sig) { } fprintf(f, "' version=%s signal=%d date='%s' ---\n", SRSLTE_VERSION_STRING, sig, strdate); - for (int i = 0; i < size; i++) { - fprintf(f, "\t%s\n", symbols[i]); - } + srslte_backtrace_print(f); fprintf(f, "\n"); printf("srsLTE crashed... backtrace saved in '%s'...\n", crash_file_name);