我们一直在与从 Matlab 编译器创建的库进行交互。我们的问题与从库返回的数组有关。
一旦我们完成了数组,我们想释放内存,但是这样做会导致偶尔的分段错误。
这是 Matlab 库 ( bugtest.m
)::
function x = bugtest(y)
x = y.^2;
这是我们用来构建它的命令(创建libbugtest.so
, 和libbugtest.h
)::
mcc -v -W lib:libbugtest -T link:lib bugtest.m
这是我们的 C 测试程序 ( bug_destroyarray.c
)::
#include <stdio.h>
#include <stdlib.h>
#include "mclmcrrt.h"
#include "libbugtest.h"
#define TESTS 15000
int main(int argc, char **argv)
{
const char *opts[] = {"-nojvm", "-singleCompThread"};
mclInitializeApplication(opts, 2);
libbugtestInitialize();
mxArray *output;
mxArray *input;
double *data;
bool result;
int count;
for (count = 0; count < TESTS; count++) {
input = mxCreateDoubleMatrix(4, 1, mxREAL);
data = mxGetPr(input); data[0] = 0.5; data[1] = 0.2; data[2] = 0.2; data[3] = 0.1;
output = NULL;
result = mlfBugtest(1, &output, input);
if (result) {
/* HERE IS THE PROBLEMATIC LINE */
/*mxDestroyArray(output);*/
}
mxDestroyArray(input);
}
libbugtestTerminate();
mclTerminateApplication();
}
下面是我们如何编译 C 程序(创建bug_destroyarray
)::
mbuild -v bug_destroyarray.c libbugtest.so
我们认为这mxDestroyArray(output)
是有问题的。
我们运行以下命令来测试崩溃:
- 在 32 个集群节点中的每一个上。
- 运行
bug_destroyarray
。 - 监视分段错误的输出。
大约 10% 的时间会发生崩溃。如果这在节点之间是独立的,那么您可能会认为它在大约 0.3% 的时间内崩溃。
当我们取出那条有问题的线时,我们无法使其崩溃。
但是,当不包括此行时,内存使用量会逐渐增加。
从我们所做的研究来看,似乎我们不应该破坏返回的数组,如果没有,我们如何阻止内存泄漏?
谢谢。