Szukam wskazówek, jak debugować awarię w aplikacji, która używa obwolut XML XML w Delphi VCL. Podejrzewam, że zepsuło się pamięć lub jakieś niejasne zło dzieje się między obiektami i interfejsami, takie jak błędy liczące odniesienia lub korupcja sterty. Pytanie brzmi: w jaki sposób mogę debugować taką awarię?Obiekty Delphi, obiekty NIL i interfejsy
Ten konkretny kod intensywnie wykorzystuje wewnętrzne interfejsy XmlIntf (IXMLNode) i rozszerza je. ISomethingCustom to interfejs, który rozszerza IXMLNode. Problem pojawia się tam, gdzie zawieszamy się gdzieś w funkcji rekurencyjnej, która jest przekazywana przez ISomethingCustom, który jest również (lub obsługuje również, w kategoriach interfejsu) 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;
Sytuacja jest taka, że anoda jest również IXMLNode, a wartość IXMLNode.ParentNode jest przypisany (nie zero), a mimo to wskazuje na obiekt COM, które mogły zostać uwolniony, zniszczony lub uszkodzony w jakiś sposób. Próbuję dowiedzieć się, CO dzieje się, gdy wskaźnik interfejsu może wydawać się poprawny, ale obiekt za nim został nuked jakoś.
Sprawdzanie określony cel (aNode.ParentNode) zwraca TRUE, nawet jeśli były do próby oddanych w debugger (tylko w czasie wykonywania, a nie w kodzie), podobnie jak to:
- skontrolować/oceny anoda
- sprawdzić/ocenić TInterfacedObject (anoda) .nazwaklasy (prac w Delphi 2010, co najmniej!)
- teraz rzucać TWhateverClassNameYouGotBefore (anoda).
- W debugerze widzę teraz, że jest to NIL. Co może oznaczać, że magiczny "interfejs rzutowania z powrotem do obiektu" cecha, która jest nowa w delphi 2010, nie działa.
Wierzę, że próbuję debugować problem, w którym hałdy są uszkodzone, lub obiekty COM są uszkodzone na stercie, z powodu problemu z licznikiem odniesień.
Naprawdę myślę, że nikt nigdy nie powinien mieć sytuacji, w której interfejs wydaje się prawidłowy, ale obiekt pod spodem został usunięty. Naprawdę chciałbym wiedzieć, co robić i co się dzieje.
Sprawdzanie przypisane (aNode.ParentNode) zwraca TRUE, nawet jeśli TNode (aNode) .ParentNode jest faktycznie NIL. <- Czy przesyłasz interfejs do odwołania do obiektu? –
Musimy robić coś zepsutego. Nie celowo wykonuję castingu, dopóki PO Zauważeniu, że coś nie jest zepsute, wykonuję rzuty w wyrażeniu-wyrażeniu w debugerze, tylko po to, aby zobaczyć, czy widzę coś, co kryje się za interfejsem. :-) –