Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用新操作员后的分段故障 我为ARM目标建立了一个C++代码,使用的是从源代码中专门为ARM硬件目标构建的LARARO工具链(使用SOFTFP、MCOUNTY CORTEX-A9等)。 有时,代码会以低于跟踪的方式崩溃。我已将gdb连接到正在运行的进程 显然,在调用libstdc++.so.6中的一个新操作符后,它似乎会使一些调用崩溃_C++_Segmentation Fault_Linaro - Fatal编程技术网

使用新操作员后的分段故障 我为ARM目标建立了一个C++代码,使用的是从源代码中专门为ARM硬件目标构建的LARARO工具链(使用SOFTFP、MCOUNTY CORTEX-A9等)。 有时,代码会以低于跟踪的方式崩溃。我已将gdb连接到正在运行的进程 显然,在调用libstdc++.so.6中的一个新操作符后,它似乎会使一些调用崩溃

使用新操作员后的分段故障 我为ARM目标建立了一个C++代码,使用的是从源代码中专门为ARM硬件目标构建的LARARO工具链(使用SOFTFP、MCOUNTY CORTEX-A9等)。 有时,代码会以低于跟踪的方式崩溃。我已将gdb连接到正在运行的进程 显然,在调用libstdc++.so.6中的一个新操作符后,它似乎会使一些调用崩溃,c++,segmentation-fault,linaro,C++,Segmentation Fault,Linaro,我们目前没有异常处理代码,所以如果new失败并引发异常,我推测它会中止/终止,并显示如下消息: Program received signal SIGABRT, Aborted. 但它却与SIGSEGV相撞 为什么会这样?出了什么问题 Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x45c6b460 (LWP 1182)] 0x402fad12 in malloc_consolidate (

我们目前没有异常处理代码,所以如果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

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


使用常规工具检测未定义的行为(例如坏内存访问)

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

X* x = new (nothrow) X;

assert(x); // or otherwise handle with care

如果内存不足,new将引发异常。但日志中没有例外。 所以我想有足够的内存。更可能的答案是你不知何故破坏了记忆。 您应该使用valgrind检查内存访问

更让我困扰的是=操作符的原型
MyMsg::operator=(MyPkt*)

为什么在对象上使用指针而不是常量引用?或者至少签出一个
常量MyPkt const*

。您正在某个地方销毁堆。可能有
MyManager::SendMessage
MyMsg::reply
MyMsg::operator=
的内容。也可能是其他原因,从堆栈跟踪中很难分辨。@jrok-谢谢您将阅读这些链接。在问题中发布MyManager::SendMessage()和My::Response()的函数定义,可能有助于您得到答案。我猜,“使用常规工具检测未定义的行为”。您建议使用什么工具来检查这种可能的堆损坏。我在相同的代码上运行了valgrind,对于相同的函数MyMsg::operator=(),它向我显示“在68的丢失记录26中仍然可以访问1个块中的600字节”,我理解这不一定是内存错误。任何其他可以帮助您分析内存错误的工具。这是一个漏洞,表明您的类的值语义不正确。Clang有一些有用的消毒剂选项。你是说valgrind消息(在68个数据块中的26个丢失记录中仍然可以访问1个数据块中的600字节)是泄漏还是这个崩溃问题可能源于泄漏?第一个。同样的根本原因也可能导致其他问题,比如你的崩溃。内存泄漏本身并不一定会破坏一个系统(尽管在你的手臂上,你可能会更快地耗尽内存?)