Estoy buscando consejos sobre cómo depurar un bloqueo en una aplicación que utiliza los contenedores MS XML en Delphi VCL. Sospecho que la corrupción de memoria, o algún tipo de cosa malvada y oscura ocurre entre objetos e interfaces, como errores de recuento de referencias o corrupción de montón. La pregunta es, en efecto: ¿cómo puedo depurar una falla?objetos Delphi, objetos NIL e interfaces
Este código particular hace un uso interno fuerte y se extiende en la base XmlIntf Interfaces (IXMLNode). ISomethingCustom es una interfaz que extiende IXMLNode. El problema ocurre cuando fallamos en algún lugar de una función recursiva que pasa un ISomethingCustom que también es (o admite también, en términos de interfaz) IXMLNode.
boolean UtilityFunction(aNode: ISomethingCustom):Boolean;
begin
if not Assigned(aNode) then exit; // this works. great.
if not Assigned(aNode.ParentNode) then exit; // this DOES NOT WORK.
// code that blows up if aNode.ParentNode is not assigned.
end;
la situación es que el ánodo es también IXMLNode, y se le asigna el valor IXMLNode.ParentNode (no nula), y sin embargo, apunta a un objeto COM que pueden haber sido liberado, destruido o dañado de alguna manera. Estoy tratando de averiguar QUÉ está sucediendo cuando un puntero de interfaz puede parecer válido, pero el objeto detrás de él se ha numerado de alguna manera.
Comprobación Asignado (aNode.ParentNode) devuelve verdadero, aun cuando, si tuviera que intentar un elenco en el depurador (en tiempo de ejecución solamente, no en el código), así:
- Inspeccionar/Evaluar ánodo
- una inspección/evaluar TInterfacedObject (ánodo) .ClassName (obras en Delphi 2010, al menos!)
- ahora fundido TWhateverClassNameYouGotBefore (ánodo).
- En el depurador ahora veo que esto es NIL. Lo que puede significar que está fallando la función mágica "fundición de interfaz de nuevo a objeto" que es nueva en delphi 2010.
Creo que estoy intentando depurar un problema donde los montones están dañados, o los objetos COM están corruptos en el montón, debido a un problema de conteo de referencias.
Realmente creo que nadie debería tener la situación donde una interfaz parece válida, pero el objeto de abajo ha sido eliminado. Realmente me gustaría saber qué hacer y qué está sucediendo.
Comprobando asignado (aNode.ParentNode) devuelve TRUE, incluso cuando TNode (aNode) .ParentNode es realmente NIL. <- ¿Está transfiriendo una interfaz a una referencia de objeto? –
Debe estar haciendo algo roto. No hacer ningún casting intencionalmente hasta que noté que algo está roto, entonces estoy haciendo moldes en la expresión de evaluación en el depurador, solo para ver si puedo ver algo sobre lo que hay detrás de la interfaz. :-) –