Я ищу подсказки о том, как отладить сбой в приложении, использующем обертку MS XML в Delphi VCL. Я подозреваю, что повреждение памяти или какое-то неясное зло происходит между объектами и интерфейсами, такими как ошибки подсчета ссылок или повреждение кучи. Вопрос в том, что: как мне отлаживать такой крах?Объекты Delphi, объекты NIL и интерфейсы
Этот конкретный код делает интенсивное внутреннее использование и распространяется на базовые интерфейсы 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;
Ситуация такова, что Анод также IXMLNode и значение IXMLNode.ParentNode назначается (не ноль), и все же он указывает на COM-объект, который может быть освобожден, уничтоженного или испорченного каким-то образом. Я пытаюсь выяснить, что происходит, когда указатель интерфейса может оказаться действительным, но объект позади него каким-то образом укутан.
Проверка Assigned (aNode.ParentNode) возвращает TRUE, даже когда, если вы должны были попытаться бросок в отладчике (во время выполнения только, а не в коде), как это:
- осмотр/оценить анодные
- инспектировать/оценить TInterfacedObject (анод) .ClassName (работает в Delphi 2010, по крайней мере!)
- бросить теперь TWhateverClassNameYouGotBefore (анод).
- В отладчике теперь я вижу, что это NIL. Который может означать, что волшебный «интерфейс литья назад к функция объекта, которая является новой в delphi 2010, терпит неудачу.
Я считаю, что пытаюсь отладить проблему, когда кучи повреждены, или COM-объекты повреждены в куче из-за проблемы подсчета ссылок.
Я действительно думаю, что когда-нибудь возникнет ситуация, когда интерфейс окажется действительным, но объект под ним был удален. Я действительно хотел бы знать, что делать, и что происходит.
Проверка присвоенного (aNode.ParentNode) возвращает TRUE, даже если TNode (aNode) .ParentNode - фактически NIL. <- Вы возвращаете интерфейс обратно к ссылке на объект? –
Должно быть, что-то сломалось. Не намеренно делать кастинг, пока ПОСЛЕ того, что я не заметил, что что-то сломано, я делаю отбрасывания в выражении-оценке в отладчике, просто чтобы увидеть, могу ли я увидеть что-нибудь о том, что находится за интерфейсом. :-) –