我正在寻找有关如何调试使用Delphi VCL中的MS XML包装器的应用程序崩溃的提示。我怀疑是内存损坏或某种在对象和接口之间发生的晦涩的恶魔般的事情,例如引用计数错误或堆损坏。问题实际上是:我该如何调试此类崩溃?
这段特定的代码在基本XmlIntf接口(IXMLNode)上进行了大量的内部使用和扩展。ISomethingCustom是一个扩展IXMLNode的接口。问题出现在我们在递归函数中崩溃的地方,该函数传递了一个ISomethingCustom,它也是IXMLNode(或在接口术语中支持)。
情况是aNode也是IXMLNode,而且IXMLNode.ParentNode的值被赋值(不为nil),但它指向的COM对象可能已经被释放、销毁或以某种方式损坏。我正在试图弄清楚当接口指针似乎有效但其背后的对象已被删除时发生了什么。
检查Assigned(aNode.ParentNode)返回TRUE,即使在调试器中尝试转换(仅在运行时,而不是在代码中)也是如此:
1.检查/评估aNode 2.检查/评估TInterfacedObject(aNode).ClassName(至少在Delphi 2010中有效!) 3.现在将TWhateverClassNameYouGotBefore(aNode)进行转换。 4.在调试器中,我现在看到这是NIL。这可能意味着Delphi 2010中新的“将接口转换回对象”的魔术功能失败了。
我认为我正在尝试调试一个堆损坏或COM对象在堆上损坏的问题,因为存在引用计数问题。
我真的认为没有人应该遇到接口似乎有效但底层对象已被删除的情况。我真的想知道该怎么做,以及发生了什么。
这段特定的代码在基本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对象可能已经被释放、销毁或以某种方式损坏。我正在试图弄清楚当接口指针似乎有效但其背后的对象已被删除时发生了什么。
检查Assigned(aNode.ParentNode)返回TRUE,即使在调试器中尝试转换(仅在运行时,而不是在代码中)也是如此:
1.检查/评估aNode 2.检查/评估TInterfacedObject(aNode).ClassName(至少在Delphi 2010中有效!) 3.现在将TWhateverClassNameYouGotBefore(aNode)进行转换。 4.在调试器中,我现在看到这是NIL。这可能意味着Delphi 2010中新的“将接口转换回对象”的魔术功能失败了。
我认为我正在尝试调试一个堆损坏或COM对象在堆上损坏的问题,因为存在引用计数问题。
我真的认为没有人应该遇到接口似乎有效但底层对象已被删除的情况。我真的想知道该怎么做,以及发生了什么。