Hallo Zusammen,
bei mir gab der VDR regelmäßig folgende Meldung beim Beenden aus (und das schon seit 1.6.0):
Habe mir mal die Mühe gemacht den vdr mit Plugins und Debugsymbolen unter valgrind laufen zu lassen und mir ist dabei folgendes "entgegengesprungen":
Code
==1594==
==1594== Thread 6:
==1594== Invalid read of size 4
==1594== at 0x418E436: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (in /usr/lib/libstdc++.so.6.0.13)
==1594== by 0x418E49C: std::_Rb_tree_increment(std::_Rb_tree_node_base const*) (in /usr/lib/libstdc++.so.6.0.13)
==1594== by 0x4BDD944: std::_Rb_tree_const_iterator<cConflictCheckTimerObj*>::operator++() (stl_tree.h:259)
==1594== by 0x4BDB27D: cConflictCheck::ProcessCheckTime(cConflictCheckTime*) (conflictcheck.c:497)
==1594== by 0x4BDAB7C: cConflictCheck::CreateConflictList(cList<cConflictCheckTime>*, cList<cConflictCheckTimerObj>*) (conflictcheck.c:421)
==1594== by 0x4BD9DDA: cConflictCheck::Check() (conflictcheck.c:243)
==1594== by 0x4C57849: cSearchTimerThread::Action() (searchtimer_thread.c:542)
==1594== by 0x8167CB7: cThread::StartThread(cThread*) (thread.c:262)
==1594== by 0x4062954: start_thread (pthread_create.c:300)
==1594== by 0x4332E7D: clone (clone.S:130)
==1594== Address 0x46f52bc is 12 bytes inside a block of size 20 free'd
==1594== at 0x4023881: operator delete(void*) (vg_replace_malloc.c:387)
==1594== by 0x4BE05F8: __gnu_cxx::new_allocator<std::_Rb_tree_node<cConflictCheckTimerObj*> >::deallocate(std::_Rb_tree_node<cConflictCheckTimerObj*>*, unsigned int) (new_allocator.h:95)
==1594== by 0x4BDFEF3: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::_M_put_node(std::_Rb_tree_node<cConflictCheckTimerObj*>*) (stl_tree.h:363)
==1594== by 0x4BDF129: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::_M_destroy_node(std::_Rb_tree_node<cConflictCheckTimerObj*>*) (stl_tree.h:384)
==1594== by 0x4BDE2CB: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::_M_erase(std::_Rb_tree_node<cConflictCheckTimerObj*>*) (stl_tree.h:972)
==1594== by 0x4BE03F8: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::clear() (stl_tree.h:726)
==1594== by 0x4BDF986: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::erase(std::_Rb_tree_iterator<cConflictCheckTimerObj*>, std::_Rb_tree_iterator<cConflictCheckTimerObj*>) (stl_tree.h:1385)
==1594== by 0x4BDE97A: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::erase(cConflictCheckTimerObj* const&) (stl_tree.h:1374)
==1594== by 0x4BDDE97: std::set<cConflictCheckTimerObj*, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::erase(cConflictCheckTimerObj* const&) (stl_set.h:491)
==1594== by 0x4BDB26F: cConflictCheck::ProcessCheckTime(cConflictCheckTime*) (conflictcheck.c:501)
==1594== by 0x4BDAB7C: cConflictCheck::CreateConflictList(cList<cConflictCheckTime>*, cList<cConflictCheckTimerObj>*) (conflictcheck.c:421)
==1594== by 0x4BD9DDA: cConflictCheck::Check() (conflictcheck.c:243)
==1594==
==1594== Invalid read of size 4
==1594== at 0x418E450: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (in /usr/lib/libstdc++.so.6.0.13)
==1594== by 0x418E49C: std::_Rb_tree_increment(std::_Rb_tree_node_base const*) (in /usr/lib/libstdc++.so.6.0.13)
==1594== by 0x4BDD944: std::_Rb_tree_const_iterator<cConflictCheckTimerObj*>::operator++() (stl_tree.h:259)
==1594== by 0x4BDB27D: cConflictCheck::ProcessCheckTime(cConflictCheckTime*) (conflictcheck.c:497)
==1594== by 0x4BDAB7C: cConflictCheck::CreateConflictList(cList<cConflictCheckTime>*, cList<cConflictCheckTimerObj>*) (conflictcheck.c:421)
==1594== by 0x4BD9DDA: cConflictCheck::Check() (conflictcheck.c:243)
==1594== by 0x4C57849: cSearchTimerThread::Action() (searchtimer_thread.c:542)
==1594== by 0x8167CB7: cThread::StartThread(cThread*) (thread.c:262)
==1594== by 0x4062954: start_thread (pthread_create.c:300)
==1594== by 0x4332E7D: clone (clone.S:130)
==1594== Address 0x46f52b4 is 4 bytes inside a block of size 20 free'd
==1594== at 0x4023881: operator delete(void*) (vg_replace_malloc.c:387)
==1594== by 0x4BE05F8: __gnu_cxx::new_allocator<std::_Rb_tree_node<cConflictCheckTimerObj*> >::deallocate(std::_Rb_tree_node<cConflictCheckTimerObj*>*, unsigned int) (new_allocator.h:95)
==1594== by 0x4BDFEF3: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::_M_put_node(std::_Rb_tree_node<cConflictCheckTimerObj*>*) (stl_tree.h:363)
==1594== by 0x4BDF129: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::_M_destroy_node(std::_Rb_tree_node<cConflictCheckTimerObj*>*) (stl_tree.h:384)
==1594== by 0x4BDE2CB: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::_M_erase(std::_Rb_tree_node<cConflictCheckTimerObj*>*) (stl_tree.h:972)
==1594== by 0x4BE03F8: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::clear() (stl_tree.h:726)
==1594== by 0x4BDF986: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::erase(std::_Rb_tree_iterator<cConflictCheckTimerObj*>, std::_Rb_tree_iterator<cConflictCheckTimerObj*>) (stl_tree.h:1385)
==1594== by 0x4BDE97A: std::_Rb_tree<cConflictCheckTimerObj*, cConflictCheckTimerObj*, std::_Identity<cConflictCheckTimerObj*>, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::erase(cConflictCheckTimerObj* const&) (stl_tree.h:1374)
==1594== by 0x4BDDE97: std::set<cConflictCheckTimerObj*, std::less<cConflictCheckTimerObj*>, std::allocator<cConflictCheckTimerObj*> >::erase(cConflictCheckTimerObj* const&) (stl_set.h:491)
==1594== by 0x4BDB26F: cConflictCheck::ProcessCheckTime(cConflictCheckTime*) (conflictcheck.c:501)
==1594== by 0x4BDAB7C: cConflictCheck::CreateConflictList(cList<cConflictCheckTime>*, cList<cConflictCheckTimerObj>*) (conflictcheck.c:421)
==1594== by 0x4BD9DDA: cConflictCheck::Check() (conflictcheck.c:243)
==1594==
Alles anzeigen
Ich habe leider keine Ahnung was der Code macht , aber mit dieser Änderung:
Diff
diff --git a/conflictcheck.c b/conflictcheck.c
index eb7fa57..b6ab928 100644
--- a/conflictcheck.c
+++ b/conflictcheck.c
@@ -498,8 +498,8 @@ int cConflictCheck::ProcessCheckTime(cConflictCheckTime* checkTime)
{
if ((*it) && (*it)->stop > checkTime->evaltime)
checkTime->startingTimers.insert(*it);
- pendingTimers.erase(*it);
}
+ pendingTimers.clear();
LogFile.Log(3,"attach starting timers");
// handle starting timers
Alles anzeigen
ist die "corrupted double-linked list" Geschichte - und auch die valgrind-Meldung kommt nicht mehr...
winni, kann das so geändert werden oder passt dann was nicht mehr im conflictcheck???
Zudem hat valgrind noch eine andere Stelle angemeckert die ich dann umgeschrieben habe im searchtimer_thread.c (die habe ich wenigstens verstanden)
Gruß
Joe_D