InsightSoftwareConsortium / ITKPerformanceBenchmarking

Real-world tests to benchmark ITK performance.
https://www.insight-journal.org/browse/publication/972
Apache License 2.0
2 stars 8 forks source link

SegFault in RegionGrowing #55

Closed phcerdan closed 6 years ago

phcerdan commented 6 years ago

It is a bit random, I got it passing using only 1 thread, maybe 70% of my tries.

Config: CMAKE_BUILD_TYPE:STRING=Debug Command:

 /path/build-ITK-master-buildRelWithDebInfo/bin/RegionGrowingBenchmark /path/Modules/ITKPerformanceBenchmarking/build/examples/../BenchmarkResults/arch-home/__DATESTAMP__RegionGrowingBenchmark.json 3 2 /path/Modules/ITKPerformanceBenchmarking/build/ExternalData/examples/Data/Input/brainweb165a10f17.mha /path/Modules/ITKPerformanceBenchmarking/build/examples/Testing/RegionGrowingBenchmark.mha

Backtrace

(gdb) bt
#0  0x00007ffff7aeaa26 in malloc () from /usr/lib/libc.so.6
#1  0x00007ffff7cd35fd in operator new (sz=200) at /build/gcc/src/gcc/libstdc++-v3/libsupc++/new_op.cc:50
#2  0x0000555555626fde in __gnu_cxx::new_allocator<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::runLength>::allocate (this=0x55555670cd30, __n=5) at /usr/include/c++/8.2.1/ext/new_allocator.h:111
#3  0x0000555555623f90 in std::allocator_traits<std::allocator<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::runLength> >::allocate (__a=..., __n=5) at /usr/include/c++/8.2.1/bits/alloc_traits.h:436
#4  0x000055555561f9c4 in std::_Vector_base<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::runLength, std::allocator<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::runLength> >::_M_allocate (this=0x55555670cd30, __n=5)
    at /usr/include/c++/8.2.1/bits/stl_vector.h:296
#5  0x000055555561c1f2 in std::vector<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::runLength, std::allocator<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::runLength> >::_M_allocate_and_copy<__gnu_cxx::__normal_iterator<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::runLength const*, std::vector<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::runLength, std::allocator<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::runLength> > > > (this=0x55555670cd30, __n=5, __first=
  {length = 27, where = {static Dimension = <optimized out>, m_InternalArray = {0, 118, 90}}, label = 0}, __last=
  {length = 24, where = {static Dimension = <optimized out>, m_InternalArray = {157, 116, 90}}, label = 0}) at /usr/include/c++/8.2.1/bits/stl_vector.h:1398
#6  0x0000555555617253 in std::vector<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::runLength, std::allocator<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::runLength> >::operator= (this=0x55555670cd30,
    __x=std::vector of length 5, capacity 8 = {...}) at /usr/include/c++/8.2.1/bits/vector.tcc:214
#7  0x00005555556122d1 in itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::DynamicThreadedGenerateData (
    this=0x555555957250, outputRegionForThread=warning: RTTI symbol not found for class 'itk::ImageRegion<3u>'
...) at /path/src-ITK-master/Modules/Filtering/LabelMap/include/itkBinaryImageToLabelMapFilter.hxx:255
#8  0x00005555556110dc in itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsigned long, 3u> > >::GenerateData()::{lambda(itk::ImageRegion<3u> const&)#1}::operator()(itk::ImageRegion<3u> const&) const (this=0x555555957250, lambdaRegion=warning: RTTI symbol not found for class 'itk::ImageRegion<3u>'
...)
    at /path/src-ITK-master/Modules/Filtering/LabelMap/include/itkBinaryImageToLabelMapFilter.hxx:103
#9  0x000055555561af3d in std::_Function_handler<void (itk::ImageRegion<3u> const&), itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char, 3u>, itk::LabelMap<itk::ShapeLabelObject<unsign--Type <RET> for more, q to quit, c to continue without paging--c
ed long, 3u> > >::GenerateData()::{lambda(itk::ImageRegion<3u> const&)#1}>::_M_invoke(std::_Any_data const&, itk::ImageRegion<3u> const&) (__functor=..., __args#0=warning: RTTI symbol not found for class 'itk::ImageRegion<3u>'
...) at /usr/include/c++/8.2.1/bits/std_function.h:297
#10 0x00005555555cc88d in std::function<void (itk::ImageRegion<3u> const&)>::operator()(itk::ImageRegion<3u> const&) const (this=0x7fffffffd430, __args#0=warning: RTTI symbol not found for class 'itk::ImageRegion<3u>'
...) at /usr/include/c++/8.2.1/bits/std_function.h:687
#11 0x0000555555615f58 in itk::MultiThreaderBase::ParallelizeImageRegionRestrictDirection<3u>(unsigned int, itk::ImageRegion<3u> const&, std::function<void (itk::ImageRegion<3u> const&)>, itk::ProcessObject*)::{lambda(long const*, unsigned long const*)#1}::operator()(long const*, unsigned long const*) const (this=0x555555857330, index=0x5555559838d0, size=0x5555559838f0) at /path/src-ITK-master/Modules/Core/Common/include/itkMultiThreaderBase.h:325
#12 0x000055555561ee26 in std::_Function_handler<void (long const*, unsigned long const*), itk::MultiThreaderBase::ParallelizeImageRegionRestrictDirection<3u>(unsigned int, itk::ImageRegion<3u> const&, std::function<void (itk::ImageRegion<3u> const&)>, itk::ProcessObject*)::{lambda(long const*, unsigned long const*)#1}>::_M_invoke(std::_Any_data const&, long const*&&, unsigned long const*&&) (__functor=..., __args#0=@0x7ffff3a56ca0: 0x5555559838d0, __args#1=@0x7ffff3a56c98: 0x5555559838f0) at /usr/include/c++/8.2.1/bits/std_function.h:297
#13 0x000055555567c10d in std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void*>, std::__future_base::_Result_base::_Deleter>, std::__future_base::_Task_state<std::_Bind<itk::PoolMultiThreader::ParallelizeImageRegion(unsigned int, long const*, unsigned long const*, std::function<void (long const*, unsigned long const*)>, itk::ProcessObject*)::{lambda()#1} ()>, std::allocator<int>, void* ()>::_M_run()::{lambda()#1}, void*> >::_M_invoke(std::_Any_data const&) ()
#14 0x000055555567fe29 in std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) ()
#15 0x00007ffff7f6b4ff in __pthread_once_slow () from /usr/lib/libpthread.so.0
#16 0x000055555567c3c9 in std::__future_base::_Task_state<std::_Bind<itk::PoolMultiThreader::ParallelizeImageRegion(unsigned int, long const*, unsigned long const*, std::function<void (long const*, unsigned long const*)>, itk::ProcessObject*)::{lambda()#1} ()>, std::allocator<int>, void* ()>::_M_run() ()
#17 0x0000555555690b2a in itk::ThreadPool::ThreadExecute() ()
#18 0x00007ffff7cff063 in std::execute_native_thread_routine (__p=0x55555580e130) at /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80
#19 0x00007ffff7f63a9d in start_thread () from /usr/lib/libpthread.so.0
#20 0x00007ffff7b60a43 in clone () from /usr/lib/libc.so.6
jhlegarreta commented 6 years ago

Just thinking out loud @phcerdan, but if seeds are involved in the process, and when using multi-threading, does that imply some random seed initialization that is affected by the number of processes/threads?

I'm by no means an expert on this, but have learnt that such stuff affects results so as not to be deterministic in other contexts. Although that does not imply a segfault :confused:.

If that hypothesis is correct, may be @dzenanz can cast some light into the issue.

dzenanz commented 6 years ago

RegionGrowingBenchmark segfaults a lot on my Windows machine too. I thought it was some problem related to rebuilding or screwed up git checkout. Now I will look into it.

phcerdan commented 6 years ago

@jhlegarreta I haven't look into what's the problem, maybe related to itk::MultiThreaderBase::ParallelizeImageRegionRestrictDirection for this case (?) but @dzenan to the rescue! Thanks :sweat_smile:

dzenanz commented 6 years ago

The crash occurs in Modules\Filtering\LabelMap\include\itkBinaryImageToLabelMapFilter.hxx. I am looking into it right now.

dzenanz commented 6 years ago

This is a bug in ITK, not in PerformanceBenchmarking module.