当我在 Darwin 上运行 STLport 时,我遇到了一个奇怪的崩溃。(除了在 Mac 上没见过,但在 i686 和 PowerPC 上都崩溃了。)这就是它在 gdb 中的样子:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: 13 at address: 0x0000000000000000
[Switching to process 21097]
0x000000010120f47c in stlp_std::__node_alloc_impl::_M_allocate ()
可能是 STLport 中的一些设置,我注意到 Mac.h 和 MacOSX.h 在功能上似乎远远落后。我也知道它一定是某种类型的竞争条件,因为它不会仅仅通过调用这个方法(隐式调用)而发生。崩溃主要发生在我推送系统时,同时运行 10 个执行大量字符串处理的线程。
我提出的其他理论与编译器标志(配置脚本)和 g++ 4.2 错误有关(似乎 Mac 上还没有 4.4.3 并支持 Objective-C,我需要与之链接)。
帮助!!!:)
编辑:我运行单元测试,它做各种各样的事情。当我启动 10 个推送系统的线程时会出现这个问题;它总是归结为 std::string::append 最终归结为 _M_allocate。由于我什至无法得到导致问题的代码的下降转储,我认为我做错了。可能是因为它试图在指令指针 0x000...000 处执行吗?dynlib 是否在 Windows 中构建为带有跳转表的 DLL?会不会是这样的跳转表由于某种原因被覆盖了?这可能可以解释这种行为。(代码很大,如果我用完了其他想法,我会在这里发布一个最小崩溃示例。)