1. 程式人生 > 程式設計 >解決vscode下除錯c/c++程式一閃而過的問題(Windows)

解決vscode下除錯c/c++程式一閃而過的問題(Windows)

起因

開始學習c語言了,一開始想的就是直接裝個VS就完了,但是一搜都是說vs臃腫啥啥不好,不如用vscode來整,多輕量~於是就網上搜了許多教程開整了,期間也遇到了一些常見的坑,這些集中寫個文,希望可以幫助到大家。配置檔案也是來自其他文章的,我也進行了部分修改,後面會標出。

解決方法

我們知道使用vscode對c/c++進行除錯的本質是這樣的——1.GCC編譯程式碼,2.vscode執行編譯出的程式。因此除錯執行程式一閃而過的本質就是命令列程式執行完結果直接自動關閉了,這和c/c++程式本身也有關係。
所以對於這種問題,我們可以很自然而然的想到兩種解決方法:

A.在控制檯中直接執行該程式原理:

我們直接開啟cmd/powershell等,輸入對應程式的地址,執行即可。我們不想讓他一閃而過的原因是我們需要看到輸出結果,而不是程式單純的執行一下就完事兒了,因此這樣就行了,但是每次都開啟cmd似乎也太麻煩了,因此我們也可以在vscode上實現這個功能。

前面說過一般我們用vscode除錯c/c++的過程,這裡細化一下,大概是這樣的:vscode先從launch.json中根據啟動引數進行除錯,其中我們配置了preLaunchTask這個引數呼叫task.json中的任務,一般在task.json中配置一個任務呼叫gcc進行編譯。
因此我們只需要在launch中配置一個cmd程式來開啟我們task.json中任務編譯的結果就可以了,但是這種呼叫下還是會出現閃退的問題,因此我們補充一個pause指令;同時也發現了另一個問題,pause指令的”按任意鍵繼續……”並沒用自動換行,反而和輸出內容在一起,於是我們在補充一個“echo.”用作換行符。
因此我們完整的指令是這樣的

/C yourprogram.exe
echo.
pause

解決方法:

如果放到launch.json檔案中則是這樣的。

{
  "version": "0.2.0","configurations": [
    {
      "name": "(Windows) Launch","type": "cppvsdbg","request": "launch","program": "cmd","preLaunchTask": "echo",//這裡需要換成你task.json中的任務名
      "args": [
        "/C","${fileDirname}\\${fileBasenameNoExtension}.exe","&","echo.","pause"
      ],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole":true
    }
      ]

    }
  ]
}

需要說明的是,這並不是一個完美的解決方案,在這種情況下斷點除錯是沒用的。

B.新增一些程式碼實現解決方法

a.程式結尾處加getchar();一個不行(比如前面有scanf之類的函式使用,就會在緩衝區讀取字元,結果還是會自動關閉)就加倆,倆不行就……
b.先清除緩衝區,再getchar();

while(getchar()!='\n') //這兩句程式碼是清空輸入緩衝區內容,等同於fflush(stdin);
 continue;
getchar();

c.方法A中的原理一樣,只不過改成了在程式本身執行。

#include <stdlib.h>
system("pause");

C.在程式碼結尾處新增斷點

前面我們說了,方法A中並不能使用除錯功能。而在你能正常使用除錯功能的前提下,可以直接在程式碼結尾處斷點解決。

寫在最後

需要說明的是,除了你程式碼中解決閃退問題,否則如果你直接開啟編譯完的exe,大概率也會直接閃退。以上內容是在windows環境下的,其他系統可能略有差異。
我個人而言,我更喜歡方法A,但是需要除錯的場景下,我則切換到普通的啟動方式通過斷點來解決這個問題。
最後提供我的兩份json檔案以供各位參考:
launch.json:

{
  "version": "0.2.0","args": [
        "/C","externalConsole":true
    },{
      "name": "(gdb) Launch","type": "cppdbg","program": "${workspaceFolder}/${fileBasenameNoExtension}.exe","args": [],"externalConsole": true,"MIMode": "gdb","miDebuggerPath": "F:\\mingw\\bin\\gdb.exe",// 自己電腦的gdb
      "preLaunchTask": "echo",//這裡和task.json的label相對應
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true
        }
      ]

    }
  ]
}

task.json

{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0","tasks": [
    {
      "label": "echo","type": "shell","command": "gcc","args": [
        "-g","${file}","-o","${fileBasenameNoExtension}.exe","-fexec-charset=GBK"//解決中文亂碼
      ]
    }
  ],"presentation": {
    "echo": true,"reveal": "always","focus": false,"panel": "shared","showReuseMessage": true,"clear": false
  }
}

如果你需要更詳細的安裝教程,csdn上已經有很多完整的文章了,這裡我就不多贅述了。
以下是參考到的資料,實際上還有更多,但是已經無法一一標註了,如果有任何問題歡迎直接聯絡我。

參考資料:
https://bs.csdn.net/topics/370159790
https://blog.csdn.net/weixin_43434136/article/details/106884469

(悄咪咪問下我的"externalConsole": true關掉後在內建的powershell中開啟並沒有輸出也不能輸入,google後好像發現是本身的一個bug? ps英文輸入法下也是如此,有的人說是中文輸入法。不知道有沒有大神有方法解決。。。)

到此這篇關於解決vscode下除錯c/c++程式一閃而過(Windows)的文章就介紹到這了,更多相關vscode除錯c/c++程式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!