C/C++ ARM 段错误的字符串错误总线错误
C/C++ String Error with ARM seg fault Bus error
经过大量搜索和阅读后,我遇到了一个奇怪的问题,我仍然不知道是什么原因导致了这里的段错误。请考虑以下 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) 上它会因 "Segmentation Fault" (g++ v5) 或 "Bus Error" (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
导致了问题,这是我到目前为止发现的:
字符串in_mac
在调用方法之前和方法内部都可以。
如果在 std:map
中找到 in_mac
(在
如果)则该方法不会崩溃。
- 如果
in_mac
未在
std:map
(在 else 内)然后字符串 in_mac
消失了,
意味着 printf
和 in_mac
崩溃。 GDB 还对字符串说 "cannot access memory at 0x99999a" 。
正如我所提到的,同样的方法在 AMD 64 位架构上没有问题。我的猜测是,在 ARM 体系结构上,字符串被移动到一个被认为是 "freed" 的地址,并且发生了崩溃,而且我怀疑这来自 std:map find
函数。
除此之外,我不知道是什么导致了这次崩溃。你有什么想法 ?
谢谢
问题是打字错误:
in_coor3D[3] = 2.45;
最有可能是:
in_coor3D[2] = 2.45;
经过大量搜索和阅读后,我遇到了一个奇怪的问题,我仍然不知道是什么原因导致了这里的段错误。请考虑以下 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) 上它会因 "Segmentation Fault" (g++ v5) 或 "Bus Error" (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
导致了问题,这是我到目前为止发现的:
字符串
in_mac
在调用方法之前和方法内部都可以。如果在
std:map
中找到in_mac
(在 如果)则该方法不会崩溃。- 如果
in_mac
未在std:map
(在 else 内)然后字符串in_mac
消失了, 意味着printf
和in_mac
崩溃。 GDB 还对字符串说 "cannot access memory at 0x99999a" 。
正如我所提到的,同样的方法在 AMD 64 位架构上没有问题。我的猜测是,在 ARM 体系结构上,字符串被移动到一个被认为是 "freed" 的地址,并且发生了崩溃,而且我怀疑这来自 std:map find
函数。
除此之外,我不知道是什么导致了这次崩溃。你有什么想法 ?
谢谢
问题是打字错误:
in_coor3D[3] = 2.45;
最有可能是:
in_coor3D[2] = 2.45;