2017-10-07 137 views
0

我有一个奇怪的问题后,大量的搜索和阅读我还没有线索是什么导致seg故障在这里。请考虑下面的C++代码:C/C + +字符串与ARM seg错误错误总线错误

void SensorCalibrator::getCoordinatesFromSensorMac(string in_mac, double *in_coor3D) { 
    map<string, sensorInformation>::iterator itr = mac_to_sensorinfo.find(in_mac); 
    if(itr != mac_to_sensorinfo.end()) { 
     in_coor3D[0] = itr->second.coor[0]; 
     in_coor3D[1] = itr->second.coor[1]; 
     in_coor3D[2] = itr->second.coor[2]; 
    } 
    else { 
       in_coor3D[0] = 50.0; 
       in_coor3D[1] = 55.0; 
       in_coor3D[3] = 2.45; 

    } 
} 

双阵列in_coor3D初始化它传递给方法getCoordinatesFromSensorMac所以不用担心那里。 这个代码在英特尔或AMD 64位体系结构上没有问题,但是在ARM v7l(Raspberry Pi 3)上,它使用“分段错误”(g ++ v5)或“总线错误”(g ++ v4.7)崩溃。下面是对应GDB回溯:

Program received signal SIGSEGV, Segmentation fault. 
__GI___libc_free (mem=0x9999999a) at malloc.c:2966 
2966 malloc.c: No such file or directory. 
(gdb) bt 
0 __GI___libc_free (mem=0x9999999a) at malloc.c:2966 
1 0x7679fb90 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()() from /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 
2 0x00053b64 in WiPiDevicesHandler::setSensorCoordinates (this=0xf24e0, sens=0x110458) at ../WiPiDevicesHandler.cc:437 

线437是在调用getCoordinatesFromSensorMac方法。 我插入一些调试printf到方法,似乎弦in_mac引起的问题,这里是我迄今为止的发现:

  1. 字符串in_mac是好的调用该方法前,在方法里面。

  2. if in_mac位于std:map(如果在 之内),则该方法不会崩溃。

  3. 如果in_mac没有在 的std:map(在else里面),那么串in_mac没有了, 这意味着一个printfin_mac崩溃找到。 GDB也说“无法访问0x99999a的内存”字符串。

正如我所提到的,同样的方法在AMD 64位架构上没有问题。我的猜测是,在ARM体系结构字符串被移动到一个被认为是“释放”的地址,崩溃发生,我也怀疑这是来自std:map find函数。 除此之外,我不知道是什么原因导致这次崩溃。你有什么想法 ? Thx。

回答

1

的问题是错字:

in_coor3D[3] = 2.45; 

应该最有可能的是:

in_coor3D[2] = 2.45; 
+0

哦,这真的很尴尬。非常感谢。 – Jonas