C/C++ 字符串错误与 ARM SEG 故障总线错误



经过大量搜索和阅读后,我遇到了一个奇怪的问题,我仍然不知道是什么导致了这里的 seg 错误。请考虑以下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所以不用担心。 此代码在英特尔或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. 如果在std:map中找到in_mac(在 如果),则该方法不会崩溃。

  3. 如果在 中找不到in_macstd:map(在 else 内部)然后字符串in_mac消失了, 这意味着具有in_macprintf崩溃。GDB 还说字符串的"无法访问0x99999a的内存"。

正如我所提到的,相同的方法在AMD 64位架构上没有问题。我的猜测是,在 ARM 架构上,字符串被移动到一个被视为"释放"的地址,并且发生了崩溃,我也怀疑这来自std:map find函数。 除此之外,我不知道是什么导致了这次崩溃。你有什么想法吗? 感谢。

问题是错别字:

in_coor3D[3] = 2.45;

它很可能是:

in_coor3D[2] = 2.45;

相关内容

  • 没有找到相关文章

最新更新