首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建tensorflow图时的异常CallbackOnCollectedDelegate

创建tensorflow图时的异常CallbackOnCollectedDelegate
EN

Stack Overflow用户
提问于 2017-09-09 14:30:08
回答 2查看 302关注 0票数 11

我尝试用TensorFlowSharp构建一个小型的tensorflow应用程序,有时我会收到这样的异常:

托管调试助手“CallbackOnCollectedDelegate”

对于函数TensorFlowSharp!TensorFlow.TFBuffer+BufferReleaseFunc::Invoke

我试着找出这意味着什么,但我没有完全理解这些解释。这是抛出异常的代码的一部分:

代码语言:javascript
复制
var graph = new TFGraph();
var model = File.ReadAllBytes(ModelsFile);
graph.Import(model, "");

有人知道我该怎么做才能防止这一例外吗?

布鲁诺

EN

回答 2

Stack Overflow用户

发布于 2017-09-14 05:49:28

我想这是TensorflowSharp中的一个bug。

此错误看起来像是CLR代码中通常不一致的访问冲突(通常只在重负载或随机次数的尝试中发生)。引用Microsoft 文档

如果将委托作为函数指针从托管代码封送到非托管代码,并且在委托被垃圾收集后将回调放在该函数指针上,则将激活callbackOnCollectedDelegate托管调试助手(MDA)。

当创建函数指针并向非托管代码公开的委托被垃圾收集时,会发生此类型的错误。当非托管组件试图调用函数指针时,它会生成访问冲突。故障出现是随机的,因为它取决于何时发生垃圾回收。

解析可能很困难,因为一旦将委托编组为非托管函数指针,垃圾回收器就无法跟踪其生存期。相反,需要在非托管函数指针的生存期内保留对委托的引用。为此,收集到的错误委托必须在TensorFlowShapr的代码(或您的代码)中识别。

您还可以启用gcUnmanagedToManaged MDA在每个回调进入运行时之前强制垃圾收集。这将通过确保垃圾回收总是在回调之前发生,从而消除垃圾回收带来的不确定性。知道收集了什么委托之后,更改代码,在封送处理的非托管函数指针的生存期内,在托管端保留对该委托的引用。

所以,我想最好把这件事报告给图书馆的制造者。

票数 2
EN

Stack Overflow用户

发布于 2017-09-16 08:58:28

对于这个bug,我只看到一个很好的候选者,那就是Buffer.cs中的委托。但是米格尔已经在7月27日修复了这个错误,即diff 就在这里。所以一定要更新你的副本。如果您从Nuget获得了它,那么请确保至少有1.30版本

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46131711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档