0

我的用户有时会发现此错误:

myapp(7383,0x1a1471000) malloc: * mach_vm_map(size=67125248) 失败(错误代码=3) 错误:无法分配区域 在 malloc_error_break 中设置断点以调试 2017-04-06 20:33:58.152 myapp[7383:3724816]由于未捕获的异常“NSMallocException”而终止应用程序,原因:“NSAllocateObject(): attempt to allocate object of class 'IOSByteArray' failed' * First throw call stack: (0x183386db0 0x1829ebf80 0x183386cf8 0x183c6b34c 0x10076e6e4 0x10097d3ec 0x10097e35c 0x100977dd4 0x100977bd8 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: terminating with uncaught exception of type NSException

问题是我找不到错误的调用堆栈。我正在使用通过 j2objc 应用程序移植到 objc lib 的 XZ java lib。所以,我可以使用这个库,但我无法捕捉到这个错误。

谷歌分析帮助我并显示了这一行:

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

因此,似乎发生了错误:

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_);
        }
}

但我无法使用 swift 找到此错误:

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

请帮我

4

2 回答 2

1

Swift 的 try/catch 与像这样的 ObjC 异常完全分开。这些只能用 ObjC 使用@tryand捕获@catch。在 Swift 中是不可能的。

也就是说,ObjC 通常不是异常安全的。您必须非常小心地使用它们,并且在几乎所有情况下,发生异常后的正确行为都是使程序崩溃。在这种情况下,仅围绕对桥接函数的一次调用,可能可以有效地捕获和处理,但正确执行是一项相当微妙的技能,如果可以避免,则不建议这样做。

几乎可以肯定,这个错误的原因是你试图分配太大的东西。我不会试图捕捉异常,而是会研究为什么对象如此之大并解决这个问题。特别是,我会看看有多大var1,并确保它在合理的范围内。还要确保它不是负面的。您正在使用的事实jint表明您可能会看到与您的整数类型不匹配的情况,我绝对希望这会导致这种崩溃。

于 2017-04-06T18:03:48.663 回答
1

感谢@Sultan。他给了我一个使用 XZ 纯 C 库而不是 Java>ObjC 库的想法。现在这个崩溃不存在了。看起来 j2obc 是一个神奇的框架,但它有罕见的无法捕获的错误。

于 2017-04-08T21:49:37.630 回答