c++ - 使用 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 二进制文件(通过 runconfigure 脚本构建)在使用 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 上执行没有任何问题
解决方案
推荐阅读
- vis.js - Vis.js 网络 - 使用与可用的 3 不同的字体
- c# - 是否可以使用类似于自动属性 ({ get; set; }) 的语法来声明引发 PropertyChanged 事件的属性?
- java - 如何将参数从cordova HTTP传递到Spring控制器
- email - 回复标头的最大长度
- c++ - 如何解决此错误:包含文件嵌套太深
- ios - 使用 iOS 13 暗模式时如何使 UITabBar 不透明?
- apache-spark - 如何删除 Delta Lake 中旧版本的表
- firebase - Firestore + Ionic Angularfire 读取计数和缓存持久化
- javascript - 如何编写以键 const - JavaScript 开头的函数?
- appium-android - 发送密钥时出现此错误无效的元素状态错误