多くの検索と読み込みの後に私は奇妙な問題を抱えています。次のC++のコードを考えてみてください:ARMのseg faultでC/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;
}
}
double配列in_coor3Dが初期化され、それがgetCoordinatesFromSensorMac
ので心配ないがメソッドに渡される前に。 このコードはIntelまたはAMD 64ビットアーキテクチャでは問題ありませんが、ARMv7l(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
に見つからない場合、文字列in_mac
が はそのprintf
in_mac
とのクラッシュを意味し、なくなっています。 GDBはまた、 "0x99999aのメモリにアクセスできません"という文字列についても述べています。
AMD 64Bitアーキテクチャでは、同じ方法に問題はありません。私の推測では、ARMアーキテクチャの文字列は "解放された"と見なされるアドレスに移動され、クラッシュが発生し、これもstd:map find
関数から来たと思われます。 それを超えて、私はこのクラッシュを引き起こす原因を知りません。あなたはなにか考えはありますか ? Thx。
男ああ、これは本当に恥ずかしいです。どうもありがとうございます。 – Jonas