c++;执行列表时出现分段错误。push_back(),在主机上更正,在arm上出错 程序接收信号SIGSEGV,分段故障。 0x400741e0位于std::_列表\节点\基础::钩子(std:_列表\节点\基础*)() 来自/mnt/yaffs2/Cdatabox/lib/libstdc++.so.6 (gdb)英国电信 #0 0x400741e0位于std::_列表\节点\基础::钩子(std:_列表\节点\基础*)() 来自/mnt/yaffs2/Cdatabox/lib/libstdc++.so.6 #1标准::列表中的0x00012df8:_M_插入(此=0xbe9d1af0,_位置=…,_x=…) at/opt/arm-2008q3-linux/bin/./lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../../../arm-none-linux-gnueabi/include/c++/4.3.2/bits/stl_-list.h:1342 #std::list::push_back中的2 0x00012e30(此=0xbe9d1af0,_x=…) at/opt/arm-2008q3-linux/bin/./lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../../../arm-none-linux-gnueabi/include/c++/4.3.2/bits/stl_list.h:876 #Cbox中的3 0x0000d508::稳定分析::uu dealstable(此=0xbe9d1a98) 在../include/class/steadyananalysis.h:237 #Cbox::SteadyAnalysis::input中的4 0x0000dc7c(此=0xbe9d1a98, 重量=1467031,原始时间=1552067705) 在../include/class/steadyananalysis.h:110 #SteadyanAnalysis处的5 0x0000deb4主管道(argc=2,argv=0xbe9d1d74)。cc:30 (gdb)拆卸 函数_ZNSt15_List_node_base4hookEPS_的汇编程序代码转储: 0x400741d0:ldr r3[r1,#4] 0x400741d4:stm r0,{r1,r3} 0x400741d8:ldr r2[r1,#4] 0x400741dc:str r0[r1,#4] =>0x400741e0:str r0[r2] 0x400741e4:bx lr 汇编程序转储结束。 (gdb)i r r0 0x31220 201248 r1 0xbe9d1af0 3197967088 r2 0x46 70 r3 0x46 70 r4 0xbe9d1a98 3197967000 r5 0x40dd4c00 1088244736 r6 0x4136629f 1094083231 r7 0x1e400000 507510784 r8 0x41d720ab 1104617643 r9 0x0 0 r10 0x31d20 204064 r11 0xbe9d1944 3197966660 r12 0x30a58 199256 sp 0xbe9d1928 0xbe9d1928 lr 0x12df8 77304 pc 0x400741e0 0x400741e0 cpsr 0x6000001610612752 (gdb)
代码:c++;执行列表时出现分段错误。push_back(),在主机上更正,在arm上出错 程序接收信号SIGSEGV,分段故障。 0x400741e0位于std::_列表\节点\基础::钩子(std:_列表\节点\基础*)() 来自/mnt/yaffs2/Cdatabox/lib/libstdc++.so.6 (gdb)英国电信 #0 0x400741e0位于std::_列表\节点\基础::钩子(std:_列表\节点\基础*)() 来自/mnt/yaffs2/Cdatabox/lib/libstdc++.so.6 #1标准::列表中的0x00012df8:_M_插入(此=0xbe9d1af0,_位置=…,_x=…) at/opt/arm-2008q3-linux/bin/./lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../../../arm-none-linux-gnueabi/include/c++/4.3.2/bits/stl_-list.h:1342 #std::list::push_back中的2 0x00012e30(此=0xbe9d1af0,_x=…) at/opt/arm-2008q3-linux/bin/./lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../../../arm-none-linux-gnueabi/include/c++/4.3.2/bits/stl_list.h:876 #Cbox中的3 0x0000d508::稳定分析::uu dealstable(此=0xbe9d1a98) 在../include/class/steadyananalysis.h:237 #Cbox::SteadyAnalysis::input中的4 0x0000dc7c(此=0xbe9d1a98, 重量=1467031,原始时间=1552067705) 在../include/class/steadyananalysis.h:110 #SteadyanAnalysis处的5 0x0000deb4主管道(argc=2,argv=0xbe9d1d74)。cc:30 (gdb)拆卸 函数_ZNSt15_List_node_base4hookEPS_的汇编程序代码转储: 0x400741d0:ldr r3[r1,#4] 0x400741d4:stm r0,{r1,r3} 0x400741d8:ldr r2[r1,#4] 0x400741dc:str r0[r1,#4] =>0x400741e0:str r0[r2] 0x400741e4:bx lr 汇编程序转储结束。 (gdb)i r r0 0x31220 201248 r1 0xbe9d1af0 3197967088 r2 0x46 70 r3 0x46 70 r4 0xbe9d1a98 3197967000 r5 0x40dd4c00 1088244736 r6 0x4136629f 1094083231 r7 0x1e400000 507510784 r8 0x41d720ab 1104617643 r9 0x0 0 r10 0x31d20 204064 r11 0xbe9d1944 3197966660 r12 0x30a58 199256 sp 0xbe9d1928 0xbe9d1928 lr 0x12df8 77304 pc 0x400741e0 0x400741e0 cpsr 0x6000001610612752 (gdb),c++,segmentation-fault,arm,cross-platform,C++,Segmentation Fault,Arm,Cross Platform,代码: //类型声明 结构SteadyNode{ 双均值; int持续时间; 内斯达林; 开始检测的时间; 时间\u t结束检测到的原始时间; }; //定义信息 //列表::迭代器upIt,downIt; //列表稳定节点列表; //列出睡眠列表; { steadyNodeList.back().endDetectedRawTime=currentRawTime; SteadyNode last=steadyNodeList.back(); 如果(onBedFlag==1) { downIt
//类型声明
结构SteadyNode{
双均值;
int持续时间;
内斯达林;
开始检测的时间;
时间\u t结束检测到的原始时间;
};
//定义信息
//列表::迭代器upIt,downIt;
//列表稳定节点列表;
//列出睡眠列表;
{
steadyNodeList.back().endDetectedRawTime=currentRawTime;
SteadyNode last=steadyNodeList.back();
如果(onBedFlag==1)
{
downIt=steadyNodeList.end();
名单上的名单;
拼接(onBedMeanList.begin()、steadyNodeList、upIt、downIt);
steadyNodeList.clear();
steadyNodeList.向后推(最后一个);
sleepPiceList.向后推(onBedMeanList);//已解决
这些gdb打印信息不是主要问题
对于gcc4.4和gcc4.3,当您编写类似于list
的代码时,STL list不会预分配元素,但在gcc6.3中会预分配元素。这就是为什么相同的代码在gcc6.3中可以运行良好,但在gcc4.3中会出现段错误
我猜一些低级实现在不同的gcc版本之间是不同的。如果有人知道详细原因,请给出答案,谢谢。请提供一个例子,说明您最有可能做了导致未定义行为的事情。当您构建时,是否收到任何警告消息?是否启用了详细的警告消息(如-Wall-Wextra-Wpedantic
)?您是否正在进行任何C样式转换以消除警告(甚至错误)?Cbox::SteadyNode
可能存在分配问题。Valgrind不会捕获可移植性错误,例如主机上使用64位整数时出现32位溢出;这不是您的问题,但您希望将其视为许多可能性之一。人们只能猜测您的问题,但没有明确的答案,并将我们限制在其他未来的读者中。可以吗请提供有关cbox命名空间/类的更多信息,尤其是分配代码。使用编译选项-Wall。无任何警告添加一些代码段,“//
Program received signal SIGSEGV, Segmentation fault.
0x400741e0 in std::_List_node_base::hook(std::_List_node_base*) ()
from /mnt/yaffs2/Cdatabox/lib/libstdc++.so.6
(gdb) bt
#0 0x400741e0 in std::_List_node_base::hook(std::_List_node_base*) ()
from /mnt/yaffs2/Cdatabox/lib/libstdc++.so.6
#1 0x00012df8 in std::list<std::list<Cbox::SteadyNode, std::allocator<Cbox::SteadyNode> >, std::allocator<std::list<Cbox::SteadyNode, std::allocator<Cbox::SteadyNode> > > >::_M_insert (this=0xbe9d1af0, __position=..., __x=...)
at /opt/arm-2008q3-linux/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/include/c++/4.3.2/bits/stl_list.h:1342
#2 0x00012e30 in std::list<std::list<Cbox::SteadyNode, std::allocator<Cbox::SteadyNode> >, std::allocator<std::list<Cbox::SteadyNode, std::allocator<Cbox::SteadyNode> > > >::push_back (this=0xbe9d1af0, __x=...)
at /opt/arm-2008q3-linux/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/include/c++/4.3.2/bits/stl_list.h:876
#3 0x0000d508 in Cbox::SteadyAnalysis::__dealSteady (this=0xbe9d1a98)
at ../include/class/SteadyAnalysis.h:237
#4 0x0000dc7c in Cbox::SteadyAnalysis::input (this=0xbe9d1a98,
weight=1467031, rawTime=1552067705)
at ../include/class/SteadyAnalysis.h:110
#5 0x0000deb4 in main (argc=2, argv=0xbe9d1d74) at SteadyAnalysis.cc:30
(gdb) disassemble
Dump of assembler code for function _ZNSt15_List_node_base4hookEPS_:
0x400741d0 <+0>: ldr r3, [r1, #4]
0x400741d4 <+4>: stm r0, {r1, r3}
0x400741d8 <+8>: ldr r2, [r1, #4]
0x400741dc <+12>: str r0, [r1, #4]
=> 0x400741e0 <+16>: str r0, [r2]
0x400741e4 <+20>: bx lr
End of assembler dump.
(gdb) i r
r0 0x31220 201248
r1 0xbe9d1af0 3197967088
r2 0x46 70
r3 0x46 70
r4 0xbe9d1a98 3197967000
r5 0x40dd4c00 1088244736
r6 0x4136629f 1094083231
r7 0x1e400000 507510784
r8 0x41d720ab 1104617643
r9 0x0 0
r10 0x31d20 204064
r11 0xbe9d1944 3197966660
r12 0x30a58 199256
sp 0xbe9d1928 0xbe9d1928
lr 0x12df8 77304
pc 0x400741e0 0x400741e0 <std::_List_node_base::hook(std::_List_node_base*)+16>
cpsr 0x60000010 1610612752
(gdb)
//Type declaration
struct SteadyNode {
double mean;
int duration;
int startLine;
time_t startDetectedRawTime;
time_t endDetectedRawTime;
};
//Definition info
//list<SteadyNode>::iterator upIt, downIt;
//list<SteadyNode> steadyNodeList;
//list<list<SteadyNode> > sleepPiceList;
{
steadyNodeList.back().endDetectedRawTime = currentRawTime;
SteadyNode last = steadyNodeList.back();
if (onBedFlag == 1)
{
downIt = steadyNodeList.end();
list<SteadyNode> onBedMeanList;
onBedMeanList.splice(onBedMeanList.begin(), steadyNodeList, upIt, downIt);
steadyNodeList.clear();
steadyNodeList.push_back(last);
sleepPiceList.push_back(onBedMeanList); //<=== crash position
onBedMeanList.clear();
onBedFlag = -1;
}
else
{
steadyNodeList.clear();
steadyNodeList.push_back(last);
}
}