我尝试用TensorFlowSharp构建一个小型的tensorflow应用程序,有时我会收到这样的异常:
托管调试助手“CallbackOnCollectedDelegate”
对于函数TensorFlowSharp!TensorFlow.TFBuffer+BufferReleaseFunc::Invoke
我试着找出这意味着什么,但我没有完全理解这些解释。这是抛出异常的代码的一部分:
var graph = new TFGraph();
var model = File.ReadAllBytes(ModelsFile);
graph.Import(model, "");有人知道我该怎么做才能防止这一例外吗?
布鲁诺
发布于 2017-09-14 05:49:28
我想这是TensorflowSharp中的一个bug。
此错误看起来像是CLR代码中通常不一致的访问冲突(通常只在重负载或随机次数的尝试中发生)。引用Microsoft 文档
如果将委托作为函数指针从托管代码封送到非托管代码,并且在委托被垃圾收集后将回调放在该函数指针上,则将激活
callbackOnCollectedDelegate托管调试助手(MDA)。
当创建函数指针并向非托管代码公开的委托被垃圾收集时,会发生此类型的错误。当非托管组件试图调用函数指针时,它会生成访问冲突。故障出现是随机的,因为它取决于何时发生垃圾回收。
解析可能很困难,因为一旦将委托编组为非托管函数指针,垃圾回收器就无法跟踪其生存期。相反,需要在非托管函数指针的生存期内保留对委托的引用。为此,收集到的错误委托必须在TensorFlowShapr的代码(或您的代码)中识别。
您还可以启用gcUnmanagedToManaged MDA在每个回调进入运行时之前强制垃圾收集。这将通过确保垃圾回收总是在回调之前发生,从而消除垃圾回收带来的不确定性。知道收集了什么委托之后,更改代码,在封送处理的非托管函数指针的生存期内,在托管端保留对该委托的引用。
所以,我想最好把这件事报告给图书馆的制造者。
发布于 2017-09-16 08:58:28
对于这个bug,我只看到一个很好的候选者,那就是Buffer.cs中的委托。但是米格尔已经在7月27日修复了这个错误,即diff 就在这里。所以一定要更新你的副本。如果您从Nuget获得了它,那么请确保至少有1.30版本
https://stackoverflow.com/questions/46131711
复制相似问题