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 }