2017-10-07 139 views
0

我有一個奇怪的問題後,大量的搜索和閱讀我還沒有線索是什麼導致seg故障在這裏。請考慮下面的C++代碼:C/C + +字符串與ARM seg錯誤錯誤總線錯誤

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. if in_mac位於std:map(如果在 之內),則該方法不會崩潰。

  3. 如果in_mac沒有在 的std:map(在else裏面),那麼串in_mac沒有了, 這意味着一個printfin_mac崩潰找到。 GDB也說「無法訪問0x99999a的內存」字符串。

正如我所提到的,同樣的方法在AMD 64位架構上沒有問題。我的猜測是,在ARM體系結構字符串被移動到一個被認爲是「釋放」的地址,崩潰發生,我也懷疑這是來自std:map find函數。 除此之外,我不知道是什麼原因導致這次崩潰。你有什麼想法 ? Thx。

回答

1

的問題是錯字:

in_coor3D[3] = 2.45; 

應該最有可能的是:

in_coor3D[2] = 2.45; 
+0

哦,這真的很尷尬。非常感謝。 – Jonas