Объекты Delphi, объекты NIL и интерфейсы

Я ищу подсказки о том, как отладить сбой в приложении, которое использует оболочки MS XML в Delphi VCL. Я подозреваю, что между объектами и интерфейсами происходит повреждение памяти или какие-то неясные злые вещи, такие как ошибки подсчета ссылок или повреждение кучи. Фактически возникает вопрос: как мне отладить такой сбой?

Этот конкретный код интенсивно внутренне использует и расширяет базовые интерфейсы XmlIntf (IXMLNode). ISomethingCustom - это интерфейс, расширяющий IXMLNode. Проблема возникает, когда происходит сбой где-то в рекурсивной функции, которой передается ISomethingCustom, который также является (или поддерживает также в терминах интерфейса) 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;

Ситуация такова, что aNode также является IXMLNode, и ему присваивается значение IXMLNode.ParentNode. (не nil), но он указывает на COM-объект, который мог быть освобожден, уничтожен, или как-то испорчены. Я пытаюсь понять, ЧТО происходит, когда указатель интерфейса может показаться действительным, но объект, стоящий за ним, каким-то образом был уничтожен.

Проверка назначенного (aNode.ParentNode) возвращает TRUE, даже если вы пытались выполнить приведение в отладчике (только во время выполнения, а не в коде), например:

  1. проверить / оценить узел
  2. проверить / оценить TInterfacedObject (aNode) .ClassName (работает, по крайней мере, в Delphi 2010!)
  3. теперь приведен к TWitherClassNameYouGotBefore (aNode).
  4. Теперь в отладчике я вижу, что это NIL. Что может означать, что волшебный "интерфейс трансляции обратно в объект "особенность, которая является новой в delphi 2010 дает сбой.

Я считаю, что пытаюсь отладить проблему, когда кучи повреждены или COM-объекты повреждены в куче из-за проблемы с подсчетом ссылок.

Я действительно считаю, что никто никогда не должен иметь возникает ситуация, когда интерфейс кажется действительным, но объект под ним был удален. Я действительно хотел бы знать, что делать и что происходит.

6
задан Warren P 13 September 2010 в 20:57
поделиться