Я ищу подсказки о том, как отладить сбой в приложении, которое использует оболочки 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, даже если вы пытались выполнить приведение в отладчике (только во время выполнения, а не в коде), например:
Я считаю, что пытаюсь отладить проблему, когда кучи повреждены или COM-объекты повреждены в куче из-за проблемы с подсчетом ссылок.
Я действительно считаю, что никто никогда не должен иметь возникает ситуация, когда интерфейс кажется действительным, но объект под ним был удален. Я действительно хотел бы знать, что делать и что происходит.