[vtkusers] Help with crashes in VTK
Jonathan Morra
jonmorra at gmail.com
Wed Sep 7 17:14:48 EDT 2011
So I was playing around with removing vtkSmartPointers passed by reference
to see if that fixed my issue.
1. Would passing a vtkSmartPointer by const reference be an issue?
2. I got the following crash outlined below. It does not reference any
code I wrote at all. Also in my debugger it says that there are 2 vtk
garbage collection threads running. My understanding of smart pointers is
that a garbage collector is unnecessary because if the reference count = 0
then the object is removed. Also, what could cause this crash?
Thread 1 stack trace
cccccccc()
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x0687f280) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x179ff5f4) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f82880, void * ptr=0x04047640) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f82880, void * ptr=0x04047640, const char * __formal=0x6490d51c)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x179ffd90, vtkObjectBase * obj=0x03f82880, void * ptr=0x04047640,
const char * desc=0x6490d51c) Line 1069 C++
vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
* collector=0x179ffd90, vtkInformation * & ptr=, const char *
desc=0x6490d51c) Line 201 + 0x18 bytes C++
vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
collector=0x179ffd90) Line 1022 C++
vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
collector=0x179ffd90) Line 351 C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x0687f168) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x179ff718) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x04047618, void * ptr=0x06bf9270) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x04047618, void * ptr=0x06bf9270, const char * __formal=0x6490cc14)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x179ffd90, vtkObjectBase * obj=0x04047618, void * ptr=0x06bf9270,
const char * desc=0x6490cc14) Line 1069 C++
vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
* collector=0x179ffd90, vtkObjectBase * & ptr=, const char *
desc=0x6490cc14) Line 201 + 0x17 bytes C++
vtkCommon.dll!vtkInformation::ReportAsObjectBase(vtkInformationKey *
key=0x03ef5f78, vtkGarbageCollector * collector=0x179ffd90) Line 826 + 0x16
bytes C++
vtkCommon.dll!vtkInformationKey::ReportAsObjectBase(vtkInformation *
info=0x03f86bd8, vtkGarbageCollector * collector=0x179ffd90) Line 136 C++
vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
collector=0x179ffd90) Line 812 + 0xc bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x0687f248) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x179ff864) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f86bd8, void * ptr=0x03f84698) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f86bd8, void * ptr=0x03f84698, const char * __formal=0x6571055c)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x179ffd90, vtkObjectBase * obj=0x03f86bd8, void * ptr=0x03f84698,
const char * desc=0x6571055c) Line 1069 C++
vtkCommon.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
* collector=0x179ffd90, vtkInformation * & ptr=, const char *
desc=0x6571055c) Line 201 + 0x17 bytes C++
vtkCommon.dll!vtkInformationVector::ReportReferences(vtkGarbageCollector *
collector=0x179ffd90) Line 227 + 0x28 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x06983e58) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x179ff980) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f85968, void * ptr=0x03c6bb08) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f85968, void * ptr=0x03c6bb08, const char * __formal=0x64910f5c)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x179ffd90, vtkObjectBase * obj=0x03f85968, void * ptr=0x03c6bb08,
const char * desc=0x64910f5c) Line 1069 C++
vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformationVector>(vtkGarbageCollector
* collector=0x179ffd90, vtkInformationVector * & ptr=, const char *
desc=0x64910f5c) Line 201 + 0x18 bytes C++
vtkFiltering.dll!vtkExecutive::ReportReferences(vtkGarbageCollector *
collector=0x179ffd90) Line 306 + 0xf bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x06983c60) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x179ffa9c) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03c6bae0, void * ptr=0x03fd5f44) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03c6bae0, void * ptr=0x03fd5f44, const char * __formal=0x64910cac)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x179ffd90, vtkObjectBase * obj=0x03c6bae0, void * ptr=0x03fd5f44,
const char * desc=0x64910cac) Line 1069 C++
vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
* collector=0x179ffd90, vtkObjectBase * & ptr=, const char *
desc=0x64910cac) Line 201 + 0x17 bytes C++
vtkCommon.dll!vtkSmartPointerBase::Report(vtkGarbageCollector *
collector=0x179ffd90, const char * desc=0x64910cac) Line 96 + 0x10 bytes
C++
vtkFiltering.dll!vtkInformationExecutivePortKey::Report(vtkInformation *
info=0x03f84158, vtkGarbageCollector * collector=0x179ffd90) Line 157 +
0x17 bytes C++
vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
collector=0x179ffd90) Line 812 + 0xc bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x06983d08) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x179ffbe0) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f84158, void * ptr=0x04047464) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f84158, void * ptr=0x04047464, const char * __formal=0x6490d504)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x179ffd90, vtkObjectBase * obj=0x03f84158, void * ptr=0x04047464,
const char * desc=0x6490d504) Line 1069 C++
vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
* collector=0x179ffd90, vtkInformation * & ptr=, const char *
desc=0x6490d504) Line 201 + 0x18 bytes C++
vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
collector=0x179ffd90) Line 1022 + 0xf bytes C++
vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
collector=0x179ffd90) Line 351 C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x06983b48) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x02fe0000) Line 522 + 0x8 bytes C++
kernel32.dll!762214dd()
[Frames below may be incorrect and/or missing, no symbols loaded for
kernel32.dll]
msvcr90.dll!73193c3a()
msvcr90.dll!731534c7()
kernel32.dll!7622339a()
ntdll.dll!76f69ed2()
ntdll.dll!76f69ea5()
Thread 2 stack trace
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x06718db8) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x17aff5f4) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f82880, void * ptr=0x04047640) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f82880, void * ptr=0x04047640, const char * __formal=0x6490d51c)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x17affd90, vtkObjectBase * obj=0x03f82880, void * ptr=0x04047640,
const char * desc=0x6490d51c) Line 1069 C++
vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
* collector=0x17affd90, vtkInformation * & ptr=, const char *
desc=0x6490d51c) Line 201 + 0x18 bytes C++
vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
collector=0x17affd90) Line 1022 C++
vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
collector=0x17affd90) Line 351 C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x06679c80) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x17aff718) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x04047618, void * ptr=0x06bf9270) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x04047618, void * ptr=0x06bf9270, const char * __formal=0x6490cc14)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x17affd90, vtkObjectBase * obj=0x04047618, void * ptr=0x06bf9270,
const char * desc=0x6490cc14) Line 1069 C++
vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
* collector=0x17affd90, vtkObjectBase * & ptr=, const char *
desc=0x6490cc14) Line 201 + 0x17 bytes C++
vtkCommon.dll!vtkInformation::ReportAsObjectBase(vtkInformationKey *
key=0x03ef5f78, vtkGarbageCollector * collector=0x17affd90) Line 826 + 0x16
bytes C++
vtkCommon.dll!vtkInformationKey::ReportAsObjectBase(vtkInformation *
info=0x03f86bd8, vtkGarbageCollector * collector=0x17affd90) Line 136 C++
vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
collector=0x17affd90) Line 812 + 0xc bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x06679c10) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x17aff864) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f86bd8, void * ptr=0x03f84698) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f86bd8, void * ptr=0x03f84698, const char * __formal=0x6571055c)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x17affd90, vtkObjectBase * obj=0x03f86bd8, void * ptr=0x03f84698,
const char * desc=0x6571055c) Line 1069 C++
vtkCommon.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
* collector=0x17affd90, vtkInformation * & ptr=, const char *
desc=0x6571055c) Line 201 + 0x17 bytes C++
vtkCommon.dll!vtkInformationVector::ReportReferences(vtkGarbageCollector *
collector=0x17affd90) Line 227 + 0x28 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x06717548) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x17aff980) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f85968, void * ptr=0x03c6bb08) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f85968, void * ptr=0x03c6bb08, const char * __formal=0x64910f5c)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x17affd90, vtkObjectBase * obj=0x03f85968, void * ptr=0x03c6bb08,
const char * desc=0x64910f5c) Line 1069 C++
vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformationVector>(vtkGarbageCollector
* collector=0x17affd90, vtkInformationVector * & ptr=, const char *
desc=0x64910f5c) Line 201 + 0x18 bytes C++
vtkFiltering.dll!vtkExecutive::ReportReferences(vtkGarbageCollector *
collector=0x17affd90) Line 306 + 0xf bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x067174d8) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x17affa9c) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03c6bae0, void * ptr=0x03fd6624) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03c6bae0, void * ptr=0x03fd6624, const char * __formal=0x64910cac)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x17affd90, vtkObjectBase * obj=0x03c6bae0, void * ptr=0x03fd6624,
const char * desc=0x64910cac) Line 1069 C++
vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
* collector=0x17affd90, vtkObjectBase * & ptr=, const char *
desc=0x64910cac) Line 201 + 0x17 bytes C++
vtkCommon.dll!vtkSmartPointerBase::Report(vtkGarbageCollector *
collector=0x17affd90, const char * desc=0x64910cac) Line 96 + 0x10 bytes
C++
vtkFiltering.dll!vtkInformationExecutivePortKey::Report(vtkInformation *
info=0x03f84b30, vtkGarbageCollector * collector=0x17affd90) Line 157 +
0x17 bytes C++
vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
collector=0x17affd90) Line 812 + 0xc bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x067173f8) Line 552 C++
vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x17affbe0) Line 522 + 0x8 bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f84b30, void * ptr=0x04046ce4) Line 639 C++
vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
obj=0x03f84b30, void * ptr=0x04046ce4, const char * __formal=0x6490d504)
Line 602 C++
vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
collector=0x17affd90, vtkObjectBase * obj=0x03f84b30, void * ptr=0x04046ce4,
const char * desc=0x6490d504) Line 1069 C++
vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
* collector=0x17affd90, vtkInformation * & ptr=, const char *
desc=0x6490d504) Line 201 + 0x18 bytes C++
vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
collector=0x17affd90) Line 1022 + 0xf bytes C++
vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
collector=0x17affd90) Line 351 C++
vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
obj=0x067175f0) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
obj=0x00000000) Line 522 + 0x8 bytes C++
QtGui4.dll!009284f2()
kernel32.dll!762214dd()
msvcr90.dll!73193c3a()
msvcr90.dll!731534c7()
kernel32.dll!7622339a()
ntdll.dll!76f69ed2()
ntdll.dll!76f69ea5()
On Wed, Sep 7, 2011 at 9:45 AM, Xiaofeng Z <xf10036 at hotmail.com> wrote:
> >I've been using vtkImageData::New(), followed by
> vtkImageData->DeepCopy(filter->GetOutput()). I've been doing this cause I
> notice that once I delete the filter the output no longer exists.
>
> Don't deep copy the image, instead do:
>
> vtkImageData* filterOutput = filter->GetOutput();
> filterOutput->Register(0); // increment the ref count
>
> to keep the output in the memory.
>
> Just make sure you pair off every New() or Register() with a Delete().
>
> BTW, I'm not for or against the use of smart pointer for any fundamental
> reason. If one knows very well how a smart pointer class works, using
> the smart pointer to left the burden of tracking memory allocation can be
> very helpful. When I do decided to use smart pointer, I use it exclusively,
> much like in Java where every variable is a managed smart pointer. Mixing
> the usage of smart pointers and naked pointers is where trouble comes in.
>
> HTH
>
> On Tue, Sep 6, 2011 at 11:55 AM, David Gobbi <david.gobbi at gmail.com>wrote:
>
> On Tue, Sep 6, 2011 at 12:34 PM, Jonathan Morra <jonmorra at gmail.com>wrote:
>
> This could make sense, I'm going to try and change all my method signatures
> to pass around const references to vtkSmartPointers where appropriate. Do
> you know what happens to the reference count upon returning a
> vtkSmartPointer?
>
>
>
> In VTK, smart pointers should only be used to store references, not to pass
> them. VTK methods should take regular pointers as arguments.
>
> The general rules are:
>
> 1) Refcounts are not automatically incremented when objects are returned,
> i.e. when an object is returned to you, then you are just "borrowing" it.
> If you need to own it for a while, then store it in a smart pointer.
>
> 2) Refcounts are not automatically incremented when objects are passed to a
> method. If a method needs to own the object for a while, it should store it
> in a smart pointer. All methods in the VTK libraries that need to own the
> objects that are passed to them will increment the refcount of those
> objects, either by storing it in a smart pointer or by calling Register() on
> it.
>
> There are a few very rare exceptions to rule #1, such as the NewInstance()
> method.
>
> - David
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20110907/9357eb6c/attachment.htm>
More information about the vtkusers
mailing list