1

当我在 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?会不会是这样的跳转表由于某种原因被覆盖了?这可能可以解释这种行为。(代码很大,如果我用完了其他想法,我会在这里发布一个最小崩溃示例。)

4

2 回答 2

1

嗯.. STLPort 使用分配器来获取平台内存,并在需要时将其内部池化到数据结构中。

只需检查崩溃发生的时间,给执行线程的堆就足以让分配发生。即使分配失败,也可能发生这种崩溃。

我不确定您正在处理的当前配置中 STL 分配器的粒度。检查 stl_config.h。

于 2010-03-09T07:44:37.583 回答
0

这个问题是由一个不相关的崩溃错误引起的,在我的情况下导致内存覆盖导致 STLport 崩溃。

于 2010-03-29T08:21:56.127 回答