一篇帶你用VS Code調(diào)試C代碼

1、前言
首先說(shuō)明的是vscode是代碼編輯器,并不是編譯器,它本身并不能編譯C語(yǔ)言。
在這里我們使用的是MinGW-w64作為C語(yǔ)言的編譯器。MinGW-w64的前身是MinGW的全稱(chēng)是:Minimalist GNU on Windows。它實(shí)際上是將經(jīng)典的開(kāi)源 C語(yǔ)言 編譯器 GCC 移植到了 Windows 平臺(tái)下,并且包含了 Win32API ,因此可以將源代碼編譯為可在 Windows 中運(yùn)行的可執(zhí)行程序。
而且還可以使用一些 Windows 不具備的,Linux平臺(tái)下的開(kāi)發(fā)工具。一句話(huà)來(lái)概括:MinGW 就是 GCC 的 Windows 版本 。
我們這里使用的MinGW-w64是MinGW的升級(jí)版,MinGW只能編譯32位程序,而MinGW-w64可以編譯64位和32位程序。MinGW已經(jīng)停止更新了,所以大家還是要使用MinGW-w64。
MinGW-w64推薦去官網(wǎng)下載:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/。

- 下載綠色版,下載速度快。
- 下載windows的安裝版,一般情況下下載失敗。
所以演示綠色版的安裝過(guò)程,綠色版只是需要添加環(huán)境變量,將綠色版解壓到D盤(pán)根目錄,如下:

按步驟添加環(huán)境變量。

測(cè)試MinGW-w64是否安裝完畢。

2、編譯C代碼
下面將用MinGW-w64編譯C代碼,正如上文所說(shuō)MinGW-w64就是gcc的windows版,所以直接就是gcc編譯C代碼。在D盤(pán)新建目錄C,并在目錄C中新建main.c文件,代碼如下:
#include <stdio.h>
#include <AclAPI.h>
int main(){
char name[100];
printf("What is your name?\n");
scanf("%s",name);
printf("Hello,%s,nice to meet you!\n",name);
}
這就是一個(gè)簡(jiǎn)單C程序。下面使用window的cmd編譯并運(yùn)行這個(gè)C程序。

使用windows的powershell編譯也是一樣的結(jié)果。

3、vscode編譯
上面演示了如何使用MinGW-w64編譯C代碼,vscode只需要調(diào)用這些命令就可以編譯C代碼,那么vscode的插件就可以?xún)?yōu)雅的解決這個(gè)問(wèn)題,code runner是一款優(yōu)秀的編譯插件。

因?yàn)槲覀兊腃代碼使用了scanf,需要在終端輸入所以需要使能code runner的Run In Terminal功能。

安裝了這款插件,在右側(cè)會(huì)出現(xiàn)一個(gè)運(yùn)行按鈕。

點(diǎn)擊這個(gè)運(yùn)行按鈕,就能編譯并運(yùn)行這個(gè)C代碼。注意看下圖1處,其實(shí)就是調(diào)用gcc的命令,和我們上面講的一樣。


類(lèi)似的插件還有C/C++ Compile Run插件。


離開(kāi)插件就不能編譯???vscode當(dāng)然可以自己調(diào)用gcc,自己完成代碼的編譯,選擇運(yùn)行->以非調(diào)試模式運(yùn)行。這里我們只是編譯C代碼,然后運(yùn)行,debug調(diào)試的問(wèn)題,下面再說(shuō)。


依次選擇C++(GDB/LLDB)和C/C++: gcc.exe 生成活動(dòng)文件。


看到終端輸出如下(下圖我將兩個(gè)終端并排顯示,默認(rèn)不是這樣顯示的)。


這里可以看到,vscode運(yùn)行了兩個(gè)終端,一個(gè)編譯C語(yǔ)言,一個(gè)運(yùn)行C程序。并且產(chǎn)生了兩個(gè)文件如下:


launch.json作用是在C語(yǔ)言文件啟動(dòng)調(diào)試時(shí)提供配置參數(shù)。
tasks.json是一個(gè)任務(wù),用于編譯C語(yǔ)言的。
關(guān)于報(bào)錯(cuò),下面制造了一個(gè)簡(jiǎn)單的錯(cuò)誤,在終端中給出了出錯(cuò)的位置,這是gcc給出的錯(cuò)誤,也就是導(dǎo)致編譯不過(guò)的錯(cuò)誤。

但下圖的錯(cuò)誤,是vscode認(rèn)為你有錯(cuò)誤,給你提示的,不是所有vscode報(bào)的錯(cuò)誤gcc都會(huì)認(rèn)為有問(wèn)題的。并且vscode給出的錯(cuò)誤一般與安裝的插件有關(guān)。我們重點(diǎn)看gcc的錯(cuò)誤。

4、多文件編譯
上面已經(jīng)完成了C的編譯和運(yùn)行,但只是一個(gè)文件,正常情況下一般會(huì)有多個(gè)文件。
我們有以下源碼來(lái)驗(yàn)證多文件編譯。
//main.c
#include<stdio.h>
#include "a.h"
int main(void) {
int number;
printf("input:\n");
scanf("%d", &number);
printHello();
if((number > 1) && (number <= 100)) {
printf("Small\n");
} else if((number > 101) && (number <= 200)) {
printf("Middle\n");
} else {
printf("Large\n");
}
return 0;
}
//a.c
#include<stdio.h>
#include "a.h"
void printHello(void) {
printf("Hello world");
}
//a.h
#ifndef __A_H_
#define __A_H_
void printHello(void);
#endif
首先使用code runner,運(yùn)行結(jié)果如下:

可以看出,code runner只編譯main.c,編譯報(bào)錯(cuò)找不到a.c中的printHello函數(shù)。修改code runner的擴(kuò)展配置Excutor Map,單擊前面的小齒輪,選擇:將設(shè)置復(fù)制為JSON文本。

然后單擊在settings.json中編輯。

打開(kāi)文件如下settings.json。

其中的一句代碼是我們配置使能runInTerminal的,將我們剛剛復(fù)制的粘貼到它的下一行。

注意1處需要添加一個(gè)逗號(hào),并將2處的$fileName修改為*.c,如下:

保存文件,返回main.c,執(zhí)行code cunner的運(yùn)行按鈕,可以看到執(zhí)行g(shù)cc的編譯時(shí),編譯所有的c源文件。

看到這里,大家應(yīng)該就理解了配置文件和執(zhí)行的gcc命令之間的關(guān)系了。
對(duì)于上文提到的vscode自己也可以編譯的問(wèn)題,不使用插件如何編譯多個(gè)文件?上文提到task.json是編譯C程序的,它的配置如下:

同理將1處的${file}修改為*.c就可以編譯多個(gè)C文件了。這里就不再演示了。
5、調(diào)試
調(diào)試是很簡(jiǎn)單的,在調(diào)試之前需要保證編譯時(shí)沒(méi)有問(wèn)題的(雖然這句話(huà)像是廢話(huà))在其他IDE中你可以直接debug調(diào)試,但在VScode中,建議你先編譯,首選保證編譯過(guò)了。因?yàn)関sode的編譯環(huán)境是配置的,可能出現(xiàn)問(wèn)題,如果編譯不通過(guò)那就更不能調(diào)試了。
編譯通過(guò)的程序,選中main.c直接選擇運(yùn)行->啟動(dòng)調(diào)試。

剩下的就和普通的IDE沒(méi)有大的差異了。

- 自動(dòng)查看變量。
- 手動(dòng)查看變量。
- 調(diào)用的堆棧信息。
- 可以和其他IDE一樣打斷點(diǎn)。
- 分別是運(yùn)行,單步,進(jìn)入函數(shù),跳出函數(shù),復(fù)位,停止等常見(jiàn)的調(diào)試按鈕。
- 終端交互界面。


























