Abbiamo interagito con una libreria creata dal compilatore Matlab. Il nostro problema è relativo a un array restituito dalla libreria.Chiamare mxDestroyArray su oggetti mxArray restituiti da Matlab Compiler Runtime
Una volta terminato l'array, vorremmo liberare la memoria, tuttavia, ciò causerebbe occasionali errori di segmentazione.
Ecco la libreria Matlab (bugtest.m
) ::
Ecco il comando che abbiamo usato per costruirlo (creando libbugtest.so
, e libbugtest.h
) ::
mcc -v -W lib:libbugtest -T link:lib bugtest.m
ecco il nostro C programma di test (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();
}
Qui è come si compila il programma C (creando bug_destroyarray
) ::
mbuild -v bug_destroyarray.c libbugtest.so
Crediamo che mxDestroyArray(output)
è problematica.
Abbiamo eseguire il seguente per testare crash:
- Su ciascuno dei 32 nodi del cluster.
- Corsa
bug_destroyarray
. - Uscita monitor per errori di segmentazione.
Circa il 10% delle volte si verifica un incidente. Se questo è indipendente tra i nodi , si potrebbe supporre che si stia arrestando circa lo 0,3% delle volte.
Quando eliminiamo questa riga problematica, non siamo in grado di causarne l'arresto.
Tuttavia, l'utilizzo della memoria aumenta gradualmente quando questa linea non è inclusa.
Dalla ricerca che abbiamo fatto, sembra che siamo non supposti per distruggere l'array restituito, in caso contrario, come ci fermiamo dalla perdita di memoria?
Grazie.
Sei sicuro di avere la firma del 'mlfBugtest' corretta? La documentazione sembra indicare che le funzioni di 'mlf' restituiscono' void', non 'bool'. – wakjah