您好,登錄后才能下訂單哦!
起因
開始學習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", "configurations": [ { "name": "(Windows) Launch", "type": "cppvsdbg", "request": "launch", "program": "cmd", "preLaunchTask": "echo", "args": [ "/C", "${fileDirname}\\${fileBasenameNoExtension}.exe", "&", "echo.", "&", "pause" ], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole":true }, { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "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"http://解決中文亂碼 ] } ], "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++程序內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。