VS Code除錯C程式碼

Fireflycjd發表於2022-03-13

1、前言

首先說明的是vscode是程式碼編輯器,並不是編譯器,它本身並不能編譯C語言。

在這裡我們使用的是MinGW-w64作為C語言的編譯器。MinGW-w64的前身是MinGW的全稱是:Minimalist GNU on Windows。它實際上是將經典的開源 C語言 編譯器 GCC 移植到了 Windows 平臺下,並且包含了 Win32API ,因此可以將原始碼編譯為可在 Windows 中執行的可執行程式。

而且還可以使用一些 Windows 不具備的,Linux平臺下的開發工具。一句話來概括:MinGW 就是 GCC 的 Windows 版本 。

我們這裡使用的MinGW-w64是MinGW的升級版,MinGW只能編譯32位程式,而MinGW-w64可以編譯64位和32位程式。MinGW已經停止更新了,所以大家還是要使用MinGW-w64。

MinGW-w64推薦去官網下載:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/

1:下載綠色版,下載速度快

2:下載windows的安裝版,一般情況下下載失敗

所以演示綠色版的安裝過程,綠色版只是需要新增環境變數,將綠色版解壓到D盤根目錄,如下

 按步驟新增環境變數

 測試MinGW-w64是否安裝完畢

 

 2、編譯C程式碼

下面將用MinGW-w64編譯C程式碼,正如上文所說MinGW-w64就是gcc的windows版,所以直接就是gcc編譯C程式碼。在D盤新建目錄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);   
}

這就是一個簡單C程式。下面使用window的cmd編譯並執行這個C程式。

 使用windows的powershell編譯也是一樣的結果

 

3、vscode編譯

上面演示瞭如何使用MinGW-w64編譯C程式碼,vscode只需要呼叫這些命令就可以編譯C程式碼,那麼vscode的外掛就可以優雅的解決這個問題,code runner是一款優秀的編譯外掛。

 因為我們的C程式碼使用了scanf,需要在終端輸入所以需要使能code runner的Run In Terminal功能。

 安裝了這款外掛,在右側會出現一個執行按鈕

 點選這個執行按鈕,就能編譯並執行這個C程式碼。注意看下圖1處,其實就是呼叫gcc的命令,和我們上面講的一樣。

 類似的外掛還有C/C++ Compile Run外掛。

 離開外掛就不能編譯???vscode當然可以自己呼叫gcc,自己完成程式碼的編譯,選擇執行->以非除錯模式執行。這裡我們只是編譯C程式碼,然後執行,debug除錯的問題,下面再說。

 依次選擇C++(GDB/LLDB)和C/C++: gcc.exe 生成活動檔案

 看到終端輸出如下(下圖我將兩個終端並排顯示,預設不是這樣顯示的)

 這裡可以看到,vscode執行了兩個終端,一個編譯C語言,一個執行C程式。並且產生了兩個檔案如下

 launch.json作用是在C語言檔案啟動除錯時提供配置引數

tasks.json是一個任務,用於編譯C語言的

關於報錯,下面製造了一個簡單的錯誤,在終端中給出了出錯的位置,這是gcc給出的錯誤,也就是導致編譯不過的錯誤。

 但下圖的錯誤,是vscode認為你有錯誤,給你提示的,不是所有vscode報的錯誤gcc都會認為有問題的。並且vscode給出的錯誤一般與安裝的外掛有關。我們重點看gcc的錯誤。

 

4、多檔案編譯

上面已經完成了C的編譯和執行,但只是一個檔案,正常情況下一般會有多個檔案。

我們有以下原始碼來驗證多檔案編譯。

//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,執行結果如下

 可以看出,code runner只編譯main.c,編譯報錯找不到a.c中的printHello函式。修改code runner的擴充套件配置Excutor Map,單擊前面的小齒輪,選擇:將設定複製為JSON文字

然後單擊在settings.json中編輯

開啟檔案如下settings.json

其中的一句程式碼是我們配置使能runInTerminal的,將我們剛剛複製的貼上到它的下一行

注意1處需要新增一個逗號,並將2處的$fileName修改為*.c,如下

儲存檔案,返回main.c,執行code cunner的執行按鈕,可以看到執行gcc的編譯時,編譯所有的c原始檔。

看到這裡,大家應該就理解了配置檔案和執行的gcc命令之間的關係了。

對於上文提到的vscode自己也可以編譯的問題,不使用外掛如何編譯多個檔案?上文提到task.json是編譯C程式的,它的配置如下

同理將1處的${file}修改為*.c就可以編譯多個C檔案了。這裡就不再演示了。

5、除錯

除錯是很簡單的,在除錯之前需要保證編譯時沒有問題的(雖然這句話像是廢話)在其他IDE中你可以直接debug除錯,但在VScode中,建議你先編譯,首選保證編譯過了。因為vsode的編譯環境是配置的,可能出現問題,如果編譯不通過那就更不能除錯了。

編譯通過的程式,選中main.c直接選擇執行->啟動除錯。

剩下的就和普通的IDE沒有大的差異了

1:自動檢視變數

2:手動檢視變數

3:呼叫的堆疊資訊

4:可以和其他IDE一樣打斷點

5:分別是執行,單步,進入函式,跳出函式,復位,停止等常見的除錯按鈕

6:終端互動介面

 

點選檢視本文所在的專輯:開發工具

相關文章