File indexing completed on 2024-05-12 15:56:57
0001 /* 0002 * SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 #include "kis_debug.h" 0007 0008 #include "config-debug.h" 0009 0010 #if HAVE_BACKTRACE 0011 #include <execinfo.h> 0012 #ifdef __GNUC__ 0013 #define HAVE_BACKTRACE_DEMANGLE 0014 #include <cxxabi.h> 0015 #endif 0016 #endif 0017 0018 #include <string> 0019 0020 0021 #if HAVE_BACKTRACE 0022 static QString maybeDemangledName(char *name) 0023 { 0024 #ifdef HAVE_BACKTRACE_DEMANGLE 0025 const int len = strlen(name); 0026 QByteArray in = QByteArray::fromRawData(name, len); 0027 const int mangledNameStart = in.indexOf("(_"); 0028 if (mangledNameStart >= 0) { 0029 const int mangledNameEnd = in.indexOf('+', mangledNameStart + 2); 0030 if (mangledNameEnd >= 0) { 0031 int status; 0032 // if we forget about this line and the one that undoes its effect we don't change the 0033 // internal data of the QByteArray::fromRawData() ;) 0034 name[mangledNameEnd] = 0; 0035 char *demangled = abi::__cxa_demangle(name + mangledNameStart + 1, 0, 0, &status); 0036 name[mangledNameEnd] = '+'; 0037 if (demangled) { 0038 QString ret = QString::fromLatin1(name, mangledNameStart + 1) + 0039 QString::fromLatin1(demangled) + 0040 QString::fromLatin1(name + mangledNameEnd, len - mangledNameEnd); 0041 free(demangled); 0042 return ret; 0043 } 0044 } 0045 } 0046 #endif 0047 return QString::fromLatin1(name); 0048 } 0049 #endif 0050 0051 QString kisBacktrace() 0052 { 0053 QString s; 0054 #if HAVE_BACKTRACE 0055 void *trace[256]; 0056 int n = backtrace(trace, 256); 0057 if (!n) { 0058 return s; 0059 } 0060 char **strings = backtrace_symbols(trace, n); 0061 0062 s = QLatin1String("[\n"); 0063 0064 for (int i = 0; i < n; ++i) 0065 s += QLatin1String("\t") + QString::number(i) + QLatin1String(": ") + 0066 maybeDemangledName(strings[i]) + QLatin1Char('\n'); 0067 s += QLatin1String("]\n"); 0068 free(strings); 0069 #endif 0070 return s; 0071 } 0072 0073 Q_LOGGING_CATEGORY(_30009, "krita.lib.resources", QtInfoMsg) 0074 Q_LOGGING_CATEGORY(_41000, "krita.general", QtInfoMsg) 0075 Q_LOGGING_CATEGORY(_41001, "krita.core", QtInfoMsg) 0076 Q_LOGGING_CATEGORY(_41002, "krita.registry", QtInfoMsg) 0077 Q_LOGGING_CATEGORY(_41003, "krita.tools", QtInfoMsg) 0078 Q_LOGGING_CATEGORY(_41004, "krita.tiles", QtInfoMsg) 0079 Q_LOGGING_CATEGORY(_41005, "krita.filters", QtInfoMsg) 0080 Q_LOGGING_CATEGORY(_41006, "krita.plugins", QtInfoMsg) 0081 Q_LOGGING_CATEGORY(_41007, "krita.ui", QtInfoMsg) 0082 Q_LOGGING_CATEGORY(_41008, "krita.file", QtInfoMsg) 0083 Q_LOGGING_CATEGORY(_41009, "krita.math", QtInfoMsg) 0084 Q_LOGGING_CATEGORY(_41010, "krita.render", QtInfoMsg) 0085 Q_LOGGING_CATEGORY(_41011, "krita.scripting", QtInfoMsg) 0086 Q_LOGGING_CATEGORY(_41012, "krita.input", QtInfoMsg) 0087 Q_LOGGING_CATEGORY(_41013, "krita.action", QtInfoMsg) 0088 Q_LOGGING_CATEGORY(_41014, "krita.tabletlog", QtDebugMsg) 0089 Q_LOGGING_CATEGORY(_41015, "krita.opengl", QtInfoMsg) 0090 Q_LOGGING_CATEGORY(_41016, "krita.metadata", QtInfoMsg) 0091 Q_LOGGING_CATEGORY(_41017, "krita.android", QtDebugMsg) 0092 Q_LOGGING_CATEGORY(_41018, "krita.locale", QtInfoMsg) 0093 0094 QString __methodName(const char *_prettyFunction) 0095 { 0096 std::string prettyFunction(_prettyFunction); 0097 0098 size_t colons = prettyFunction.find("::"); 0099 size_t begin = prettyFunction.substr(0,colons).rfind(" ") + 1; 0100 size_t end = prettyFunction.rfind("(") - begin; 0101 0102 return QString(std::string(prettyFunction.substr(begin,end) + "()").c_str()); 0103 }