C++ 读取DICOM文件时,ITK访问冲突错误处于发布模式,但未处于调试模式
我知道很多人都有发布和调试模式的问题。我已经搜索了很多,检查了程序的堆栈跟踪和指针。然而,我无法理解为什么我的程序在调试模式下工作得很好,而在发布模式下却出现访问冲突错误!我看到在ITK代码中深入一些步骤后,一个函数突然导致访问冲突。我将首先介绍我的代码,然后介绍导致此访问冲突的调用层次结构: 以下是我的类型定义:C++ 读取DICOM文件时,ITK访问冲突错误处于发布模式,但未处于调试模式,c++,memory,access-violation,itk,C++,Memory,Access Violation,Itk,我知道很多人都有发布和调试模式的问题。我已经搜索了很多,检查了程序的堆栈跟踪和指针。然而,我无法理解为什么我的程序在调试模式下工作得很好,而在发布模式下却出现访问冲突错误!我看到在ITK代码中深入一些步骤后,一个函数突然导致访问冲突。我将首先介绍我的代码,然后介绍导致此访问冲突的调用层次结构: 以下是我的类型定义: //typedef unsigned char PixelType; const unsigned int dimention = 3; //STD types typedef s
//typedef unsigned char PixelType;
const unsigned int dimention = 3;
//STD types
typedef std::vector<std::string> FileNamesContainer;
typedef std::vector<std::string> SeriesUIDContainer;
//ITK Types
typedef itk::DICOMSeriesFileNames NamesGeneratorType;
typedef itk::Image <signed short, dimention> ImageType; //Defining Image Type
typedef itk::ImageSeriesReader<ImageType> ReaderType; //Defining the type of the image series reader
//GDCM Types
typedef itk::GDCMImageIO DICOMImageIOType;
上述函数调用经过这一调用链,最终导致错误:
一,
二,
三,
五,
m_ImageIO->SetFileName(m_FileName.c_str());
m_ImageIO->ReadImageInformation()//模板void ImageFileReader::GenerateOutputInformation(void)
在步骤5中,第一行没有问题,第二行导致访问冲突。它甚至不让我穿过它。我正在使用VisualStudio2010。非常感谢您的回答。尝试使用(WinSDK的调试工具中提供)或appverifier(我认为WinSDK中也有)
在应用程序上启用gflag(在调试模式下)时,它将发现内存中发生的所有令人讨厌的事情,并在发生错误时立即引发断点尝试使用(在WinSDK的调试工具中提供)或appverifier(我想它也在WinSDK中)
在应用程序上启用gflag(在调试模式下)时,它将发现内存中发生的所有令人讨厌的事情,并在发生不好的事情时立即引发断点谢谢Paolo的回答。我同时尝试了几件事,直到现在我找到了解决办法!虽然我不能真正让gflags运行我的程序,但因为我有一种直觉,认为问题并不真正在代码中,所以我没有在代码上投入太多时间 不管怎样,这就是我所做的和解决问题的方法: 我从ITK网站上下载了一个名为resampleDICOM的样本,并对其进行了编译,结果遇到了完全相同的问题。所以最初我认为这是一个ITK错误。然后我用debug(RelWithDebInfo)在发布模式下重新编译了ITK,这样我可以在发布模式下调试时进入ITK代码。令我惊讶的是,一个与GDCMImageIO::MetaDataDictionary相关的完全有效的指针突然变成了一个坏指针(),而没有任何代码影响它。所以我意识到应该有一堆腐败的地方!我也知道导致这种腐败的原因不可能出现在我的代码中 所以我读了太多的线程,混合使用Debug和Release.lib和.dll文件会让事情变得非常糟糕。但我确信我使用的是ITK release.lib文件和.dll文件,因为我检查了很多次!我是说任何时候!我正要从阳台上跳下来结束这种痛苦,我有这个想法只是为了确保我的程序没有使用ITK调试编译中的任何内容因此,我将ITK调试文件夹的名称更改为其他名称,并在发布模式下运行我的程序,突然:
ITKCommon.dll is missing!
尽管我将visual studio中的所有文件夹和所有设置都设置为使用发行版文件夹,我的程序在运行时使用了调试文件夹中的ITKCommon.dll。所以我将发行版中的ITKCommon.dll复制到发行版文件夹中,瞧!我的程序非常有效 谢谢保罗的回答。我同时尝试了几件事,直到现在我找到了解决办法!虽然我不能真正让gflags运行我的程序,但因为我有一种直觉,认为问题并不真正在代码中,所以我没有在代码上投入太多时间 不管怎样,这就是我所做的和解决问题的方法: 我从ITK网站上下载了一个名为resampleDICOM的样本,并对其进行了编译,结果遇到了完全相同的问题。所以最初我认为这是一个ITK错误。然后我用debug(RelWithDebInfo)在发布模式下重新编译了ITK,这样我可以在发布模式下调试时进入ITK代码。令我惊讶的是,一个与GDCMImageIO::MetaDataDictionary相关的完全有效的指针突然变成了一个坏指针(),而没有任何代码影响它。所以我意识到应该有一堆腐败的地方!我也知道导致这种腐败的原因不可能出现在我的代码中 所以我读了太多的线程,混合使用Debug和Release.lib和.dll文件会让事情变得非常糟糕。但我确信我使用的是ITK release.lib文件和.dll文件,因为我检查了很多次!我是说任何时候!我正要从阳台上跳下来结束这种痛苦,我有这个想法只是为了确保我的程序没有使用ITK调试编译中的任何内容因此,我将ITK调试文件夹的名称更改为其他名称,并在发布模式下运行我的程序,突然:
ITKCommon.dll is missing!
尽管我将visual studio中的所有文件夹和所有设置都设置为使用发行版文件夹,我的程序在运行时使用了调试文件夹中的ITKCommon.dll。所以我将发行版中的ITKCommon.dll复制到发行版文件夹中,瞧!我的程序非常有效
this->UpdateOutputInformation(); //void ProcessObject::UpdateLargestPossibleRegion()
this->GenerateOutputInformation(); //void ProcessObject::Update()
reader->UpdateOutputInformation(); //template <class TOutputImage> void ImageSeriesReader<TOutputImage>::GenerateOutputInformation(void)
this->GenerateOutputInformation(); //void ProcessObject::UpdateOutputInformation()
m_ImageIO->SetFileName(m_FileName.c_str());
m_ImageIO->ReadImageInformation(); //template <class TOutputImage, class ConvertPixelTraits> void ImageFileReader<TOutputImage, ConvertPixelTraits> ::GenerateOutputInformation(void)
ITKCommon.dll is missing!