Summary: | Crash when switching between compiling output levels | ||
---|---|---|---|
Product: | [Applications] kdevelop | Reporter: | András Manţia <amantia> |
Component: | Output Views | Assignee: | KDevelop Developers <kdevelop-devel> |
Status: | RESOLVED FIXED | ||
Severity: | crash | CC: | hausmann |
Priority: | NOR | ||
Version: | git master | ||
Target Milestone: | --- | ||
Platform: | Compiled Sources | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | ||
Sentry Crash Report: |
Description
András Manţia
2004-01-17 17:29:15 UTC
Subject: BT for crash. Actually I was wrong as it crash when pressing the RMB, before you are able to select the "Very Short Compiler Output". Seems like an out of memory issue (I have 768MB) which shows together with the slow switching from Very Short to Full/Short a very inefficient coding. 0x41a6c691 in kill () from /lib/libc.so.6 (gdb) bt #0 0x41a6c691 in kill () from /lib/libc.so.6 #1 0x418ee511 in pthread_kill () from /lib/libpthread.so.0 #2 0x418ee83b in raise () from /lib/libpthread.so.0 #3 0x41a6c424 in raise () from /lib/libc.so.6 #4 0x41a6da50 in abort () from /lib/libc.so.6 #5 0x419ef2e5 in __cxxabiv1::__terminate(void (*)()) () from /usr/lib/libstdc++.so.5 #6 0x419ef322 in std::terminate() () from /usr/lib/libstdc++.so.5 #7 0x419ef4a2 in __cxa_throw () from /usr/lib/libstdc++.so.5 #8 0x419ef6df in operator new(unsigned) () from /usr/lib/libstdc++.so.5 #9 0x419ef7ad in operator new[](unsigned) () from /usr/lib/libstdc++.so.5 #10 0x415665f2 in QString::setLength(unsigned) (this=0xbfffe9f0, newLen=134271874) at tools/qstring.cpp:1699 #11 0x4156687b in QString::grow(unsigned) (this=0xbfffe9f0, newLen=134271874) at tools/qstring.cpp:1790 #12 0x4156ccb7 in QString::operator+=(QString const&) (this=0xbfffe9f0, str=@0xbfffe900) at tools/qstring.cpp:5339 #13 0x412ce169 in QTextDocument::plainText() const (this=0x8311e00) at kernel/qrichtext.cpp:2275 #14 0x412cf7b1 in QTextDocument::text() const (this=0x8311e00) at kernel/qrichtext.cpp:2455 #15 0x41301301 in QTextDocument::originalText() const (this=0x8311e00) at kernel/qrichtext_p.h:1823 #16 0x413efb51 in QTextEdit::text() const (this=0x8311a90) at widgets/qtextedit.cpp:3710 #17 0x413f52f4 in QTextEdit::createPopupMenu(QPoint const&) (this=0x8311a90, pos=@0xbfffeb1c) at widgets/qtextedit.cpp:5483 #18 0x41f75711 in MakeWidget::createPopupMenu(QPoint const&) (this=0x8311a90, pos=@0xbfffeb1c) at /development/sources/kde-head/kdevelop/parts/outputviews/makewidget.cpp:673 #19 0x413eb81a in QTextEdit::contentsContextMenuEvent(QContextMenuEvent*) (this=0x8311a90, e=0xbfffeb10) at widgets/qtextedit.cpp:2651 #20 0x4139e93c in QScrollView::viewportContextMenuEvent(QContextMenuEvent*) (this=0x8311a90, e=0xbfffef70) at widgets/qscrollview.cpp:1884 #21 0x4139dcb5 in QScrollView::eventFilter(QObject*, QEvent*) (this=0x8311a90, obj=0x822b960, e=0xbfffef70) at widgets/qscrollview.cpp:1544 #22 0x413ecdd5 in QTextEdit::eventFilter(QObject*, QEvent*) (this=0x8311a90, o=0x822b960, e=0xbfffef70) at widgets/qtextedit.cpp:2908 #23 0x41278280 in QObject::activate_filters(QEvent*) (this=0x822b960, e=0xbfffef70) at kernel/qobject.cpp:902 #24 0x412780f2 in QObject::event(QEvent*) (this=0x822b960, e=0xbfffef70) at kernel/qobject.cpp:735 #25 0x412b26f3 in QWidget::event(QEvent*) (this=0x822b960, e=0xbfffef70) at kernel/qwidget.cpp:4630 #26 0x41218081 in QApplication::internalNotify(QObject*, QEvent*) (this=0xbffff500, receiver=0x822b960, e=0xbfffef70) ---Type <return> to continue, or q <return> to quit--- at kernel/qapplication.cpp:2614 #27 0x41217be2 in QApplication::notify(QObject*, QEvent*) (this=0xbffff500, receiver=0x822b960, e=0xbfffef70) at kernel/qapplication.cpp:2457 #28 0x40d8b73d in KApplication::notify(QObject*, QEvent*) () from /opt/kde-cvs/lib/libkdecore.so.4 #29 0x411ae79b in QApplication::sendSpontaneousEvent(QObject*, QEvent*) (receiver=0x822b960, event=0xbfffef70) at kernel/qapplication.h:493 #30 0x411a77ee in QETWidget::translateMouseEvent(_XEvent const*) (this=0x822b960, event=0xbffff380) at kernel/qapplication_x11.cpp:4228 #31 0x411a541f in QApplication::x11ProcessEvent(_XEvent*) (this=0xbffff500, event=0xbffff380) at kernel/qapplication_x11.cpp:3387 #32 0x411bf940 in QEventLoop::processEvents(unsigned) (this=0x80ed250, flags=4) at kernel/qeventloop_x11.cpp:192 #33 0x4122c232 in QEventLoop::enterLoop() (this=0x80ed250) at kernel/qeventloop.cpp:198 #34 0x4122c14e in QEventLoop::exec() (this=0x80ed250) at kernel/qeventloop.cpp:145 #35 0x41218201 in QApplication::exec() (this=0xbffff500) at kernel/qapplication.cpp:2737 #36 0x08066283 in main (argc=1, argv=0xbffff674) at /development/sources/kde-head/kdevelop/src/main.cpp:128 #37 0x41a588ae in __libc_start_main () from /lib/libc.so.6 Yes, i have the same problem (compiling from source). It eats all my memory and crashes after switching the compiling output modes .. Hmm.. inefficient, yes.. But it's actually QTextEdit that's blowing up. I believe this is the line that does it:
> popup->setItemEnabled( d->id[ IdSelectAll ], (bool)text().length() );
It's pushing all of the widgets contents into a QString only to call length() on it to make sure it isn't zero.. Doesn't seem to be the most efficient way of doing it.. :)
Anyway, I think the real problem is that we use QTextEdit to host more data than it was designed for. Now that we're targetting Qt-3.2, we should try to use the LogText textformat, which is said to reduce memory consumption greatly. We might lose some of the nice formatting, but that's clearly preferable.
Subject: Re: Crash when switching between compiling output levels > Hmm.. inefficient, yes.. But it's actually QTextEdit that's blowing up. I believe this is the line that does it: > > popup->setItemEnabled( d->id[ IdSelectAll ], (bool)text().length() ); > > It's pushing all of the widgets contents into a QString only to call > length() on it to make sure it isn't zero.. Doesn't seem to be the most > efficient way of doing it.. :) Might be. But where is this code? I can't find it. Just because QTextEdit has a length method, so there is no need to call text() first. Oh, I see, it's in QTextEdit code. And idea would be to not call QTextEdit::createPopupMenu at all, just that we need to handle the Copy and Select All case in the makewidget in this case. Shouldn't be so hard. Andras HEAD should perform better now. I'm curious to hear if it crashes. Subject: Re: Crash when switching between compiling output levels Switching still takes several seconds from Very Short to Full, but it doesn't crash and I don't see an increase of the memory usage during this operation. Full->Short and Very Short->Short switching takes even longer, and the memory usage increased with 10MB. After restarting KDevelop, I verified the memory usage: it uses 65 MB. Previously I started KDevelop, compiled the project (part of Quanta), switched between Full and Very Short and the memory usage was 71MB. As I stated switching again between Full->Short brought up the usage to 81MB. So it is still leaking memory somewhere, but it seems that uses much less than before. QTextEdit::createPopupMenu() inefficiency reported to TrollTech. Will be fixed for Qt > 3.3 Subject: qt-copy/src/widgets CVS commit by hausmann: - don't call text().length() twice, in QTextEdit::createPopupMenu. It's terribly inefficient to do that when the content is large and gets converted to html. Instead now length() gets called instead, and only once. Patch will be in next release. CCMAIL: 72830-done@bugs.kde.org M +3 -6 qtextedit.cpp 1.44 --- qt-copy/src/widgets/qtextedit.cpp #1.43:1.44 @@ -5479,10 +5479,7 @@ QPopupMenu *QTextEdit::createPopupMenu( popup->setItemEnabled( d->id[ IdPaste ], !isReadOnly() && !QApplication::clipboard()->text( d->clipboard_mode ).isEmpty() ); #endif - popup->setItemEnabled( d->id[ IdClear ], !isReadOnly() && !text().isEmpty() ); -#ifdef QT_TEXTEDIT_OPTIMIZATION - popup->setItemEnabled( d->id[ IdSelectAll ], d->optimMode ? d->od->len : (bool)text().length() ); -#else - popup->setItemEnabled( d->id[ IdSelectAll ], (bool)text().length() ); -#endif + const bool isEmptyDocument = (length() == 0); + popup->setItemEnabled( d->id[ IdClear ], !isReadOnly() && !isEmptyDocument ); + popup->setItemEnabled( d->id[ IdSelectAll ], !isEmptyDocument ); return popup; #else |