gpt4 book ai didi

c# - CallbackOnCollectedDelegate - 当没有附加调试器时会发生什么?

转载 作者:行者123 更新时间:2023-11-30 22:39:38 26 4
gpt4 key购买 nike

我正在尝试诊断我们目前无法在调试环境中重现的客户端崩溃。

我正在尝试确定如果未附加调试器,CallbackOnCollectedDelegate MDA 通知(由第三方代码产生)是否会导致崩溃。

因此,问题是,第三方代码中导致收集的委托(delegate)回调的问题是否是此行为的原因 - 调试时出现 MDA 而未调试时出现客户端崩溃?

有关此 MDA 的信息:http://msdn.microsoft.com/en-us/library/43yky316(v=vs.80).aspx

最佳答案

如果您收到 MDA 警告,那么您肯定重现了该问题。是的,如果没有调试器,那将是一次严重的崩溃, native 代码在进行回调时会崩溃。将调用从 native 代码编码到托管代码的 stub 不再存在。 AVE 的可能性很高,尽管永远不会 100% 保证,因为在收集 stub 后重新使用内存位置时,内存位置可能引用有效地址。随机代码执行就是失败模式。这两种结果都非常丑陋且难以诊断,永远不要让它走到这一步。

这是由于没有存储对您传递给 native 代码的委托(delegate)的引用造成的。或者不让存储引用的对象保持事件状态,同样的事情。垃圾收集器看不到也不知道 native 代码正在使用 stub 。事实上,CLR 在收集委托(delegate)时销毁 stub ,这就是它管理 stub 的内存分配的方式。

您有责任确保这种情况不会发生。最常见的正确解决方案是将委托(delegate)对象引用存储在私有(private) static 变量中。只有当您明确告诉 native 代码不再进行回调时,才将其设置回 null。从不将其设置回 null 是很常见的。还要添加一个测试以确保它在分配变量之前为 null,如果不是则抛出 InvalidOperationException。如果您需要额外的间接级别,请使用 GCHandle.Alloc(Object)。相同的配方,在确定它是安全的之前不要调用 Free()。

关于c# - CallbackOnCollectedDelegate - 当没有附加调试器时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5621483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com