[Insight-developers] interrupting filter execution

Paul Koshevoy koshevoy at sci.utah.edu
Tue Jul 18 19:31:58 EDT 2006


For some reason, I can't catch the exception thrown in ProgressAccumulator.

I've modified the ProgressAccumulator::ReportProgress as follows:
  if( m_MiniPipelineFilter->GetAbortGenerateData() )
    {
    throw ExceptionObject();
    }


It crashes with the following stack trace:

FIXME: ABORT: DiscreteGaussianImageFilter
terminate called after throwing an instance of 'itk::ExceptionObject'
  what():  Unknown:0:
None

Program received signal SIGABRT, Aborted.
[Switching to Thread 1077832032 (LWP 27676)]
0x00002aaaacf8b43a in raise () from /lib64/tls/libc.so.6
(gdb) where 27
#0  0x00002aaaacf8b43a in raise () from /lib64/tls/libc.so.6
#1  0x00002aaaacf8c870 in abort () from /lib64/tls/libc.so.6
#2  0x00002aaaacbb68b0 in __gnu_cxx::__verbose_terminate_handler ()
   from /usr/lib64/libstdc++.so.6
#3  0x00002aaaacbb48e6 in __gxx_personality_v0 ()
   from /usr/lib64/libstdc++.so.6
#4  0x00002aaaacbb48bd in __gxx_personality_v0 ()
   from /usr/lib64/libstdc++.so.6
#5  0x00002aaaace58848 in _Unwind_ForcedUnwind () from /lib64/libgcc_s.so.1
#6  0x00002aaaace5892b in _Unwind_Resume () from /lib64/libgcc_s.so.1
#7  0x000000000062ab11 in itk::ProcessObject::UpdateProgress ()
#8  0x000000000044c569 in
itk::NeighborhoodOperatorImageFilter<itk::Image<float, 2u>,
itk::Image<float, 2u>, double>::ThreadedGenerateData (this=0x8670b54,
    outputRegionForThread=@0x403e43a0, threadId=1077821840)
    at
/usr/sci/crcns-data1/InsightToolkit-2.4.1/Code/BasicFilters/itkNeighborhoodOperatorImageFilter.txx:136
#9  0x00000000004332a1 in itk::ImageSource<itk::Image<float, 2u>
>::ThreaderCallback (arg=0x6c16)
    at
/usr/sci/crcns-data1/InsightToolkit-2.4.1/Code/Common/itkImageSource.txx:273
#10 0x00000000006222ea in itk::MultiThreader::SingleMethodExecute ()
#11 0x00000000004331e4 in itk::ImageSource<itk::Image<float, 2u>
>::GenerateData (this=0xf66770)
    at
/usr/sci/crcns-data1/InsightToolkit-2.4.1/Code/Common/itkImageSource.txx:229
#12 0x000000000062ce5a in itk::ProcessObject::UpdateOutputData ()
#13 0x000000000062cf3c in itk::ProcessObject::UpdateOutputData ()
#14 0x000000000044667c in itk::StreamingImageFilter<itk::Image<float,
2u>, itk::Image<float, 2u> >::UpdateOutputData (this=0xf67010)
    at
/usr/sci/crcns-data1/InsightToolkit-2.4.1/Code/BasicFilters/itkStreamingImageFilter.txx:159
#15 0x0000000000444a2c in
itk::DiscreteGaussianImageFilter<itk::Image<float, 2u>,
itk::Image<float, 2u> >::GenerateData (this=0x6c16)
    at
/usr/sci/crcns-data1/InsightToolkit-2.4.1/Code/BasicFilters/itkDiscreteGaussianImageFilter.txx:306
#16 0x000000000062ce5a in itk::ProcessObject::UpdateOutputData ()
#17 0x0000000000423e85 in smooth<itk::Image<float, 2u> > (in=0x403e5810,
    sigma=7.3376495356751903e-317, maximum_error=0.10000000000000001)
    at common.hxx:987
#18 0x0000000000424ab6 in shrink<itk::Image<unsigned char, 2u> >
(in=0x6c1c,
    shrink_factor=@0xe29ca0, maximum_error=0.10000000000000001)
    at common.hxx:1006
#19 0x0000000000424d63 in std_tile<itk::Image<unsigned char, 2u> > (
    fn_image=0x6c1c <Address 0x6c1c out of bounds>,
shrink_factor=@0xe29ca0,
    pixel_spacing=@0xcd74d0, blab=6) at common.hxx:3596
#20 0x000000000042a114 in ImageLoader::load_mosaic<itk::Image<unsigned
char, 2u> > (this=0xe29ca0, fn_mosaic=0x0, shrink_factor=@0x403e60a0,
    mosaic=@0x403e6090, mosaic_mask=@0x42a114) at ImageLoaderDialog.h:119
#21 0x0000000000413499 in ImageLoader::run (this=0xe29c80)
    at ImageLoaderDialog.cpp:81
#22 0x00002aaaac53e833 in QThreadPrivate::start ()
   from /usr/lib64/libQtCore.so.4
#23 0x00002aaaac8e8fa5 in start_thread () from /lib64/tls/libpthread.so.0
#24 0x00002aaaad019cb2 in clone () from /lib64/tls/libc.so.6
#25 0x0000000000000000 in ?? ()
#26 0x0000000000000000 in ?? ()
(More stack frames follow...)

My guess is I can't catch the exception because it was thrown from a
different thread than the one that has the try/catch block.
I have the following try/catch block (it can be seen as frame #20 in the
stack trace):

    try
    {
      if (load_mosaic<native_image_t>(qPrintable(source_),
                      shrink_factor_,
                      mosaic,
                      mask))
      {
    data_ready_ = true;
    emit statusUpdate(tr("Done "));
      }
      else
      {
    emit statusUpdate(tr("Aborted "));
      }
    }
    catch (itk::ExceptionObject & exception)
    {
      emit statusUpdate(tr(exception.GetDescription()));
    }
    catch (...)
    {
      emit statusUpdate(tr("FIXME: caught an unrecognized exception"));
    }


Karthik Krishnan wrote:
> Never mind.. I am stupid. Discard the earlier suggestion. The
> exception must be thrown by the filter, of course.., not you.
>
> That exception is also thrown by the filter or the progress reporter
> in the CompletedPixel method.
> http://www.itk.org/cgi-bin/viewcvs.cgi/Code/Common/itkProgressReporter.cxx?rev=1.8&root=Insight&view=markup
>
>
> It should likewise be thrown also in the
> ProgressAccumulator.cxx::ReportProgress method as in
> if (m_MiniPipelineFilter->GetAbortGenerateData())
>  {
>   throw ProgressAborted();
>  }
>
> That addition should fix it, I suppose. Could you check ?
>
> Thanks
> -karthik
>



More information about the Insight-developers mailing list