[Insight-users] Malloc errors with repeated image IO??
Zachary Pincus
zpincus at stanford.edu
Tue Mar 21 14:20:30 EST 2006
Can anyone confirm that these malloc errors exist for them when
running the test cases below? I used a variety of tiff images to test
this, so maybe it is a tiff io problem?
Another possibility is that this task is outside the design range of
ITK, and there is some better way to read thousands of images off
disk and into memory?
Any insight into what's going on here would be rather helpful.
Zach
On Mar 19, 2006, at 6:43 PM, Zachary Pincus wrote:
> Hi folks,
>
> In the process of reading in many (!) image files and storing the
> resulting images away (as Image::Pointer objects in some list or
> vector), I have run into some strange malloc errors.
>
> Here are some test cases which seem to reproduce these errors. The
> code for the cases is at the end of this email; here follows
> descriptions of the tests and the malloc errors produced.
>
> I'm using a CVS checkout of ITK from shortly after the 2.6 release,
> on OS X 10.4.5. Everything is compiled with GCC 4.0.1.
>
> ******
> Case 0: [BASELINE] In a loop, create an ImageFileReader (and give
> it a valid file to read), and call Update(). The FileReader is
> destroyed and created anew each loop.
>
> No errors are produced.
>
>
> ******
> Case 1: In a loop, create an ImageFileReader, call Update(), and
> store the resulting image pointer in a std::vector. The FileReader
> is destroyed and created anew each loop.
>
> The errors are a flood of identical lines (down to the object
> address), e.g.:
>> itkTest(18420) malloc: *** error for object 0x7801600: incorrect
>> checksum for freed object - object was probably modified after
>> being freed, break at szone_error to debug
>> itkTest(18420) malloc: *** set a breakpoint in szone_error to debug
>
>
> ******
> Case 2: Create an ImageFileReader. In a loop, repeatedly call Update
> (), store the result away, and call DisconnectPipeline() so that
> the next loop through, a new image is created.
>
> The error is a few lines similar to those in case 1, and then other
> errors, culminating in an exception:
>> itkTest(24609) malloc: *** error for object 0x780ee00: incorrect
>> checksum for freed object - object was probably modified after
>> being freed, break at szone_error to debug
>> itkTest(24609) malloc: *** set a breakpoint in szone_error to debug
>> itkTest(24609) malloc: *** Deallocation of a pointer not
>> malloced: 0x80008; This could be a double free(), or free() called
>> with the middle of an allocated block; Try setting environment
>> variable MallocHelp to see tools to help debug
>> TIFFFillStrip: /Users/zpincus/Documents/Research/Theriot Lab/
>> Experimental Data/Catherine Keratocytes/Images3/summed/
>> 022505_antiV_1.tif: Data buffer too small to hold strip 0.
>>
>> itk::ExceptionObject (0x756ec30)
>> Location: "void itk::TIFFImageIO::ReadGenericImage(void*, unsigned
>> int, unsigned int)"
>> File: /Users/zpincus/Developer/ITK/Insight/Code/IO/itkTIFFImageIO.cxx
>> Line: 536
>> Description: itk::ERROR: TIFFImageIO(0x7573530): Problem reading
>> the row: 0
>
> Does anyone have any thoughts as to what could be happening?
>
> Zach Pincus
>
>
>
> CODE FOR CASE 0:
> ----------------
> #include "itkImage.h"
> #include "itkImageFileReader.h"
> #include <iostream>
>
> typedef itk::Image<float, 2> FImage;
> typedef itk::ImageFileReader<FImage> FReader;
>
> int main(int argc, char* argv[] )
> {
> if (argc < 2) return -1;
>
> for (int i = 0; i < 1000; i++)
> {
> try {
> FReader::Pointer fr = FReader::New();
> fr->SetFileName(argv[1]);
> fr->Update();
> } catch( itk::ExceptionObject & err ) {
> std::cout << err << std::endl;
> return -1;
> }
> }
> return 0;
> }
>
> CODE FOR CASE 1:
> ----------------
> #include "itkImage.h"
> #include "itkImageFileReader.h"
> #include <iostream>
> #include <vector>
>
> typedef itk::Image<float, 2> FImage;
> typedef itk::ImageFileReader<FImage> FReader;
> typedef std::vector<FImage::Pointer> FIPVector;
>
> int main(int argc, char* argv[] )
> {
> if (argc < 2) return -1;
>
> FIPVector vec;
> for (int i = 0; i < 1000; i++)
> {
> try {
> FReader::Pointer fr = FReader::New();
> fr->SetFileName(argv[1]);
> fr->Update();
> vec.push_back(fr->GetOutput());
> } catch( itk::ExceptionObject & err ) {
> std::cout << err << std::endl;
> return -1;
> }
> }
> return 0;
> }
>
> CODE FOR CASE 2:
> ----------------
> #include "itkImage.h"
> #include "itkImageFileReader.h"
> #include <iostream>
> #include <vector>
>
> typedef itk::Image<float, 2> FImage;
> typedef itk::ImageFileReader<FImage> FReader;
> typedef std::vector<FImage::Pointer> FIPVector;
>
> int main(int argc, char* argv[] )
> {
> if (argc < 2) return -1;
>
> FIPVector vec;
> FReader::Pointer fr = FReader::New();
> fr->SetFileName(argv[1]);
> for (int i = 0; i < 1000; i++)
> {
> try {
> fr->Update();
> vec.push_back(fr->GetOutput());
> fr->GetOutput()->DisconnectPipeline();
> } catch( itk::ExceptionObject & err ) {
> std::cout << err << std::endl;
> return -1;
> }
> }
> return 0;
> }
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
More information about the Insight-users
mailing list