2014-04-01 141 views
0

我的多線程項目中出現段錯誤。 這個項目是一個持續運行的循環程序,它的結構是具有由一個或多個操作組成的TASKS。Valgrind:無效的讀取大小爲4,出界段錯誤

運行Valgrind我收到內存泄漏和出界(無效的大小爲4的讀取)警告。

Valgrind的LOG:

==30039== Memcheck, a memory error detector 
==30039== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
==30039== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
==30039== Command: ./sisCAT 
==30039== 
DebugLog: ++++++++++++++ Inicio de Execucao ++++++++++++++++++++++ 
DebugLog: iniciando ciclo do controller 

DebugLog: 3 
==30039== Invalid read of size 4 
==30039== at 0x8081714: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:52) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== by 0x807F78C: SISCAT::Controller::Run() (Controller.h:57) 
==30039== by 0x807F71D: SISCAT::SisCAT::run() (SisCAT.cpp:27) 
==30039== by 0x804C8F8: main (boia.cpp:73) 
==30039== Address 0x7355274 is 20 bytes inside a block of size 24 free'd 
==30039== at 0x48D1CFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==30039== by 0x807D1B2: __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> > >::deallocate(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*, unsigned int) (new_allocator.h:98) 
==30039== by 0x807C3B9: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_put_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:373) 
==30039== by 0x807B08B: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:395) 
==30039== by 0x807A17F: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_erase(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:1076) 
==30039== by 0x8079564: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~_Rb_tree() (in /home/lioc/Siscat/sisCAT/Debug/sisCAT) 
==30039== by 0x8078FD6: std::map<std::string, SISCAT::Task*, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~map() (stl_map.h:88) 
==30039== by 0x80816D0: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:40) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== 
==30039== Invalid read of size 4 
==30039== at 0x4984BE5: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==30039== by 0x80817A9: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:63) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== by 0x807F78C: SISCAT::Controller::Run() (Controller.h:57) 
==30039== by 0x807F71D: SISCAT::SisCAT::run() (SisCAT.cpp:27) 
==30039== by 0x804C8F8: main (boia.cpp:73) 
==30039== Address 0x735526c is 12 bytes inside a block of size 24 free'd 
==30039== at 0x48D1CFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==30039== by 0x807D1B2: __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> > >::deallocate(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*, unsigned int) (new_allocator.h:98) 
==30039== by 0x807C3B9: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_put_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:373) 
==30039== by 0x807B08B: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:395) 
==30039== by 0x807A17F: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_erase(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:1076) 
==30039== by 0x8079564: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~_Rb_tree() (in /home/lioc/Siscat/sisCAT/Debug/sisCAT) 
==30039== by 0x8078FD6: std::map<std::string, SISCAT::Task*, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~map() (stl_map.h:88) 
==30039== by 0x80816D0: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:40) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== 
==30039== Invalid read of size 4 
==30039== at 0x4984BFB: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==30039== by 0x80817A9: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:63) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== by 0x807F78C: SISCAT::Controller::Run() (Controller.h:57) 
==30039== by 0x807F71D: SISCAT::SisCAT::run() (SisCAT.cpp:27) 
==30039== by 0x804C8F8: main (boia.cpp:73) 
==30039== Address 0x7355264 is 4 bytes inside a block of size 24 free'd 
==30039== at 0x48D1CFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==30039== by 0x807D1B2: __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> > >::deallocate(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*, unsigned int) (new_allocator.h:98) 
==30039== by 0x807C3B9: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_put_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:373) 
==30039== by 0x807B08B: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:395) 
==30039== by 0x807A17F: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_erase(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:1076) 
==30039== by 0x8079564: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~_Rb_tree() (in /home/lioc/Siscat/sisCAT/Debug/sisCAT) 
==30039== by 0x8078FD6: std::map<std::string, SISCAT::Task*, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~map() (stl_map.h:88) 
==30039== by 0x80816D0: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:40) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== 
==30039== Invalid read of size 4 
==30039== at 0x4984C00: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==30039== by 0x80817A9: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:63) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== by 0x807F78C: SISCAT::Controller::Run() (Controller.h:57) 
==30039== by 0x807F71D: SISCAT::SisCAT::run() (SisCAT.cpp:27) 
==30039== by 0x804C8F8: main (boia.cpp:73) 
==30039== Address 0x73551dc is 12 bytes inside a block of size 24 free'd 
==30039== at 0x48D1CFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==30039== by 0x807D1B2: __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> > >::deallocate(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*, unsigned int) (new_allocator.h:98) 
==30039== by 0x807C3B9: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_put_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:373) 
==30039== by 0x807B08B: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:395) 
==30039== by 0x807A17F: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_erase(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:1076) 
==30039== by 0x8079564: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~_Rb_tree() (in /home/lioc/Siscat/sisCAT/Debug/sisCAT) 
==30039== by 0x8078FD6: std::map<std::string, SISCAT::Task*, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~map() (stl_map.h:88) 
==30039== by 0x80816D0: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:40) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== 
==30039== Invalid read of size 4 
==30039== at 0x4984BF2: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==30039== by 0x80817A9: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:63) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== by 0x807F78C: SISCAT::Controller::Run() (Controller.h:57) 
==30039== by 0x807F71D: SISCAT::SisCAT::run() (SisCAT.cpp:27) 
==30039== by 0x804C8F8: main (boia.cpp:73) 
==30039== Address 0x7355220 is 8 bytes inside a block of size 24 free'd 
==30039== at 0x48D1CFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==30039== by 0x807D1B2: __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> > >::deallocate(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*, unsigned int) (new_allocator.h:98) 
==30039== by 0x807C3B9: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_put_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:373) 
==30039== by 0x807B08B: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:395) 
==30039== by 0x807A17F: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_erase(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:1076) 
==30039== by 0x807A15F: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_erase(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:1074) 
==30039== by 0x8079564: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~_Rb_tree() (in /home/lioc/Siscat/sisCAT/Debug/sisCAT) 
==30039== by 0x8078FD6: std::map<std::string, SISCAT::Task*, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~map() (stl_map.h:88) 
==30039== by 0x80816D0: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:40) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== 
==30039== Invalid read of size 4 
==30039== at 0x4984C12: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==30039== by 0x80817A9: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:63) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== by 0x807F78C: SISCAT::Controller::Run() (Controller.h:57) 
==30039== by 0x807F71D: SISCAT::SisCAT::run() (SisCAT.cpp:27) 
==30039== by 0x804C8F8: main (boia.cpp:73) 
==30039== Address 0x73551d4 is 4 bytes inside a block of size 24 free'd 
==30039== at 0x48D1CFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==30039== by 0x807D1B2: __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> > >::deallocate(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*, unsigned int) (new_allocator.h:98) 
==30039== by 0x807C3B9: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_put_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:373) 
==30039== by 0x807B08B: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:395) 
==30039== by 0x807A17F: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_erase(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:1076) 
==30039== by 0x8079564: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~_Rb_tree() (in /home/lioc/Siscat/sisCAT/Debug/sisCAT) 
==30039== by 0x8078FD6: std::map<std::string, SISCAT::Task*, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~map() (stl_map.h:88) 
==30039== by 0x80816D0: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:40) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== 
==30039== Invalid read of size 4 
==30039== at 0x4984C1A: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==30039== by 0x80817A9: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:63) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== by 0x807F78C: SISCAT::Controller::Run() (Controller.h:57) 
==30039== by 0x807F71D: SISCAT::SisCAT::run() (SisCAT.cpp:27) 
==30039== by 0x804C8F8: main (boia.cpp:73) 
==30039== Address 0x73551dc is 12 bytes inside a block of size 24 free'd 
==30039== at 0x48D1CFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==30039== by 0x807D1B2: __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> > >::deallocate(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*, unsigned int) (new_allocator.h:98) 
==30039== by 0x807C3B9: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_put_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:373) 
==30039== by 0x807B08B: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:395) 
==30039== by 0x807A17F: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::_M_erase(std::_Rb_tree_node<std::pair<std::string const, SISCAT::Task*> >*) (stl_tree.h:1076) 
==30039== by 0x8079564: std::_Rb_tree<std::string, std::pair<std::string const, SISCAT::Task*>, std::_Select1st<std::pair<std::string const, SISCAT::Task*> >, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~_Rb_tree() (in /home/lioc/Siscat/sisCAT/Debug/sisCAT) 
==30039== by 0x8078FD6: std::map<std::string, SISCAT::Task*, std::less<std::string>, std::allocator<std::pair<std::string const, SISCAT::Task*> > >::~map() (stl_map.h:88) 
==30039== by 0x80816D0: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:40) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== 
==30039== Use of uninitialised value of size 4 
==30039== at 0x8081E99: SISCAT::Task::GetTickExecution() (Task.h:121) 
==30039== by 0x808171E: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:52) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== by 0x807F78C: SISCAT::Controller::Run() (Controller.h:57) 
==30039== by 0x807F71D: SISCAT::SisCAT::run() (SisCAT.cpp:27) 
==30039== by 0x804C8F8: main (boia.cpp:73) 
==30039== 
==30039== Invalid read of size 4 
==30039== at 0x8081E99: SISCAT::Task::GetTickExecution() (Task.h:121) 
==30039== by 0x808171E: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:52) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== by 0x807F78C: SISCAT::Controller::Run() (Controller.h:57) 
==30039== by 0x807F71D: SISCAT::SisCAT::run() (SisCAT.cpp:27) 
==30039== by 0x804C8F8: main (boia.cpp:73) 
==30039== Address 0x13 is not stack'd, malloc'd or (recently) free'd 
==30039== 
==30039== Process terminating with default action of signal 11 (SIGSEGV) 
==30039== Access not within mapped region at address 0x13 
==30039== at 0x8081E99: SISCAT::Task::GetTickExecution() (Task.h:121) 
==30039== by 0x808171E: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:52) 
==30039== by 0x80783B3: SISCAT::Controller::ExecuteCycle() (Controller.cpp:183) 
==30039== by 0x8078244: SISCAT::Controller::ClockCycle() (Controller.cpp:156) 
==30039== by 0x80781D5: SISCAT::Controller::StartClock() (Controller.cpp:146) 
==30039== by 0x8077B54: SISCAT::Controller::Initialize() (Controller.cpp:129) 
==30039== by 0x807F78C: SISCAT::Controller::Run() (Controller.h:57) 
==30039== by 0x807F71D: SISCAT::SisCAT::run() (SisCAT.cpp:27) 
==30039== by 0x804C8F8: main (boia.cpp:73) 
==30039== If you believe this happened as a result of a stack 
==30039== overflow in your program's main thread (unlikely but 
==30039== possible), you can try to increase the size of the 
==30039== main thread stack using the --main-stacksize= flag. 
==30039== The main thread stack size used in this run was 8388608. 
==30039== 
==30039== HEAP SUMMARY: 
==30039==  in use at exit: 10,856 bytes in 183 blocks 
==30039== total heap usage: 237 allocs, 54 frees, 14,287 bytes allocated 
==30039== 
==30039== LEAK SUMMARY: 
==30039== definitely lost: 4,164 bytes in 2 blocks 
==30039== indirectly lost: 53 bytes in 2 blocks 
==30039==  possibly lost: 2,427 bytes in 93 blocks 
==30039== still reachable: 4,212 bytes in 86 blocks 
==30039==   suppressed: 0 bytes in 0 blocks 
==30039== Rerun with --leak-check=full to see details of leaked memory 
==30039== 
==30039== For counts of detected and suppressed errors, rerun with: -v 
==30039== Use --track-origins=yes to see where uninitialised values come from 
==30039== ERROR SUMMARY: 15 errors from 9 contexts (suppressed: 0 from 0) 
Segmentation fault 
涉及本報告中的函數和類

零件如下所示:

RETURN::Return_t TaskCycle::GetTasksByTick(uint32_t tick, 
     std::vector<Task*>& Tasks) 
{ 
    Tasks.clear(); 
    if (GetTasks().empty()) 
     return RETURN::ERROR_UPDATING_TASK; 
    Task* task; 
    std::map<TaskID, Task*>::iterator iter = GetTasks().begin(); 
    while (iter != GetTasks().end()) 
    { 
     if (iter->second->GetTickExecution()== tick) **// Line: 52** 
     { 
      task = iter->second; 
      if(task->CanExecute()) 
      { 
      Tasks.push_back(task); 
      } 
     } 
     iter++;          **// Line: 63** 
    } 
    return RETURN::OK; 
} 

uint32_t Task::GetTickExecution() 
    { 
     return m_tickExecution; 
    } 

這是任務類,其中的TaskID是字符串類型的構造:

Task(TaskID name, uint32_t m_tickOffSet, uint32_t m_tickInterval, 
      uint32_t m_executionsPerCycle, TaskPriority::TaskPriority_t m_prio, 
      std::map<OperationID, Operation*> m_registeredOperations) : 
     m_name(name), m_tickOffSet(m_tickOffSet), 
       m_tickInterval(m_tickInterval), 
       m_executionsPerCycle(m_executionsPerCycle), m_prio(m_prio), 
       m_registeredOperations(m_registeredOperations) 

報告錯誤的方法只是一個Get方法,他返回一個無符號整型變量。

+0

如果您懷疑多線程可能是負責任的,請通過'valgrind --tool = helgrind'運行該程序。您的程序存在大量內存錯誤,其中每個錯誤都構成未定義的行爲,並可能對所有其他錯誤負責。你將不得不消除其中的每一個,最好按照時間順序。 –

+0

@mic_e運行helgrind工具: [代碼]過程與 == 30119 ==在地址0x547C20AA ==在30119 == 0x8078F65未映射區域內訪問信號的默認動作11(SIGSEGV)結束:SISCAT ::任務:: CanExecute()(Task.h:104) == 30119 == by 0x8081774:SISCAT :: TaskCycle :: GetTasksByTick(unsigned int,std :: vector >&)(TaskCycle.cpp:58)... [code] – lfelipem

+0

根據我的經驗,valgrind對於調試segfaults並不是很有用。應該定期使用它來檢查程序是否仍然正常工作,但是一旦出現段錯誤,您應該使用gdb來代替。 @lfelipem:那麼helgrind沒有發現任何錯誤?那是一種解脫。 –

回答

0

那麼你的問題到底是什麼?

如果您在代碼中發佈了文件名和行號,那麼人們可以將您的代碼與valgrind輸出中的行號進行匹配,這將非常有幫助。

==30039== Invalid read of size 4 
==30039== at 0x8081714: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:52) 

可能意味着你正在訪問一個空指針,或者未初始化的指針,在行號52,這

==30039== Invalid read of size 4 
==30039== at 0x4984BE5: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) 
==30039== by 0x80817A9: SISCAT::TaskCycle::GetTasksByTick(unsigned int, std::vector<SISCAT::Task*, std::allocator<SISCAT::Task*> >&) (TaskCycle.cpp:63) 

提示非常你傳遞一個空指針到std::_Rb_tree_increment。但是由於我們無法看到TaskCycle.cpp中的行號52和63,因此我們無法幫助解決這個問題。

如果我是你,我要麼使用調試器,要麼向valgrind報告的所有行號添加類似printf("xxx=%p\n", xxx)的東西(用所有在這些行上使用的指針替換xxx),以便查看哪些行號似乎是錯的。

+0

我用你提到的代碼編輯了代碼,我無法爲所有行編號。 – lfelipem

+0

當我嘗試打印指針時: == 30250 ==條件跳轉或移動取決於未初始化的值(s) == 30250 ==在0x6FEBC70:vfprintf(vfprintf。c:1629) == 30250 == by 0x6FF2EFE:printf(printf.c:35) == 30250 == by 0x80783B3:SISCAT :: Controller :: ExecuteCycle()(Controller.cpp:183) == 30250 == by 0x8078244:SISCAT :: Controller :: ClockCycle()(Controller.cpp:156) == 30250 == by 0x80781D5:SISCAT :: Controller :: StartClock()(Controller.cpp:146) == 30250 == by 0x8077B54:SISCAT :: Controller :: Initialize()(Controller.cpp:129)... – lfelipem

+0

然後很可能你的iter有問題。運行gdb,在第52行放置一個斷點,當你到達斷點時,打印它,打印它,打印它,直到你注意到什麼。你不檢查GetTasks()。begin()是否返回NULL,是否有可能不返回有效的迭代器? –

相關問題