首页 > 解决方案 > 使用 libc++ 构建后 OSX 10.9 上的 Xalan-C 运行时 malloc 错误

问题描述

我们使用 Xalan 和 Xerces C++ 库进行 XML 转换和解析。

在我们支持 10.8 OS X 之前,它一直在完美运行(使用 libstdc++ 作为标准库)。最近,我们升级了我们的项目以支持具有基本 SDK 10.12 的目标 OSX 10.9,并添加了 C++11 支持以及在具有 XCode 9.4 的 OSX 10.14 上构建它。

由于在 XCode 中,C+11 支持仅适用于 libc,因此我们必须使用 C++11 重建所有依赖项以确保 ABI 兼容性。但是 Xalan 二进制文件(通过 runco​​nfigure 脚本构建)在使用 libc++ 和 C++11 支持标志重建后崩溃。

该位置始终是 Xalan Transformer::transform() API。我尝试在 malloc 守卫的帮助下进行调试,并在 Xalan 代码内部进行了调试,但是发生崩溃的内存是在 Xalan 代码中内部分配的,并且与输入参数无关。

下面是调用栈:

#0  0x00007fff879bd866 in __pthread_kill ()
#1  0x00007fff8cc3535c in pthread_kill ()
#2  0x00007fff8e63fb1a in abort ()
#3  0x00007fff91e4d690 in szone_error ()
#4  0x00007fff91e4ed95 in small_free_list_remove_ptr ()
#5  0x00007fff91e4b443 in szone_free_definite_size ()
#6  0x00000001011bd487 in xercesc_3_1::MemoryManagerImpl::deallocate(void*) ()
#7  0x0000000100d7e539 in xalanc_1_11::ArenaAllocator<xalanc_1_11::XalanDOMString, xalanc_1_11::ArenaBlock<xalanc_1_11::XalanDOMString, unsigned long> >::reset() ()
#8  0x0000000100d82062 in xalanc_1_11::XalanDOMStringPool::clear() ()
#9  0x0000000100e8088f in xalanc_1_11::StylesheetConstructionContextDefault::reset() ()
#10 0x0000000100e80329 in xalanc_1_11::StylesheetConstructionContextDefault::~StylesheetConstructionContextDefault() ()
#11 0x0000000100ed0559 in xalanc_1_11::XalanTransformer::doTransform(xalanc_1_11::XalanParsedSource const&, xalanc_1_11::XalanCompiledStylesheet const*, xalanc_1_11::XSLTInputSource const*, xalanc_1_11::XSLTResultTarget const&) ()
#12 0x0000000100ece2ad in xalanc_1_11::XalanTransformer::transform(xalanc_1_11::XSLTInputSource const&, xalanc_1_11::XSLTInputSource const&, xalanc_1_11::XSLTResultTarget const&) ()

和错误:

malloc: *** error for object 0x103831c08: incorrect checksum for freed object - object was probably modified after being freed.
set a breakpoint in malloc_error_break to debug

注意:令人惊讶的是,代码在 OSX 10.14 上执行没有任何问题

标签: c++macosmalloclibc++xalan

解决方案


推荐阅读