2

我有一个为 ARM 目标构建的 C++ 代码,它使用专门从源代码为 ARM 硬件目标构建的 linaro 工具链(使用 softfp、mtune=cortex-a9 等......)有时,代码会因以下跟踪而崩溃。我已将 gdb 附加到正在运行的进程显然,在调用来自 libstdc++.so.6 的新运算符后,它似乎崩溃了几个调用。

我们目前没有异常处理代码,所以如果 new 失败并抛出异常,我认为它会中止/终止,消息如下:

Program received signal SIGABRT, Aborted.

但相反,它与 SIGSEGV 一起崩溃。

为什么呢?可能出了什么问题?

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x45c6b460 (LWP 1182)]
0x402fad12 in malloc_consolidate () from /lib/libc.so.6
#0  0x402fad12 in malloc_consolidate () from /lib/libc.so.6
#1  0x402fc498 in _int_malloc () from /lib/libc.so.6
#2  0x402fe414 in malloc () from /lib/libc.so.6
#3  0x401f54d6 in operator new(unsigned int) () from /lib/libstdc++.so.6
#4  0x400f30d4 in MyMsg::operator=(MyPkt*) () from /usr/lib/libmy-ARMV7AL.so
#5  0x400f322c in MyMsg::reply() () from /usr/lib/libmy-ARMV7AL.so
#6  0x0005a6a0 in MyManager::SendMessage (this=0x7188c8)
    at MyManager.cpp:12973
#7  0x0004389c in My::Response (this=0x7188c8)
    MyManager.cpp:5972
4

2 回答 2

1

可能是堆损坏(解释 malloc 终止进程的原因)。

使用您的常规工具来检测未定义的行为(例如错误的内存访问)。

如果异常处理出错了(在交叉编译等 ABI 压力源存在的情况下并不太常见),您可以使用以下nothrow版本operator new

X* x = new (nothrow) X;

assert(x); // or otherwise handle with care
于 2013-10-16T09:44:35.670 回答
1

如果没有足够的内存,new 会抛出异常。但是日志中没有异常。所以我想有足够的内存。更有可能的答案是您以某种方式破坏了内存。你应该用 valgrind 检查你的内存访问

更困扰我的是 = 运算符的原型; MyMsg::operator=(MyPkt*). 为什么要在对象上使用指针而不是 const 引用?或者至少一个const MyPkt const *

于 2013-10-16T09:51:59.300 回答