| Summary: | Crash after removing a feed | ||
|---|---|---|---|
| Product: | [Applications] akregator | Reporter: | Malte S. Stretz <mss> |
| Component: | general | Assignee: | kdepim bugs <pim-bugs-null> |
| Status: | RESOLVED FIXED | ||
| Severity: | crash | CC: | avuton |
| Priority: | NOR | ||
| Version First Reported In: | 1.2 | ||
| Target Milestone: | --- | ||
| Platform: | unspecified | ||
| OS: | Linux | ||
| Latest Commit: | Version Fixed/Implemented In: | ||
| Sentry Crash Report: | |||
|
Description
Malte S. Stretz
2005-12-19 20:26:39 UTC
I got the same with:
Using host libthread_db library "/lib/libthread_db.so.1".
[Thread debugging using libthread_db enabled]
[New Thread 46912598508928 (LWP 6150)]
[KCrash handler]
#3 0x000000670072006f in ?? ()
#4 0x00002aaab12745bd in Akregator::NodeListView::slotNodeChanged (
this=0x6e9660, node=0xc20bb0) at feedlistview.cpp:989
#5 0x00002aaab12756cf in Akregator::NodeListView::qt_invoke (this=0x6e9660,
_id=128, _o=0x7fffffcfa2a0) at feedlistview.moc:288
#6 0x00002aaaae5f50bd in QObject::activate_signal (this=0xc20bb0,
clist=0xbfdc00, o=0x7fffffcfa2a0) at qobject.cpp:2380
#7 0x00002aaaaac2ee20 in Akregator::TreeNode::signalChanged (this=0xc20bb0,
t0=0xc20bb0) at treenode.moc:148
#8 0x00002aaaaac3b820 in Akregator::FeedIconManager::slotIconChanged (
this=0x8e2810, hostOrURL=@0x7fffffcfa550, iconName=@0xc20bb0)
at feediconmanager.cpp:151
#9 0x00002aaaaac3ba20 in Akregator::FeedIconManager::loadIcon (this=0x8e2810,
url=@0x7fffffcfa550) at feediconmanager.cpp:102
#10 0x00002aaaaac3c008 in Akregator::FeedIconManager::fetchIcon (
this=0x8e2810, feed=0xc20bb0) at feediconmanager.cpp:69
#11 0x00002aaab1277e10 in Akregator::FeedItem::initialize (this=0xb55190,
node=0xc20bb0) at feeditem.cpp:106
#12 0x00002aaab1277e82 in FeedItem (this=0xb55190, parent=0xc20bb0,
after=0xec2530, node=0xc20bb0) at feeditem.cpp:55
#13 0x00002aaab12762dd in Akregator::NodeListView::CreateItemVisitor::visitFeed
(this=0x6f6270, node=0xc20bb0) at feedlistview.cpp:304
#14 0x00002aaaaac28850 in Akregator::Feed::accept (this=0xc20bb0,
visitor=0x6f6270) at feed.cpp:168
#15 0x00002aaaaac2fd16 in Akregator::TreeNodeVisitor::visit (this=0xec2560,
node=0xec2530) at treenodevisitor.cpp:32
#16 0x00002aaab1276e74 in Akregator::NodeListView::CreateItemVisitor::visitFolder (this=0x6f6270, node=0xbcc950) at feedlistview.cpp:288
#17 0x00002aaaaac31060 in Akregator::Folder::accept (this=0xbcc950,
visitor=0x6f6270) at folder.cpp:57
#18 0x00002aaaaac2fd16 in Akregator::TreeNodeVisitor::visit (this=0xec2560,
node=0xec2530) at treenodevisitor.cpp:32
#19 0x00002aaab127395d in Akregator::NodeListView::slotNodeAdded (
this=0xec2530, node=0xbcc950) at feedlistview.cpp:907
#20 0x00002aaab127575d in Akregator::NodeListView::qt_invoke (this=0x6e9660,
_id=125, _o=0x7fffffcfa800) at feedlistview.moc:285
#21 0x00002aaaae5f50bd in QObject::activate_signal (this=0x8a9470,
clist=0x8a96d0, o=0x7fffffcfa800) at qobject.cpp:2380
#22 0x00002aaaaac3156f in Akregator::Folder::signalChildAdded (this=0x8a9470,
t0=0xbcc950) at folder.moc:133
#23 0x00002aaaaac32770 in Akregator::Folder::prependChild (this=0x8a9470,
node=0xbcc950) at folder.cpp:194
#24 0x00002aaaaac3188f in Akregator::Folder::insertChild (this=0x8a9470,
node=0xbcc950, after=0x0) at folder.cpp:143
#25 0x00002aaab1272c79 in Akregator::NodeListView::movableDropEvent (
this=0x6e9660) at feedlistview.cpp:531
#26 0x00002aaaad0fc519 in KListView::contentsDropEvent (this=0x6e9660,
e=0x7fffffcfaf50) at klistview.cpp:910
#27 0x00002aaaae734dfc in QScrollView::viewportDropEvent (this=0x6e9660,
e=0x7fffffcfaf50) at qscrollview.cpp:1841
#28 0x00002aaaae734310 in QScrollView::eventFilter (this=0x6e9660,
obj=0x6ea3e0, e=0x7fffffcfaf50) at qscrollview.cpp:1538
#29 0x00002aaaae6fa954 in QListView::eventFilter (this=0x6e9660, o=0x6ea3e0,
e=0x7fffffcfaf50) at qlistview.cpp:3863
#30 0x00002aaaae5f2586 in QObject::activate_filters (this=0x6ea3e0,
e=0x7fffffcfaf50) at qobject.cpp:903
#31 0x00002aaaae5f23f0 in QObject::event (this=0x6ea3e0, e=0x7fffffcfaf50)
at qobject.cpp:735
#32 0x00002aaaae634e6e in QWidget::event (this=0x6ea3e0, e=0x7fffffcfaf50)
at qwidget.cpp:4659
#33 0x00002aaaae5887fb in QApplication::internalNotify (this=0x7fffffcfcc80,
receiver=0x6ea3e0, e=0x7fffffcfaf50) at qapplication.cpp:2635
#34 0x00002aaaae5884a5 in QApplication::notify (this=0x7fffffcfcc80,
receiver=0x6ea3e0, e=0x7fffffcfaf50) at qapplication.cpp:2523
#35 0x00002aaaad8393cc in KApplication::notify (this=0x7fffffcfcc80,
receiver=0x6ea3e0, event=0x7fffffcfaf50) at kapplication.cpp:550
#36 0x00002aaaabd1b3a5 in QApplication::sendEvent (receiver=0x6f63f0,
event=0xc20bb0) at qapplication.h:496
#37 0x00002aaaae51eab6 in qt_handle_xdnd_drop (xe=0x7fffffcfaff0,
passive=false) at qdnd_x11.cpp:850
#38 0x00002aaaae5204d1 in QDragManager::drop (this=0xedba70)
at qdnd_x11.cpp:1429
#39 0x00002aaaae51f033 in QDragManager::eventFilter (this=0xedba70,
o=0xb30f70, e=0x7fffffcfb5a0) at qdnd_x11.cpp:980
#40 0x00002aaaae588642 in QApplication::internalNotify (this=0x7fffffcfcc80,
receiver=0xb30f70, e=0x7fffffcfb5a0) at qapplication.cpp:2568
#41 0x00002aaaae587e06 in QApplication::notify (this=0x7fffffcfcc80,
receiver=0xb30f70, e=0x7fffffcfb5a0) at qapplication.cpp:2421
#42 0x00002aaaad8393cc in KApplication::notify (this=0x7fffffcfcc80,
receiver=0xb30f70, event=0x7fffffcfb5a0) at kapplication.cpp:550
#43 0x00002aaaae5103b6 in QApplication::sendSpontaneousEvent (
receiver=0xb30f70, event=0x7fffffcfb5a0) at qapplication.h:499
#44 0x00002aaaae509e2c in QETWidget::translateMouseEvent (this=0xb30f70,
event=0x7fffffcfbae0) at qapplication_x11.cpp:4296
#45 0x00002aaaae507897 in QApplication::x11ProcessEvent (this=0x7fffffcfcc80,
event=0x7fffffcfbae0) at qapplication_x11.cpp:3447
#46 0x00002aaaae524b3c in QEventLoop::processEvents (this=0x5a1b60, flags=4)
at qeventloop_x11.cpp:192
#47 0x00002aaaae59f868 in QEventLoop::enterLoop (this=0x5a1b60)
at qeventloop.cpp:198
#48 0x00002aaaae588992 in QApplication::enter_loop (this=0x7fffffcfcc80)
at qapplication.cpp:2793
#49 0x00002aaaae521250 in QDragManager::drag (this=0xedba70, o=0xb2f670,
mode=QDragObject::DragDefault) at qdnd_x11.cpp:1788
#50 0x00002aaaae595fbc in QDragObject::drag (this=0xb2f670,
mode=QDragObject::DragDefault) at qdragobject.cpp:547
#51 0x00002aaaae595f05 in QDragObject::drag (this=0xb2f670)
at qdragobject.cpp:469
#52 0x00002aaaad0fcf47 in KListView::startDrag (this=0x6e9660)
at klistview.cpp:1144
#53 0x00002aaaad0f7a5b in KListView::contentsMouseMoveEvent (this=0x6e9660,
e=0x7fffffcfbe50) at klistview.cpp:828
#54 0x00002aaaae734c44 in QScrollView::viewportMouseMoveEvent (this=0x6e9660,
e=0x7fffffcfc5e0) at qscrollview.cpp:1780
#55 0x00002aaaae7341ca in QScrollView::eventFilter (this=0x6e9660,
obj=0x6ea3e0, e=0x7fffffcfc5e0) at qscrollview.cpp:1510
#56 0x00002aaaae6fa954 in QListView::eventFilter (this=0x6e9660, o=0x6ea3e0,
e=0x7fffffcfc5e0) at qlistview.cpp:3863
#57 0x00002aaaae5f2586 in QObject::activate_filters (this=0x6ea3e0,
e=0x7fffffcfc5e0) at qobject.cpp:903
#58 0x00002aaaae5f23f0 in QObject::event (this=0x6ea3e0, e=0x7fffffcfc5e0)
at qobject.cpp:735
#59 0x00002aaaae634e6e in QWidget::event (this=0x6ea3e0, e=0x7fffffcfc5e0)
at qwidget.cpp:4659
#60 0x00002aaaae5887fb in QApplication::internalNotify (this=0x7fffffcfcc80,
receiver=0x6ea3e0, e=0x7fffffcfc5e0) at qapplication.cpp:2635
#61 0x00002aaaae587e06 in QApplication::notify (this=0x7fffffcfcc80,
receiver=0x6ea3e0, e=0x7fffffcfc5e0) at qapplication.cpp:2421
#62 0x00002aaaad8393cc in KApplication::notify (this=0x7fffffcfcc80,
receiver=0x6ea3e0, event=0x7fffffcfc5e0) at kapplication.cpp:550
#63 0x00002aaaae5103b6 in QApplication::sendSpontaneousEvent (
receiver=0x6ea3e0, event=0x7fffffcfc5e0) at qapplication.h:499
#64 0x00002aaaae509e2c in QETWidget::translateMouseEvent (this=0x6ea3e0,
event=0x7fffffcfcb20) at qapplication_x11.cpp:4296
#65 0x00002aaaae507897 in QApplication::x11ProcessEvent (this=0x7fffffcfcc80,
event=0x7fffffcfcb20) at qapplication_x11.cpp:3447
#66 0x00002aaaae524b3c in QEventLoop::processEvents (this=0x5a1b60, flags=4)
at qeventloop_x11.cpp:192
#67 0x00002aaaae59f868 in QEventLoop::enterLoop (this=0x5a1b60)
at qeventloop.cpp:198
#68 0x00002aaaae59f765 in QEventLoop::exec (this=0x5a1b60)
at qeventloop.cpp:145
#69 0x00002aaaae588948 in QApplication::exec (this=0x7fffffcfcc80)
at qapplication.cpp:2758
#70 0x000000000040bd42 in main (argc=1, argv=0x7fffffcfcfa8) at main.cpp:110
The first bt is caused by removing, the second by adding a feed. Can you reproduce this crash or does it just happen occasionally? I had one crash that was removing (unfortunately I closed the window on the bt, hopefully the one above). I have used akregator on another computer (32 bit) with no issue before this, when I moved my feed to this computer and I was moving stuff around after the import it happened then. It happens at random times, and it not reliably reproducable. Please excuse me, I'm having a brainfart (I had it crash 3 times on me while I was moving around and deleting). It only crashed the one time on the feed deletion. I don't know any way to reproduce it reliably, it just happens now and then (more now than then I think). IIRC have I seen this behavior since quite some time, I didn't use akregator for a while becase it was just too unstable. I correct, the second is caused by moving a folder. A way to make it crash on delete: move a folder with subitems, delete a subitem. #0 0x08064d19 in ?? () #1 0xb5b37dd9 in Akregator::NodeListView::slotNodeDestroyed (this=0x8256bd0, node=0x8b38500) at feedlistview.cpp:977 #2 0xb5b384fe in Akregator::NodeListView::qt_invoke (this=0x8256bd0, _id=127, _o=0xbf925014) at feedlistview.moc:280 #3 0xb65f8a56 in QObject::activate_signal () from /usr/share/qt3/lib/libqt-mt.so.3 #4 0xb7ecabea in Akregator::TreeNode::signalDestroyed (this=0x8b38500, t0=0x8b38500) at treenode.moc:135 #5 0xb7ecac37 in Akregator::TreeNode::emitSignalDestroyed (this=0x8b38500) at treenode.cpp:65 #6 0xb7ec5911 in ~Feed (this=0x8b38500) at feed.cpp:286 #7 0xb5b51de7 in Akregator::View::DeleteNodeVisitor::visitFeed (this=0x8065880, node=0x8b38500) at akregator_view.cpp:188 #8 0xb7ec3c05 in Akregator::Feed::accept (this=0x8b38500, visitor=0x8247a20) at feed.cpp:173 #9 0xb7ecba23 in Akregator::TreeNodeVisitor::visit (this=0x8247a20, node=0x8065880) at treenodevisitor.cpp:32 #10 0xb5b4c237 in Akregator::View::slotFeedRemove (this=0x8245a98) at akregator_view.cpp:972 #11 0xb5b51047 in Akregator::View::qt_invoke (this=0x8245a98, _id=72, _o=0xbf92525c) at akregator_view.moc:407 #12 0xb65f8929 in QObject::activate_signal () from /usr/share/qt3/lib/libqt-mt.so.3 #13 0xb65f93c4 in QObject::activate_signal () from /usr/share/qt3/lib/libqt-mt.so.3 #14 0xb6efad16 in KAction::activated (this=0x82b4930) at kaction.moc:176 #15 0xb6efae4b in KAction::slotActivated (this=0x82b4930) at kaction.cpp:1102 #16 0xb6f00c8c in KAction::qt_invoke (this=0x82b4930, _id=15, _o=0xbf92537c) at kaction.moc:218 #17 0xb65f8929 in QObject::activate_signal () from /usr/share/qt3/lib/libqt-mt.so.3 #18 0xb65f93c4 in QObject::activate_signal () from /usr/share/qt3/lib/libqt-mt.so.3 #19 0xb6c9e206 in KAccelPrivate::menuItemActivated (this=0x81ea778) at kaccelprivate.moc:110 #20 0xb6c9ea4b in KAccelPrivate::emitActivatedSignal (this=0x81ea778, pAction=0x8329110) at kaccel.cpp:400 #21 0xb6ca133a in KAccelPrivate::eventFilter (this=0x81ea778, pEvent=0xbf92585c) at kaccel.cpp:370 #22 0xb65f5a72 in QObject::activate_filters () from /usr/share/qt3/lib/libqt-mt.so.3 #23 0xb65f5af0 in QObject::event () from /usr/share/qt3/lib/libqt-mt.so.3 #24 0xb6633268 in QWidget::event () from /usr/share/qt3/lib/libqt-mt.so.3 #25 0xb670327a in QMainWindow::event () from /usr/share/qt3/lib/libqt-mt.so.3 #26 0xb658ff80 in QApplication::internalNotify () from /usr/share/qt3/lib/libqt-mt.so.3 #27 0xb659030e in QApplication::notify () from /usr/share/qt3/lib/libqt-mt.so.3 #28 0xb6c0f80c in KApplication::notify (this=0xbf925d44, receiver=0x8256bd0, event=0xbf92585c) at kapplication.cpp:550 #29 0xb6c9e827 in KAccelEventHandler::x11Event (this=0x8190928, pEvent=0xbf925ba8) at qapplication.h:491 #30 0xb6c139ed in KApplication::x11EventFilter (this=0xbf925d44, _event=0xbf925ba8) at kapplication.cpp:1652 #31 0xb650cdb3 in qt_set_x11_event_filter () from /usr/share/qt3/lib/libqt-mt.so.3 #32 0xb6519fe4 in QApplication::x11ProcessEvent () from /usr/share/qt3/lib/libqt-mt.so.3 #33 0xb6533fff in QEventLoop::processEvents () from /usr/share/qt3/lib/libqt-mt.so.3 #34 0xb65a7cfb in QEventLoop::enterLoop () from /usr/share/qt3/lib/libqt-mt.so.3 #35 0xb65a7c1e in QEventLoop::exec () from /usr/share/qt3/lib/libqt-mt.so.3 #36 0xb658ec13 in QApplication::exec () from /usr/share/qt3/lib/libqt-mt.so.3 #37 0x08051400 in main (argc=1, argv=0xbf925ef4) at main.cpp:110 SVN commit 496291 by osterfeld:
Properly remove subitems recursively from the item dict when deleting the parent items. This should fix several crashes
like: "Move a folder, delete a subitem, Crash".
BUG: 118659
M +72 -32 feedlistview.cpp
M +3 -0 feedlistview.h
--- branches/KDE/3.5/kdepim/akregator/src/feedlistview.cpp #496290:496291
@@ -71,6 +71,7 @@
ConnectNodeVisitor* connectNodeVisitor;
DisconnectNodeVisitor* disconnectNodeVisitor;
CreateItemVisitor* createItemVisitor;
+ DeleteItemVisitor* deleteItemVisitor;
DragAndDropVisitor* dragAndDropVisitor;
};
@@ -186,6 +187,57 @@
NodeListView* m_view;
};
+class NodeListView::DeleteItemVisitor : public TreeNodeVisitor
+{
+ public:
+
+ DeleteItemVisitor(NodeListView* view) : m_view(view) {}
+
+ virtual bool visitTreeNode(TreeNode* node)
+ {
+ TreeNodeItem* item = m_view->d->itemDict.take(node);
+
+ if (!item)
+ return true;
+
+ if ( m_selectNeighbour && item->isSelected() )
+ {
+ if (item->itemBelow())
+ m_view->setSelected(item->itemBelow(), true);
+ else if (item->itemAbove())
+ m_view->setSelected(item->itemAbove(), true);
+ else
+ m_view->setSelected(item, false);
+ }
+
+ delete item;
+ return true;
+
+ }
+
+ virtual bool visitFolder(Folder* node)
+ {
+ // delete child items recursively before deleting parent
+ QValueList<TreeNode*> children = node->children();
+ for (QValueList<TreeNode*>::ConstIterator it = children.begin(); it != children.end(); ++it )
+ visit(*it);
+
+ visitTreeNode(node);
+
+ return true;
+ }
+
+ void deleteItem(TreeNode* node, bool selectNeighbour)
+ {
+ m_selectNeighbour = selectNeighbour;
+ visit(node);
+ }
+
+ private:
+ NodeListView* m_view;
+ bool m_selectNeighbour;
+};
+
class NodeListView::CreateItemVisitor : public TreeNodeVisitor
{
public:
@@ -193,7 +245,6 @@
virtual bool visitTagNode(TagNode* node)
{
- kdDebug() << "create item for " << node->title() << endl;
TagNodeItem* item = 0;
TreeNode* prev = node->prevSibling();
FolderItem* parentItem = static_cast<FolderItem*>(m_view->findNodeItem(node->parent()));
@@ -281,9 +332,9 @@
item = new FolderItem(m_view, node);
}
m_view->d->itemDict.insert(node, item);
+
+ // add children recursively
QValueList<TreeNode*> children = node->children();
-
- // add children recursively
for (QValueList<TreeNode*>::ConstIterator it = children.begin(); it != children.end(); ++it )
visit(*it);
@@ -333,6 +384,7 @@
d->connectNodeVisitor = new ConnectNodeVisitor(this),
d->disconnectNodeVisitor = new DisconnectNodeVisitor(this);
d->createItemVisitor = new CreateItemVisitor(this);
+ d->deleteItemVisitor = new DeleteItemVisitor(this);
d->dragAndDropVisitor = new DragAndDropVisitor(this);
setMinimumSize(150, 150);
@@ -372,6 +424,7 @@
delete d->connectNodeVisitor;
delete d->disconnectNodeVisitor;
delete d->createItemVisitor;
+ delete d->deleteItemVisitor;
delete d->dragAndDropVisitor;
delete d;
d = 0;
@@ -841,9 +894,12 @@
void NodeListView::slotSelectionChanged(QListViewItem* item)
{
- TreeNodeItem* ni = dynamic_cast<TreeNodeItem*> (item);
+ TreeNodeItem* ni = dynamic_cast<TreeNodeItem*> (item);
+
if (ni)
+ {
emit signalNodeSelected(ni->node());
+ }
}
void NodeListView::slotItemRenamed(QListViewItem* item, int col, const QString& text)
@@ -855,7 +911,6 @@
{
if (text != ni->node()->title())
{
- kdDebug() << "renamed item to \"" << text << "\"" << endl;
ni->node()->setTitle(text);
}
}
@@ -874,9 +929,12 @@
if (!feed->favicon().isNull())
{
TreeNodeItem* item = findNodeItem(feed);
- KIconEffect iconEffect;
- QPixmap tempIcon = iconEffect.apply(feed->favicon(), KIcon::Small, KIcon::DisabledState);
- item->setPixmap(0, tempIcon);
+ if (item)
+ {
+ KIconEffect iconEffect;
+ QPixmap tempIcon = iconEffect.apply(feed->favicon(), KIcon::Small, KIcon::DisabledState);
+ item->setPixmap(0, tempIcon);
+ }
}
}
@@ -904,17 +962,14 @@
void NodeListView::slotNodeAdded(TreeNode* node)
{
- d->createItemVisitor->visit(node);
- kdDebug() << "NodeListView::slotNodeAdded: " << node->title() << endl;
+ if (node)
+ d->createItemVisitor->visit(node);
}
void NodeListView::slotNodeRemoved(Folder* /*parent*/, TreeNode* node)
{
- if (!node)
- return;
- kdDebug() << "NodeListView::slotNodeRemoved: " << node->title() << endl;
- disconnectFromNode(node);
- delete d->itemDict.take(node);
+ if (node)
+ d->deleteItemVisitor->deleteItem(node, false);
}
void NodeListView::connectToNode(TreeNode* node)
@@ -957,23 +1012,8 @@
void NodeListView::slotNodeDestroyed(TreeNode* node)
{
- TreeNodeItem* item = findNodeItem(node);
-
- d->itemDict.remove(node);
-
- if (!item)
- return;
-
- if ( item->isSelected() )
- {
- if (item->itemBelow())
- setSelected(item->itemBelow(), true);
- else if (item->itemAbove())
- setSelected(item->itemAbove(), true);
- else
- setSelected(item, false);
- }
- delete item;
+ if (node)
+ d->deleteItemVisitor->deleteItem(node, true);
}
void NodeListView::slotRootNodeChanged(TreeNode* rootNode)
--- branches/KDE/3.5/kdepim/akregator/src/feedlistview.h #496290:496291
@@ -178,6 +178,9 @@
friend class CreateItemVisitor;
class CreateItemVisitor;
+ friend class DeleteItemVisitor;
+ class DeleteItemVisitor;
+
friend class DragAndDropVisitor;
class DragAndDropVisitor;
|