--- 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 <unistd.h>
+#include <execinfo.h>
+#include <cxxabi.h>
+
+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;
     }
 
