我怎样才能找出阻止我的物体正确处理的原因?

时间:2010-04-11 10:09:07

标签: .net debugging

我在C#中有一个相当大而复杂的游戏,其中有各种各样的怪物。 MonsterCreator在游戏中创建了怪物,每个怪物都有各种从外部DLL加载的插件。

当我的怪物死亡时,他们在MonsterCreator中调用一个方法,并且MonsterCreator将它们从游戏地图中移除,将它们从其自己的内部怪物列表中移除,然后最终在怪物本身上调用Dispose()方法。

dispose方法调用每个插件的dispose方法,然后清除它自己的任何代码。

这似乎工作正常,有很多怪物,但某个地方有一个虫子在一段时间后出现,怪物死亡,但它已经被移除 - 似乎回调告诉MonsterCreator被召唤并且,当第一次通话时应该移除怪物。

可能的候选者是怪物的一些插件用一个事件注册自己,该事件每隔X秒就会发出一次脉冲,这样它们就可以执行逻辑。逐步完成我可以看到他们在活动结束时没有注册活动,但有些事情仍然存在,我不知道它是什么。

您对调试问题有什么建议吗?我不能真正发布代码,因为它分散在大量的库和插件dll中,因此更多的是找出调试它的最佳方法。

我在代码中抛出一个异常,当怪物死了回调方法被抛出并且怪物在地图上找不到被删除,所以我有一个行为不端的怪物,有没有办法我可以看到还有什么链接到它?

2 个答案:

答案 0 :(得分:2)

您需要使用能够显示连接图的探查器。类似于红门ANTZ memory profiler

话虽如此,如果您正在使用事件,则需要确保取消注册。如果不这样做是.NET代码中内存泄漏的首要原因,因为事件仍然在调用列表中引用(因此也是对象)。

答案 1 :(得分:1)

请注意Dispose不会删除其他对象可能对您的Monster对象的引用!因此,引用Monster的其他对象可以报告Moster在实际死亡后死亡。

另一个流行的错误来源不是取消订阅事件:每个订阅Monster的事件都会(隐含地)引用Monster实例。

相关问题