Я ищу подсказки о том, как отлаживать сбой в приложении, которое использует оболочки 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-объект, который мог быть каким-либо образом освобожден, уничтожен или поврежден.Я пытаюсь выяснить, ЧТО происходит, когда указатель интерфейса может показаться действительным, но объект, стоящий за ним, каким-то образом обстрелян
Checking Assigned (aNode.ParentNode) возвращает TRUE, даже если, если вы пытаетесь выполнить приведение в отладчике (только во время выполнения, а не в коде), например:
- проверять / оценивать aNode
- проверять / оценивать TInterfacedObject (aNode) .ClassName (работает как минимум в Delphi 2010)Теперь в отладчике я вижу, что это NIL.Что может означать, что волшебная функция «приведение интерфейса к объекту», которая появилась в delphi 2010, не работает.
Я полагаю, что пытаюсь отладить проблему, когда кучи повреждены, или COMобъекты повреждены в куче из-за проблемы подсчета ссылок.
Я действительно считаю, что ни у кого не должно быть ситуации, когда интерфейс кажется действительным, но объект под ним был удален.Я действительно хотел бы знать, что делать и что происходит.