当我在 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 错误有关(似乎 4.4.3 在 Mac 上还没有支持 Objective-C,我需要与之链接)。
求助!!! :)
编辑:我运行单元测试,它会做各种各样的事情。当我启动 10 个推送系统的线程时,就会出现这个问题;它总是归结为 std::string::append,最终归结为 _M_allocate。由于我什至无法获得导致问题的代码的下降转储,我认为我做错了什么。会不会是因为它试图在指令指针 0x000...000 处执行?动态库是否在 Windows 中构建为带有跳转表的 DLL?会不会是这样的跳转表由于某种原因被覆盖了?这可能可以解释这种行为。 (代码量很大,如果我没有其他想法,我会在这里发布一个最小的崩溃示例。)
最佳答案
嗯.. STLPort 使用分配器获取平台内存并在需要时将其内部池化到数据结构中。
只需检查崩溃何时发生,分配给执行线程的堆就足以让分配发生。即使分配失败,也可能发生此崩溃。
我不确定您正在使用的当前配置中的 STL 分配器的粒度。检查 STL_config.h。
关于c++ - STLport 崩溃(竞争条件,仅限 Darwin ?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2387403/