Ошибка сегментации c ++, когда do list.push_back (), исправить на хосте, ошибка на руке - PullRequest
0 голосов
/ 08 марта 2019
    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);
    }
}

Существует только один исходный код. Когда я успешно скомпилировал на хосте debian9, valgrind --leak-check = full протестировал отсутствие утечек памяти, и программа была выполнена правильно. На платформе arm компиляция прошла успешно, но программа получила эту ошибку при запуске. Я надеюсь получить помощь от всех, спасибо.

1 Ответ

0 голосов
/ 10 марта 2019

решаемая.

Эти данные печати gdb не являются серьезной проблемой.

Для gcc4.4 и gcc4.3 список STL не будет предварительно выделять элемент при написании кода, подобного list<DiyClass>, но в gcc6.3 будет.Вот почему тот же код может хорошо работать в gcc6.3, но сегментный сбой в gcc4.3.

Я полагаю, что некоторые низкоуровневые реализации отличаются между версиями diff gcc.если кто-то знает причину подробно, дайте ответ, спасибо.

...