我有一个为ARM目标构建的C ++代码,使用linaro工具链专门从ARM硬件目标的源代码构建(使用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
答案 0 :(得分:0)
可能是堆损坏(解释了malloc终止进程的原因)。
使用常规工具检测未定义的行为(例如错误的内存访问)。
如果异常处理出错(在交叉编译等ABI压力因素存在的情况下不太常见),您可以使用nothrow
版operator new
:
X* x = new (nothrow) X;
assert(x); // or otherwise handle with care
答案 1 :(得分:0)
new会抛出异常。但是日志中没有例外。 所以我想有足够的记忆力。更可能的答案是你以某种方式损坏了内存。 你应该用valgrind检查你的内存访问
更令我困扰的是=运算符的原型; MyMsg::operator=(MyPkt*)
。
为什么在对象上使用指针而不是const引用?或至少const MyPkt const *