https://blog.csdn.net/u011316675/article/details/106963122 解決vscode下調(diào)試c/c++程序一閃而過(guò)(Windows) 張???????????麥麥 于 2020-06-25 22:36:50 發(fā)布 14704 收藏 80 分類專欄: 筆記 文章標(biāo)簽: visual studio c語(yǔ)言 c++ debug 版權(quán) 筆記 專欄收錄該內(nèi)容 5 篇文章0 訂閱 訂閱專欄 起因 開(kāi)始學(xué)習(xí)c語(yǔ)言了,一開(kāi)始想的就是直接裝個(gè)VS就完了,但是一搜都是說(shuō)vs臃腫啥啥不好,不如用vscode來(lái)整,多輕量~于是就網(wǎng)上搜了許多教程開(kāi)整了,期間也遇到了一些常見(jiàn)的坑,這些集中寫(xiě)個(gè)文,希望可以幫助到大家。配置文件也是來(lái)自其他文章的,我也進(jìn)行了部分修改,后面會(huì)標(biāo)出。 解決方法 我們知道使用vscode對(duì)c/c++進(jìn)行調(diào)試的本質(zhì)是這樣的——1.GCC編譯代碼,2.vscode運(yùn)行編譯出的程序。因此調(diào)試運(yùn)行程序一閃而過(guò)的本質(zhì)就是命令行程序運(yùn)行完結(jié)果直接自動(dòng)關(guān)閉了,這和c/c++程序本身也有關(guān)系。 所以對(duì)于這種問(wèn)題,我們可以很自然而然的想到兩種解決方法: A.在控制臺(tái)中直接運(yùn)行該程序 原理: 我們直接打開(kāi)cmd/powershell等,輸入對(duì)應(yīng)程序的地址,運(yùn)行即可。我們不想讓他一閃而過(guò)的原因是我們需要看到輸出結(jié)果,而不是程序單純的運(yùn)行一下就完事兒了,因此這樣就行了,但是每次都打開(kāi)cmd似乎也太麻煩了,因此我們也可以在vscode上實(shí)現(xiàn)這個(gè)功能。 前面說(shuō)過(guò)一般我們用vscode調(diào)試c/c++的過(guò)程,這里細(xì)化一下,大概是這樣的:vscode先從launch.json中根據(jù)啟動(dòng)參數(shù)進(jìn)行調(diào)試,其中我們配置了preLaunchTask這個(gè)參數(shù)調(diào)用task.json中的任務(wù),一般在task.json中配置一個(gè)任務(wù)調(diào)用gcc進(jìn)行編譯。 因此我們只需要在launch中配置一個(gè)cmd程序來(lái)打開(kāi)我們task.json中任務(wù)編譯的結(jié)果就可以了,但是這種調(diào)用下還是會(huì)出現(xiàn)閃退的問(wèn)題,因此我們補(bǔ)充一個(gè)pause指令;同時(shí)也發(fā)現(xiàn)了另一個(gè)問(wèn)題,pause指令的”按任意鍵繼續(xù)……”并沒(méi)用自動(dòng)換行,反而和輸出內(nèi)容在一起,于是我們?cè)谘a(bǔ)充一個(gè)“echo.”用作換行符。 因此我們完整的指令是這樣的 /C yourprogram.exe echo. pause 1 2 3 解決方法: 如果放到launch.json文件中則是這樣的。 { "version": "0.2.0", "configurations": [ { "name": "(Windows) Launch", "type": "cppvsdbg", "request": "launch", "program": "cmd", "preLaunchTask": "echo",//這里需要換成你task.json中的任務(wù)名 "args": [ "/C", "${fileDirname}\\${fileBasenameNoExtension}.exe", "&", "echo.", "&", "pause" ], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole":true } ] } ] } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 需要說(shuō)明的是,這并不是一個(gè)完美的解決方案,在這種情況下斷點(diǎn)調(diào)試是沒(méi)用的。 B.添加一些代碼實(shí)現(xiàn) 解決方法 a.程序結(jié)尾處加getchar();一個(gè)不行(比如前面有scanf之類的函數(shù)使用,就會(huì)在緩沖區(qū)讀取字符,結(jié)果還是會(huì)自動(dòng)關(guān)閉)就加倆,倆不行就…… b.先清除緩沖區(qū),再getchar(); while(getchar()!='\n') //這兩句代碼是清空輸入緩沖區(qū)內(nèi)容,等同于fflush(stdin); continue; getchar(); 1 2 3 c.方法A中的原理一樣,只不過(guò)改成了在程序本身執(zhí)行。 #include <stdlib.h> system("pause"); 1 2 C.在代碼結(jié)尾處添加斷點(diǎn) 前面我們說(shuō)了,方法A中并不能使用調(diào)試功能。而在你能正常使用調(diào)試功能的前提下,可以直接在代碼結(jié)尾處斷點(diǎn)解決。 寫(xiě)在最后 需要說(shuō)明的是,除了你代碼中解決閃退問(wèn)題,否則如果你直接打開(kāi)編譯完的exe,大概率也會(huì)直接閃退。以上內(nèi)容是在windows環(huán)境下的,其他系統(tǒng)可能略有差異。 我個(gè)人而言,我更喜歡方法A,但是需要調(diào)試的場(chǎng)景下,我則切換到普通的啟動(dòng)方式通過(guò)斷點(diǎn)來(lái)解決這個(gè)問(wèn)題。 最后提供我的兩份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相對(duì)應(yīng) "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 tasks.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 } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 如果你需要更詳細(xì)的安裝教程,csdn上已經(jīng)有很多完整的文章了,這里我就不多贅述了。 以下是參考到的資料,實(shí)際上還有更多,但是已經(jīng)無(wú)法一一標(biāo)注了,如果有任何問(wèn)題歡迎直接聯(lián)系我。 參考資料: https://bs.csdn.net/topics/370159790 https://blog.csdn.net/weixin_43434136/article/details/106884469 (悄咪咪問(wèn)下我的"externalConsole": true關(guān)掉后在內(nèi)置的powershell中打開(kāi)并沒(méi)有輸出也不能輸入,google后好像發(fā)現(xiàn)是本身的一個(gè)bug? ps英文輸入法下也是如此,有的人說(shuō)是中文輸入法。不知道有沒(méi)有大神有方法解決。。。) 張???????????麥麥 關(guān)注 27 8 80 專欄目錄 解決vscode下調(diào)試c/c++程序一閃而過(guò)的問(wèn)題(Windows) 08-18 Enable pretty-printing for gdb VSCODE 針對(duì)調(diào)試C語(yǔ)言時(shí)一閃而過(guò)解決辦法 weixin_30488085的博客 4509 針對(duì)調(diào)試C語(yǔ)言時(shí)一閃而過(guò)解決辦法 前提: 已經(jīng)按照 C/C++ 已經(jīng)安裝 MINGW(并配置完成) 原因: 主要是因?yàn)閠asks的配置沒(méi)有寫(xiě)對(duì) 解決辦法: tasks.js ———————————————— 版權(quán)聲明:本文為CSDN博主「張???????????麥麥」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/u011316675/article/details/106963122
|
|