2017-10-07 11 views
0

多くの検索と読み込みの後に私は奇妙な問題を抱えています。次の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が問題を引き起こして、そしてここで私は、これまでに判明したものであるようです:メソッドが呼び出される前に

  1. 文字列in_macが細かく、メソッド内。

  2. std:map( の場合)にin_macがある場合、メソッドはクラッシュしません。

  3. in_macが(他の内側) std:mapに見つからない場合、文字列in_macが はそのprintfin_macとのクラッシュを意味し、なくなっています。 GDBはまた、 "0x99999aのメモリにアクセスできません"という文字列についても述べています。

AMD 64Bitアーキテクチャでは、同じ方法に問題はありません。私の推測では、ARMアーキテクチャの文字列は "解放された"と見なされるアドレスに移動され、クラッシュが発生し、これもstd:map find関数から来たと思われます。 それを超えて、私はこのクラッシュを引き起こす原因を知りません。あなたはなにか考えはありますか ? Thx。

答えて

1

問題はタイプミスです:

in_coor3D[3] = 2.45; 

それが最も可能性が高いようになります。

in_coor3D[2] = 2.45; 
+0

男ああ、これは本当に恥ずかしいです。どうもありがとうございます。 – Jonas

関連する問題