[Tizen] Print backtrace when an exception occurs
[platform/core/uifw/dali-core.git] / dali / public-api / common / dali-common.cpp
index c2c16cc..218f084 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 // EXTERNAL INCLUDES
 #include <stdlib.h>
-#include <string>
 #include <cstdio>
+#include <string>
 
-#ifndef EMSCRIPTEN // cxxabi not supported
-# include <execinfo.h>
-# include <cxxabi.h>
-#endif
+#define BACKTRACE_ENABLED
 
+#if defined(BACKTRACE_ENABLED)
+#if defined(__GLIBC__)
+#include <execinfo.h>
+#endif
+#include <cxxabi.h>
+#endif
 #include <cstring>
 
 // INTERNAL INCLUDES
 
 namespace Dali
 {
-
 #if defined(BACKTRACE_ENABLED)
 
 namespace
 {
-const int MAX_NUM_STACK_FRAMES = 25;
+const int32_t MAX_NUM_STACK_FRAMES = 25;
 }
 
 std::string Demangle(const char* symbol)
@@ -53,9 +55,9 @@ std::string Demangle(const char* symbol)
   if(openParen != NULL)
   {
     const char* startOfToken = openParen + 1;
-    const char* plus = strchr(startOfToken, '+');
-    const char* closeParen = strchr(startOfToken, ')');
-    const char* endOfToken = NULL;
+    const char* plus         = strchr(startOfToken, '+');
+    const char* closeParen   = strchr(startOfToken, ')');
+    const char* endOfToken   = NULL;
     if(plus != NULL)
     {
       endOfToken = plus;
@@ -69,17 +71,17 @@ std::string Demangle(const char* symbol)
       size_t tokenLength = endOfToken - startOfToken;
 
       // Allocate space for symbol
-      char *mangledSymbol = (char*)malloc(tokenLength+1u);
+      char* mangledSymbol = reinterpret_cast<char*>(malloc(tokenLength + 1u));
       if(mangledSymbol != NULL)
       {
         strncpy(mangledSymbol, startOfToken, tokenLength);
         mangledSymbol[tokenLength] = '\0';
 
-        size_t size;
-        int    status;
-        char*  demangled=NULL;
-        demangled = abi::__cxa_demangle( mangledSymbol, NULL, &size, &status );
-        if( demangled != NULL )
+        size_t  size;
+        int32_t status;
+        char*   demangled = NULL;
+        demangled         = abi::__cxa_demangle(mangledSymbol, NULL, &size, &status);
+        if(demangled != NULL)
         {
           result = demangled;
           free(demangled); // demangle() allocates returned string, so free it
@@ -96,8 +98,9 @@ std::string Demangle(const char* symbol)
   return result;
 }
 
-DALI_EXPORT_API DaliException::DaliException( const char* location, const char* condition )
-: location( location ), condition( condition )
+DALI_CORE_API DaliException::DaliException(const char* location, const char* condition)
+: location(location),
+  condition(condition)
 {
   // Note, if a memory error has occured, then the backtrace won't work - backtrace_symbols relies on
   // allocating memory.
@@ -107,45 +110,44 @@ DALI_EXPORT_API DaliException::DaliException( const char* location, const char*
 #if defined(DEBUG_ENABLED)
   fprintf(stderr, "Exception: \n%s\n thrown at %s\nSee dlog for backtrace\n", condition, location);
 #else
-  fprintf(stderr, "Exception: \n%s\n thrown\nSee dlog for backtrace\n", condition );
+  fprintf(stderr, "Exception: \n%s\n thrown\nSee dlog for backtrace\n", condition);
 #endif
 
   DALI_LOG_ERROR_NOFN("Backtrace:\n");
 
-  void* frameArray[MAX_NUM_STACK_FRAMES];
-  int nSize = backtrace(frameArray, MAX_NUM_STACK_FRAMES);
-  char** symbols = backtrace_symbols(frameArray, nSize);
-  for(int i=1; i< nSize; i++)
+  void*   frameArray[MAX_NUM_STACK_FRAMES];
+  int32_t nSize   = backtrace(frameArray, MAX_NUM_STACK_FRAMES);
+  char**  symbols = backtrace_symbols(frameArray, nSize);
+  for(int32_t i = 1; i < nSize; i++)
   {
     std::string demangled_symbol = Demangle(symbols[i]);
-    DALI_LOG_ERROR_NOFN("[%02d]   %s\n", i, demangled_symbol.c_str() );
+    DALI_LOG_ERROR_NOFN("[%02d]   %s\n", i, demangled_symbol.c_str());
   }
   free(symbols);
 }
 
-
 #else // BACKTRACE_ENABLED
 
-DALI_EXPORT_API DaliException::DaliException( const char* location, const char* condition )
-: location( location ), condition( condition )
+DALI_CORE_API DaliException::DaliException(const char* location, const char* condition)
+: location(location),
+  condition(condition)
 {
 #if defined(DEBUG_ENABLED)
-  printf("Exception: \n%s\n thrown at %s\n", condition, location );
+  printf("Exception: \n%s\n thrown at %s\n", condition, location);
 #else
-  printf("Exception: \n%s\n thrown\n", condition );
+  printf("Exception: \n%s\n thrown\n", condition);
 #endif
 }
 
-
 #endif // BACKTRACE_ENABLED
 
-DALI_EXPORT_API void DaliAssertMessage( const char* location, const char* condition )
+DALI_CORE_API void DaliAssertMessage(const char* location, const char* condition)
 {
 #if defined(DEBUG_ENABLED)
-  DALI_LOG_ERROR_NOFN( "Assert (%s) failed in: %s\n", condition, location );
+  DALI_LOG_ERROR_NOFN("Assert (%s) failed in: %s\n", condition, location);
 #else
-  DALI_LOG_ERROR_NOFN( "Assert (%s) failed\n", condition );
+  DALI_LOG_ERROR_NOFN("Assert (%s) failed\n", condition);
 #endif
 }
 
-} // Dali
+} // namespace Dali