Peter Bell ran into a circular reference problem when using CFDump. He kept getting 500 null because CFDump was entering an infinite loop and basically crapping out. The beauty of CFDump, though is that it provides a really great way of dealing with this. The CFDump TOP attribute limits the levels to which the CFDump algorithm will traverse.
To demonstrate this, let's store an object in the REQUEST scope that has a pointer to its parent scope, REQUEST. The circular reference here is pretty obvious:
<!--- Store an object in REQUEST. ---> <cfset REQUEST.Object = StructNew() /> <!--- Set the parent scope of the object. This should create a circular variarable reference. ---> <cfset REQUEST.Object.ParentScope = REQUEST /> <!--- Set some other variables for fun. ---> <cfset REQUEST.Object.Type = "Struct" /> <cfset REQUEST.Object.ID = "TEST_CFDUMP" />
Now, let' drying calling CFDump on this object. We know that this will go infinitely, so let's only go over 5 iterations:
<!--- Now, we want to try different values of CFDump's TOP attribute to see how it handles circular references. ---> <cfloop index="intDepth" from="1" to="5" step="1"> <h3> CFDump Depth: #intDepth# </h3> <!--- CFDump out this object at the given depth. ---> <cfdump var="#REQUEST.Object#" label="REQUEST.Object" top="#ToString( intDepth )#" /> </cfloop>
Before we look at what this outputs, notice that I am calling ToString() on the depth variable that I pass to CFDump. This seems odd, and it is, but for some reason, if I try to just pass a numeric value to this attribute, I get the following error:
Invalid parameter type. The value specified, "1.0", must be a valid Integer.
Not sure why, but converting it to a string first seems to do the trick. This is what is output per iteration: