折騰了老半天,總算搞定了vscode調(diào)試C代碼。
系統(tǒng)信息:
- elementary OS 0.4.1 Loki (64-bit)
- 基于 "Ubuntu 16.04.5 LTS" 構(gòu)建
- Linux 4.15.0-43-generic
- GTK+ 版本:3.18.9
配置信息:
- 雙核 Intel? Core? i3-4005U CPU @ 1.70GHz
- Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 0b)
- 4.0 GB 內(nèi)存
- 121.2 GB 硬盤
vscode以及相關(guān)插件
- Visual Studio Code for Linux,版本: 1.30.2
- C/C++,來自Microsoft。必裝插件,提供C/C++支持。
- c_c++
- Code Runnder,來自Jun Han。必裝插件,提供編譯后程序的運行環(huán)境。
- code_runner
從頭總結(jié)配置C程序調(diào)試過程
「1」準備好文件夾和.c程序文件
- 新建空文件夾,任意命名為「vscode_c_debug_conclusion」。
- 文件夾
- vscode中打開上述文件夾,然后在文件夾內(nèi)新建一個hello.c文件。
- hello.c
「2」配置debug調(diào)試條件
「2-1」配置調(diào)試環(huán)境之「launch.json」文件。
- 點擊側(cè)邊欄的「調(diào)試」圖標(biāo),就是那只臭蟲。然后點擊上方的綠色三角右邊的方框,在下拉菜單中選擇「添加配置」。接著,在右邊出現(xiàn)的小彈窗里,選擇「C++(GDB/LLDB)」。
- debug_set_1.png
- vscode將在上述已打開的文件夾下自動生成一個隱藏文件夾「.vscode」和位于其中的一個文件「launch.json」。
- debug_set_2
- 文件「launch.json」中的這句
"program":"enter program name, for example ${workspaceFolder}/a.out",
需要修改,我改成了下面這樣:
"program": "${workspaceFolder}/out_bin/${fileBasenameNoExtension}.debug",
// 這句話表示,要被調(diào)試的文件是冒號右邊的文件
// ${workspaceFolder}是工作空間文件夾,在這里就是上面打開的「vscode_c_debug_conclusion」文件夾的絕對地址。
// out_bin是按個人喜好在當(dāng)前工作空間文件夾下建立的名字為out_bin的空文件夾,用來存放輸出來的調(diào)試文件
// ${fileBasenameNoExtension}是當(dāng)前打開文件的去除了后綴名的文件名稱
// .debug是按個人喜好設(shè)置的輸出來的調(diào)試文件的后綴名
「2-2」配置調(diào)試環(huán)境之「tasks.json」文件。
- 點擊菜單欄的「查看」——「命令面板」,或者直接按快捷鍵「Ctrl+Shift+P」,
- debug_set_3
- 在出現(xiàn)的小彈窗/文本框中輸入單詞「task」,下方會實時出現(xiàn)搜索匹配項,滑動鼠標(biāo)滾輪或向下拖動滾動條,找到「任務(wù):配置任務(wù)」,點擊選中它,
- debug_set_4
- 然后,點擊選中「Others 運行任意外部命令的示例」,
- 再點擊選中出現(xiàn)的「使用模板創(chuàng)建 tasks.json 文件」,(下方圖示為合并圖片)。
- debug_set_5.png
- 跟前面的「launch.json」的創(chuàng)建情況一樣,vscode這時在.vscode這個隱藏文件夾下自動創(chuàng)建了一個「tasks.json」文件,
- debug_set_6
- 這個「tasks.json」文件的作用是,在「launch.json」調(diào)用被調(diào)試的文件之前,把被調(diào)試的文件給準備好。
"label":"echo" // "label"是一個屬性,vscode的解釋是「任務(wù)的用戶界面標(biāo)簽」,
// 說得直白一點"label"代表的是,這個「任務(wù)/tasks」的名字。默認的名字是「echo」。
// 根據(jù)個人喜歡,我這里把值改成了"builddebug"。
- 前面已經(jīng)在「launch.json」里把被調(diào)試的文件的名字過了,這里肯定也要一樣才行。
"command":"echo Hello" // "command"代表「要執(zhí)行的命令。可以是外部程序或shell命令。」
// 我們要改成把打開的c程序文件編譯為可執(zhí)行文件,并且要可調(diào)試,
// 所以把值"echo Hello"改為我們需要的"gcc -g ${file} -o out_bin/${fileBasenameNoExtension}.debug"
- debug_set_7
- 接下來,再回到「launch.json」文件里,添加一句話,告訴vscode在執(zhí)行它之前,還得先執(zhí)行「tasks.json」里寫的任務(wù)。
- 在「launch.json」文件里增加這樣一行,如果是增加在最后的話,記得給前面一行的末尾增加一個英文半角的逗號:
"preLaunchTask":"builddebug"
// 如果在文件末尾添加這一行的話,這句最后不要有逗號,同時要在前面一句的后面增加一個逗號
// 把tasks.json里的label的名字拿過來用,這樣才對得上。
- debug_set_8
「2-3」配置調(diào)試環(huán)境之「launch.json」文件之二。
經(jīng)過了上面的配置,其實已經(jīng)可以調(diào)試了,只不過還有一點異常,那就是「斷點不起作用」,那也就是仍然沒法進入調(diào)試狀態(tài)。
- debug_set_9
-
debug_set_10
后來,在「launch.json」文件里看到了這樣一個設(shè)置:
"externalConsole":"true"
// "externalConsole"代表「是否使用外部控制臺來做調(diào)試」,true表示使用,false表示不使用。
// 之前vscode自動創(chuàng)建的這個launch.json里的默認值是true,然而似乎并沒有設(shè)置什么用來調(diào)試的外部控制臺啊!
// 把值改為false。
// 再按下F5鍵,啟動調(diào)試——OK了。vscode右下部分的「終端」顯示信息一開始和之前的一樣,
// 大約2秒鐘過后出現(xiàn)變化,同時可以看到斷點起作用了。
今天第一次配置的時候,跟著網(wǎng)上的不同的教程做了半天,一直卡在這一步,后來還是一句一句看究竟是什么意思,才摸索出來,累得是滿頭大汗!
初學(xué)者的痛苦,有誰能懂?
- debug_set_11
- 所以,最終的「launch.json」文件是這樣的,
- debug_set_12
「3」調(diào)整「Code Runnder」插件的設(shè)置
在「Code Runnder」這個「提供編譯后程序的運行環(huán)境」的插件里,可以對一些設(shè)置進行調(diào)整,從而滿足個人的編譯習(xí)慣等。
注意:這個插件的選項是針對整個vscode的,和前面的位于當(dāng)前打開文件夾下隱藏文件夾中的「launch.json」和「tasks.json」文件的作用范圍是不一樣的。
- 依次點擊上方菜單欄里的「文件」——「首選項」——「設(shè)置」,或者直接按下快捷鍵「Ctrl+,(逗號)」,打開設(shè)置界面,
- coderunner_1
- coderunner_2
- 在設(shè)置搜索框里,輸入code runner或coderunner,有沒有空格都行,vscode自動就匹配到Code Runner插件的結(jié)果了。點擊一下那個「Run Code confi...(20)」,在它的右邊顯示的就全都是Code Runner插件的設(shè)置選項了。
「3-1」調(diào)整「Code-runner:Executor Map」的設(shè)置
- 其中的「Code-runner:Executor Map」選項,可以改變編譯出來的可執(zhí)行文件的名稱、存放位置、編譯完成后調(diào)用系統(tǒng)自帶終端來運行等等設(shè)置,我這里只對「直接編譯出來的可執(zhí)行文件的名稱以及存放位置」進行調(diào)整。
- 根據(jù)指示,單擊「Code-runner:Executor Map」這行文字下面的「在settings.json中編輯」的超鏈接,這樣就打開了一個新文件標(biāo)簽「{ }用戶設(shè)置」,
- coderunner_3
- 我這里只改了與C有關(guān)的設(shè)置,其它語言的設(shè)置要不要拷貝到右邊「用戶設(shè)置」里,我因為現(xiàn)在也用不上,就沒有測試。
- 把左邊只讀文件「默認用戶設(shè)置」中的
"code-runner.executorMap"{
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
}
// 因為這個設(shè)置在這里是唯一一個,所以它的大括號最后沒有英文半角逗號
復(fù)制到右邊的第一個位置的「用戶設(shè)置」里,并改為如下內(nèi)容:
"code-runner.executorMap": {
"c":"cd $dir && gcc $fileName -o $dir/out_bin/$fileNameWithoutExt.out && $dir/out_bin/$fileNameWithoutExt.out",
},
// 因為這里的用戶自定義設(shè)置有很多項,這一項也不是最后一項,所以大括號后面要跟一個英文半角逗號,否則會提示有錯誤。
// 這個選項表示的是通過Code Runner這個插件編譯源文件的得到可執(zhí)行文件的具體過程,
// 具體的就不一一解釋了,我改的只是最后編譯出來的可執(zhí)行文件的名字,和它存放的位置,
// 這個主要是看個人喜好吧。
// 另外,在網(wǎng)上看到的教程里有調(diào)用系統(tǒng)自帶終端來運行編譯出來的可執(zhí)行文件的,但是我沒有嘗試成功,就暫時放下了。
- 設(shè)置完成后,關(guān)閉「{ }用戶設(shè)置」標(biāo)簽即可,設(shè)置已經(jīng)被vscode實時保存了。
「3-2」調(diào)整「Code Runner」插件的其它設(shè)置
「Code-runner:Run In Terminal」,是否在vscode內(nèi)部終端中運行代碼,
- 在vscode內(nèi)部終端中運行代碼
- 不在vscode內(nèi)部終端中運行代碼.png
我覺得還是「不在vscode內(nèi)部終端中運行代碼」的結(jié)果更美觀!
不過,這樣的話在運行需要輸入(比如有scanf等函數(shù))時,就沒法輸入了。
所以,還是把「在vscode內(nèi)部終端運行代碼」打上勾吧!(20190121新增以上2行。)
其它幾個「Code Runner」的選項設(shè)置,
- coderunner_4.png
- coderunner_5.png
有些是默認設(shè)置,有些是改過了的,但是我現(xiàn)在已經(jīng)想不起來哪些是改過了的,嘿嘿!
總結(jié)完畢,收工。
這樣應(yīng)該清楚多了吧!
今天上網(wǎng)查找教程的時候翻來覆去地出現(xiàn)了很多周折,具體的原因除了本人是新手、教程側(cè)重點不同等等之外,還有一個大坑就是微軟這個家伙多次更新vscode的時候,把「設(shè)置」本身的樣式也給更新了很多,所以以前老版本的設(shè)置,在新版本里根本看不到、對不上!真是氣啊!
一生氣就想起了WM10,可憐當(dāng)年大把銀子入手的擼妹啊!唉,說起來都是淚!
好吧,就寫這么多了,希望能對配置vscode調(diào)試c或c++的初學(xué)者有所幫助吧!共勉!
硯湖@飄香生活館
二〇一九年一月十七日