--- src/corelib/kernel/orig.qobject.cpp 2014-04-10 20:37:11.000000000 +0200 +++ src/corelib/kernel/qobject.cpp 2014-12-09 00:43:41.000000000 +0100 @@ -1597,12 +1597,83 @@ \sa timerEvent(), killTimer(), QTimer::singleShot() */ +#include +#include +#include + +static QString maybeDemangledName(char *name) +{ + const int len = strlen(name); + QByteArray in = QByteArray::fromRawData(name, len); +#ifdef Q_OS_MAC + const int mangledNameStart = in.indexOf(" _"), startOffset = 1; +#elif defined(__FreeBSD__) + const int mangledNameStart = in.indexOf(" <_"), startOffset = 2; +#elif defined(__sun) && defined(__SVR4) + const int mangledNameStart = in.indexOf("'"), startOffset = 0; +#else + const int mangledNameStart = in.indexOf("(_"), startOffset = 1; +#endif + if (mangledNameStart >= 0) { + int mangledNameEnd = in.indexOf('+', mangledNameStart + 2); + // check for and suppress trailing whitespace: + if (mangledNameEnd > 1 && isspace(name[mangledNameEnd-1])) { + mangledNameEnd -= 1; + while (mangledNameEnd > 1 && isspace(name[mangledNameEnd-1])) { + --mangledNameEnd; + } + } + if (mangledNameEnd >= 0) { + int status; + // if we forget about this line and the one that undoes its effect we don't change the + // internal data of the QByteArray::fromRawData() ;) + const char endChar = name[mangledNameEnd]; + name[mangledNameEnd] = 0; + char *demangled = abi::__cxa_demangle(name + mangledNameStart + startOffset, 0, 0, &status); + name[mangledNameEnd] = endChar; + if (demangled) { + QString ret = QString::fromLatin1(name, mangledNameStart + startOffset) + + QString::fromLatin1(demangled) + + QString::fromLatin1(name + mangledNameEnd, len - mangledNameEnd); + free(demangled); + return ret; + } + } + } + return QString::fromLatin1(name); +} + +QString kRealBacktrace(int levels) +{ + QString s; + void* trace[256]; + int n = backtrace(trace, 256); + if (!n) + return s; + char** strings = backtrace_symbols (trace, n); + + if ( levels != -1 ) + n = qMin( n, levels ); + s = QLatin1String("[\n"); + + for (int i = 0; i < n; ++i) + s += QString::number(i) + QLatin1String(": ") + + maybeDemangledName(strings[i]) + QLatin1Char('\n'); + s += QLatin1String("]\n"); + if (strings) + free (strings); + return s; +} + + int QObject::startTimer(int interval) { Q_D(QObject); if (interval < 0) { - qWarning("QObject::startTimer: QTimer cannot have a negative interval"); + //qWarning("QObject::startTimer: QTimer cannot have a negative interval"); + qWarning() << "QObject::startTimer: QTimer" << this << "cannot have a negative interval" << interval << "pid=" << getpid() + << kRealBacktrace(-1); return 0; }