2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://floralicense.org/license/
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 #include <dali/public-api/common/dali-common.h>
26 #ifndef EMSCRIPTEN // cxxabi not supported
33 #include <dali/integration-api/debug.h>
37 const int MAX_NUM_STACK_FRAMES = 25;
38 const size_t C_SYMBOL_LENGTH = 4096;
46 std::string Demangle(const char* symbol)
50 // backtrace ::= <filename>'('['_'<mangled-symbol>'_']['+'<offset>]')'
51 // Only want <mangled-symbol>:
52 const char* openParen = strchr(symbol, '(');
55 const char* startOfToken = openParen + 1;
56 const char* plus = strchr(startOfToken, '+');
57 const char* closeParen = strchr(startOfToken, ')');
58 const char* endOfToken = NULL;
63 else if(closeParen != NULL)
65 endOfToken = closeParen;
67 if(endOfToken != NULL)
69 size_t tokenLength = endOfToken - startOfToken;
71 // Allocate space for symbol
72 char *mangledSymbol = (char*)malloc(tokenLength+1u);
73 strncpy(mangledSymbol, startOfToken, tokenLength);
74 mangledSymbol[tokenLength] = '\0';
79 demangled = abi::__cxa_demangle( mangledSymbol, NULL, &size, &status );
80 if( demangled != NULL )
83 free(demangled); // demangle() allocates returned string, so free it
100 DALI_EXPORT_API DaliException::DaliException(const char *location, const char* condition)
101 : mLocation(location), mCondition(condition)
103 // Note, if a memory error has occured, then the backtrace won't work - backtrace_symbols relies on
104 // allocating memory.
106 // Initial dlog error message is output in DALI_ASSERT_ALWAYS macro
107 // Also output on stderr
108 fprintf(stderr, "Exception: \n%s\n thrown at %s\nSee dlog for backtrace\n", mCondition.c_str(), mLocation.c_str());
110 DALI_LOG_ERROR_NOFN("Backtrace:\n");
112 void* frameArray[MAX_NUM_STACK_FRAMES];
113 int nSize = backtrace(frameArray, MAX_NUM_STACK_FRAMES);
114 char** symbols = backtrace_symbols(frameArray, nSize);
115 for(int i=1; i< nSize; i++)
117 std::string demangled_symbol = Demangle(symbols[i]);
118 DALI_LOG_ERROR_NOFN("[%02d] %s\n", i, demangled_symbol.c_str() );
125 DALI_EXPORT_API DaliException::DaliException(const char *location, const char* condition)
126 : mLocation(location), mCondition(condition)
128 printf("Exception: \n%s\n thrown at %s\nSee dlog for backtrace\n", mCondition.c_str(), mLocation.c_str());
133 DALI_EXPORT_API void DaliAssertMessage(const char* condition, const char* file, int line)
135 DALI_LOG_ERROR_NOFN( "Assertion (%s) failed in: %s:%d\n", condition, file, line );