ARM段错误的C / C ++字符串错误总线错误

时间:2017-10-07 11:12:35

标签: c++ string segmentation-fault raspbian raspberry-pi3

经过大量的搜索和阅读,我有一个奇怪的问题,我仍然不知道是什么原因造成了这里的段错误。请考虑以下C ++代码:

    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之前被初始化,所以不用担心。 此代码在Intel或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. 如果在in_mac中找到std:map(在...内) if)那么方法不会崩溃。

  3. 如果找不到in_mac std:map(在else中)然后字符串in_mac消失了, 意味着printfin_mac崩溃。 GDB还说“无法访问0x99999a的内存”字符串。
  4. 正如我所提到的,同样的方法在AMD 64Bit架构上没有问题。我的猜测是,ARM体系结构字符串被移动到一个被认为是“释放”的地址,并且崩溃发生,我怀疑这是来自std:map find函数。 除此之外,我不知道导致这次崩溃的原因。你有什么想法 ? THX。

1 个答案:

答案 0 :(得分:1)

问题是拼写错误:

in_coor3D[3] = 2.45;

最有可能的是:

in_coor3D[2] = 2.45;