依赖Tensorflow C++ DLL的代码调试是否必须将TF编译为调试模式?
崩溃原因
- VC++运行库(CRT)不兼容:你使用的TensorFlow DLL为Release配置编译,默认链接
/MD(多线程动态链接Release版运行库);你的扩展切换为Debug配置后,默认链接/MDd(多线程动态链接Debug版运行库)。两套运行库的内存分配释放逻辑、内部实现完全独立,跨运行库传递C对象、调用函数会直接触发未定义行为,这种底层内存错误属于结构化异常,无法被标准Ccatch语句捕获。 - C++ ABI内存布局不匹配:Debug模式下VC会为C类、结构体添加额外的调试填充字段,
session_options、run_options等TensorFlow C++对象在你Debug编译的扩展中的内存布局,和Release编译的TensorFlow DLL期望的布局完全不一致,参数传递错误直接触发访问冲突崩溃。 - STL调试开关冲突:Debug模式默认开启
_ITERATOR_DEBUG_LEVEL=2的STL调试层,STL容器的内存结构和Release模式不同,你调用LoadSavedModel时传递的标签列表参数{ tensorflow::kSavedModelTagServe }包含STL容器,两边对容器结构的解读不一致也会触发崩溃。
调试解决方案(无需重新编译TensorFlow)
只需对齐你扩展的Debug配置和TensorFlow Release编译的核心编译选项即可:
- 打开项目属性面板,切换到Debug配置:
- 进入
C/C++ → 代码生成,将运行库选项从/MDd修改为/MD,和TensorFlow使用同一份Release版运行库 - 进入
C/C++ → 预处理器,添加预定义宏_ITERATOR_DEBUG_LEVEL=0,关闭STL调试层,对齐STL实现
- 进入
- 修改完成后重新编译你的扩展,即可正常在Debug配置下调试自有代码,同时正常调用Release版TensorFlow的接口,不会出现崩溃问题。
内容的提问来源于stack exchange,提问作者Fedor Petrov
相关产品推荐
相关产品推荐

