問題
高翔slam project 0.3 在make的時候一切正常。但是在運行的時候會報錯:double free or corruption (out)
在用gdb調試的時候,可以知道調試信息:
double free or corruption (out)
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: 沒有那個文件或目錄.
(gdb) bt
#0 0x00007ffff57d9e97 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007ffff57db801 in __GI_abort () at abort.c:79
#2 0x00007ffff5824897 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7ffff5951b9a "%s\n")
at ../sysdeps/posix/libc_fatal.c:181
#3 0x00007ffff582b90a in malloc_printerr (str=str@entry=0x7ffff5953870 "double free or corruption (out)") at malloc.c:5350
#4 0x00007ffff5832e75 in _int_free (have_lock=0, p=0x555555821f10, av=0x7ffff5b86c40 <main_arena>) at malloc.c:4278
#5 0x00007ffff5832e75 in __GI___libc_free (mem=0x555555821f20) at malloc.c:3124
#6 0x00007ffff50ecc4d in g2o::EdgeProjectP2MC_Intrinsics::~EdgeProjectP2MC_Intrinsics() () at /usr/local/lib/libg2o_types_sba.so
#7 0x00007ffff557b1f7 in g2o::Factory::registerType(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, g2o::AbstractHyperGraphElementCreator*) () at /usr/local/lib/libg2o_core.so
#8 0x00007ffff50e4b1a in _GLOBAL__sub_I_types_sba.cpp () at /usr/local/lib/libg2o_types_sba.so
#9 0x00007ffff7de5733 in call_init (env=0x7fffffffdc60, argv=0x7fffffffdc48, argc=2, l=<optimized out>) at dl-init.c:72
#10 0x00007ffff7de5733 in _dl_init (main_map=0x7ffff7ffe170, argc=2, argv=0x7fffffffdc48, env=0x7fffffffdc60) at dl-init.c:119
#11 0x00007ffff7dd60ca in _dl_start_user () at /lib64/ld-linux-x86-64.so.2
#12 0x0000000000000002 in ()
#13 0x00007fffffffe01a in ()
#14 0x00007fffffffe060 in ()
#15 0x0000000000000000 in ()
剛開始以為是g2o的問題,所以一直在搜索。
解決
就在高翔slam的gihub網址上看到了解決方案:link
將set( CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3" )
改成set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )
就刪掉了一個-march=native
然后重新編譯,居然就可以運行了 。
資料查閱
可是據我所知-march=native
應該是一個指定目標程序的cpu架構來進行程序優化。native就是相當於自檢測cpu。總之-march是gcc優化選項。
具體參考:link
我查閱到gcc官網記錄了這個bug:Bug c/70136
不過環境不一樣,我的機器是:
Intel i7 6700k
ubuntu 18.04
gcc 5.5
具體原因后期再看,不過應該是環境的原因,和代碼沒關系。
5.6更新
貌似只要加了-march=native
所有的節點與邊的析構函數都會報錯。