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 导致可执行文件中止的主要内容,如果未能解决你的问题,请参考以下文章