De vez en cuando, mis usuarios encuentran este error:

myapp (7383,0x1a1471000) malloc: * mach_vm_map (size = 67125248) falló (código de error = 3) Error : no se puede asignar la región establece un punto de interrupción en malloc_error_break para depurar 2017-04-06 20: 33: 58.152 myapp [7383: 3724816] Finalizando la aplicación debido a que no fue capturada excepción 'NSMallocException', razón: ' NSAllocateObject (): intento de asignar objeto de clase 'IOSByteArray' falló ' * Pila de llamadas de primer lanzamiento: (0x183386db0 0x1829ebf80 0x183386cf8 0x183c6b34c 0x10076e6e4 0x10097d3ec 0x10097e35c 0x100977dd4 0x100977 extensivo 0x100978ff8 0x10096c950 0x10099685c 0x100997360 0x100979ca4 0x100976dcc 0x1002ec30c 0x100332fe4 0x100332e18 0x1003740c4 0x1004070f8 0x1004064ac 0x1021089b0 0x10210806c 0x1021089b0 0x102107710 0x1004072d8 0x1021087ec 0x1004071b0 0x102126bbc 0x10207b2d8 0x10207b374 0x188613dc4 0x1886d17d4 0x18878f0c8 0x18879ca80 0x1884ce5a4 0x18333c728 0x18333a4cc 0x18333a8fc 0x183264c50 0x184b4c088 0x188546088 0x100382a60 0x182e028b8) libc ++ abi.dylib: termina con la excepción no capturada de tipo NSException

El problema es que no puedo encontrar la pila de llamadas del error. Estoy usando XZ java lib portado en objc lib usando la aplicación j2objc. Entonces, puedo usar esta lib pero no puedo detectar este error.

Google Analytics me ayuda y muestra esta línea:

"& exd" = "NSMallocException \ nTrace: \ n \ nNSAllocateObject \ nIOSByteArray_NewArray \ nOrgTukaaniXzLzLZDecoder_initWithInt_withByteArray_ \ nnew_OrgTukaaniXzLzLZDeco

Entonces, parece que ocurre un error:

void OrgTukaaniXzLzLZDecoder_initWithInt_withByteArray_(OrgTukaaniXzLzLZDecoder *self, jint var1, IOSByteArray *var2) {
    NSObject_init(self);
        self->start_ = 0;
        self->pos_ = 0;
        self->full_ = 0;
        self->limit_ = 0;
        self->pendingLen_ = 0;
        self->pendingDist_ = 0;
        JreStrongAssignAndConsume(&self->buf_, [IOSByteArray newArrayWithLength:var1]);
        if (var2 != nil) {
            self->pos_ = JavaLangMath_minWithInt_withInt_(var2->size_, var1);
            self->full_ = self->pos_;
            self->start_ = self->pos_;
            JavaLangSystem_arraycopyWithId_withInt_withId_withInt_withInt_(var2, var2->size_ - self->pos_, self->buf_, 0, self->pos_);
        }
}

Pero no puedo encontrar este error usando swift:

do {
// ............
let inxz:OrgTukaaniXzXZInputStream = try OrgTukaaniXzXZInputStream(javaIoInputStream:in_)
// ..........
} catch {
print(error)
}

Por favor, ayúdame

0
Vyacheslav 6 abr. 2017 a las 20:54

2 respuestas

La mejor respuesta

El intento / captura de Swift está completamente separado de las excepciones de ObjC como esta. Esos solo se pueden atrapar con ObjC usando @try y @catch. No es posible hacerlo en Swift.

Dicho esto, ObjC generalmente no es seguro para excepciones. Debe tener mucho cuidado al usarlos y, en casi todos los casos, el comportamiento correcto después de una excepción es bloquear el programa. En este caso, envuelto alrededor de exactamente una llamada a una función puenteada, es posible capturar y tratar de manera efectiva, pero hacerlo correctamente es una habilidad bastante sutil y no se recomienda si puede evitarla.

Es casi seguro que la razón de este error es que está tratando de asignar algo demasiado grande. En lugar de tratar de detectar la excepción, investigaría por qué el objeto es tan grande y abordaría eso. En particular, vería cuán grande es var1 y me aseguraría de que esté en un rango razonable. También asegúrese de que no sea negativo. El hecho de que esté utilizando jint sugiere que podría estar viendo una falta de coincidencia con sus tipos de enteros, lo que absolutamente esperaría causar este tipo de bloqueo.

1
Rob Napier 6 abr. 2017 a las 18:03

Gracias a @Sultan. Me dio una idea para usar XZ pure C lib en lugar de Java> ObjC lib. Ahora este bloqueo no existe. Parece que j2obc es un marco maravilloso, pero tiene errores raros que no se pueden capturar.

1
Vyacheslav 8 abr. 2017 a las 21:49