emxFree_real_T 导致可执行文件中止

Posted

技术标签:

【中文标题】emxFree_real_T 导致可执行文件中止【英文标题】:emxFree_real_T Causing Executable to Abort 【发布时间】:2019-07-29 20:45:07 【问题描述】:

我正在使用 Matlab 编码器,使用 coder.varsize 指出的可变大小变量。这会导致使用emxArray_real_T 类型声明一些变量,使用emxInit_real_t 进行初始化,通过对emxEnsureCapacity_real 的适当调用使用,最后使用emxFree_real_T 释放。

我有几个函数会发生这种情况,但有时,由于我无法很好地隔离,emxFree_real_T 操作会导致编译的可执行文件中止,显示回溯和内存映射,这似乎对我。这可以猜到,因为它发生在可变大小的数组停止使用时(因此可以取消分配)。

通过操作 C 代码,我可以看出错误恰好发生在对 emxFree_real_T 函数的调用上。注释掉这些行可以使生成的代码正常工作。但这似乎既不安全,也无法解决我的问题。

不幸的是,这个错误很难重现,所以我想不出一个最小的工作示例。

这是一个已知的错误吗?我是否遗漏了有关可变大小数组使用的一些内容?

Matlab 版本为 R2019a。

【问题讨论】:

这种情况很常见,因为内存损坏。看看these debugging steps 看看他们是否给你任何信息,尤其是检查运行时错误。 @RyanLivingston 有关信息,我已经在生成、编译和运行独立代码。 flowchart in your link 建议首先创建 mex 函数,这是为什么呢? 此外,使用-Wall 启用编译器警告并使用运行时错误检查仅产生消息“%lld 需要long long int 类型的参数,但参数3 的类型为long int [-Wformat]",发生在 NNN_rtwutil 函数中。 运行时错误检查。默认情况下,独立代码没有这些检查。因此,如果您的 MATLAB 代码做了一些非法的事情,例如索引越界,生成的代码将具有未定义的行为、损坏的内存等。我发送的链接中的 cfg.RuntimeChecks 选项将启用对独立代码的这些检查。尝试打开它并运行您的独立代码以检查错误。 @RyanLivingston :我已经解决了我的问题,但你的提示是正确的。随意编辑我的答案或根据我写的内容添加您自己的答案。如果你这样做,我会接受你的正确答案。 【参考方案1】:

问题可能有多种原因,调查的起点是启用选项cfg.RuntimeChecks,正如@RyanLivingston 指出的那样。在调试生成的代码时还有其他步骤suggested by MathWorks。

在这种情况下,%#codegen 指令已经禁止用户通过增加数组的大小来动态分配内存:

myArray(end+1) = rand();

但是,如果代码将其实现为:

for i:1:a
    myArray(i) = rand();
end

那么它可能没有办法知道参数a 会超过myArray 的大小,并且在每一步都不会随着emxEnsureCapacity 增加它的大小。添加cfg.RuntimeChecks 将创建一个异常处理案例,以查明此事件的发生。

对此的解决方案是将更大的变量分配给myArray,例如:

myArray = zeros(a,1); 
for i:1:a
    myArray(i) = rand();
end

即使myArray 之前已定义为较小的大小(但设置为可变大小与coder.varsize),将确保增加的容量并且循环可以继续。

【讨论】:

以上是关于emxFree_real_T 导致可执行文件中止的主要内容,如果未能解决你的问题,请参考以下文章

如何编写可中止的同步方法?

我如何知道可执行文件是不是被增量链接?

Python学习异常处理

线程在完成执行代码之前在动态库中中止

RecycleView 导致 Kivy 可执行文件崩溃

使用 Visual Studio 11 编译的可执行文件有啥特别之处导致无法在 Windows XP 上执行?