最近在學(xué)習(xí)高翔博士的經(jīng)典教程《視覺(jué)SLAM十四講(第2版)》,使用其配套的Github中C++代碼進(jìn)行學(xué)習(xí),在調(diào)試時(shí)發(fā)現(xiàn)斷點(diǎn)無(wú)效、錯(cuò)位的問(wèn)題,查閱了一些資料,成功解決,記錄一下。
編輯器:VSCode
操作系統(tǒng):Ubuntu20.04
調(diào)試方式:cmake + make
關(guān)于在VScode中調(diào)試C++代碼的教程,可以參考這個(gè):Linux下使用VS Code + CMake 調(diào)試c++程序
在最開(kāi)始的時(shí)候,CMakeLists.txt中設(shè)置成了發(fā)布模式(Release),設(shè)置斷點(diǎn)后,調(diào)試時(shí)斷點(diǎn)無(wú)效,即無(wú)法在任何斷點(diǎn)處停下,而在CMakeLists.txt中設(shè)置set(CMAKE_BUILD_TYPE "Debug")
后,調(diào)試時(shí)能夠停下,但是沒(méi)有在斷點(diǎn)處停下,而是在別的地方,如下圖所示:
從這張圖可以看到,斷點(diǎn)設(shè)置在42行,但調(diào)試時(shí)卻停在46行的for循環(huán)入口處,顯然不是我們想要的。
更離譜的是,在某些位置,調(diào)試前斷點(diǎn)設(shè)置在某行,調(diào)試時(shí)斷點(diǎn)卻出現(xiàn)在別的地方,如下圖所示,調(diào)試開(kāi)始前設(shè)置的斷點(diǎn)位置:
調(diào)試時(shí)的斷點(diǎn)位置:
可以看出,調(diào)試前斷點(diǎn)在92行,調(diào)試開(kāi)始后斷點(diǎn)卻在95行,后來(lái)查閱資料才發(fā)現(xiàn),這是代碼編譯優(yōu)化導(dǎo)致的。
在VScode中使用cmake + make 方式調(diào)試C++代碼時(shí),想要正常進(jìn)行斷點(diǎn)調(diào)試,在CMakeLists.txt文件中需要注意以下兩點(diǎn):
set(CMAKE_BUILD_TYPE "Debug")
,如果設(shè)置為"Release"模式,設(shè)置斷點(diǎn)后在調(diào)試時(shí)是默認(rèn)無(wú)效的,進(jìn)入調(diào)試后,斷點(diǎn)會(huì)變?yōu)榭招臄帱c(diǎn),程序不會(huì)在任何斷點(diǎn)處停下。set(CMAKE_CXX_FLAGS "-O3")
(或不寫(xiě)),否則“任何級(jí)別的優(yōu)化都將帶來(lái)代碼結(jié)構(gòu)的改變,將會(huì)使目標(biāo)代碼的執(zhí)行順序變得面目全非,導(dǎo)致調(diào)試信息嚴(yán)重不足?!?/li>綜上,在CMakeLists.txt中設(shè)置如下:
set(CMAKE_BUILD_TYPE "Debug")
# set(CMAKE_CXX_FLAGS "-O3")
調(diào)試時(shí)能夠在斷點(diǎn)處正常停止:
問(wèn)題成功解決。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧