解决vscode下调试c/c++程序一闪而过的问题(Windows)

 更新时间:2020年08月07日 08:59:18   作者:张麦麦啊  
这篇文章主要介绍了解决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",
  "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"//解决中文乱码
      ]
    }
  ],
  "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++程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 将CString字符串输入转化成整数的实现方法

    将CString字符串输入转化成整数的实现方法

    下面小编就为大家带来一篇将CString字符串输入转化成整数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • C语言 structural body结构体详解用法

    C语言 structural body结构体详解用法

    C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项,结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性
    2021-10-10
  • C++深入刨析muduo中的抽象类Poller

    C++深入刨析muduo中的抽象类Poller

    muduo网络库中Poller类是一个抽象类,用户使用PollPoller或者EPollPoller类,下面跟随小编一起来详细了解一下
    2022-04-04
  • C语言实例之双向链表增删改查

    C语言实例之双向链表增删改查

    双向链表(Doubly Linked List)是一种常见的数据结构,在单链表的基础上增加了向前遍历的功能,与单向链表不同,双向链表的每个节点除了包含指向下一个节点的指针外,还包含指向前一个节点的指针,本文给大家介绍了C语言中双向链表的增删改查
    2023-08-08
  • Linux系统下如何使用C++解析json文件详解

    Linux系统下如何使用C++解析json文件详解

    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。下面这篇文章主要给大家介绍了关于Linux系统下如何使用C++解析json文件的相关资料,需要的朋友可以参考下
    2021-06-06
  • QT实现秒表项目

    QT实现秒表项目

    这篇文章主要为大家详细介绍了QT实现秒表项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言实现贪吃蛇游戏代码

    C语言实现贪吃蛇游戏代码

    这篇文章主要为大家详细介绍了C语言实现贪吃蛇游戏代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • C语言版扫雷小游戏

    C语言版扫雷小游戏

    这篇文章主要为大家详细介绍了C语言版的扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • c++动态规划经典算法

    c++动态规划经典算法

    动态规划算法通常用于求解具有某种最优性质的问题。本文主要介绍了c++动态规划经典算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言实现随机抢红包功能

    C语言实现随机抢红包功能

    这篇文章主要为大家详细介绍了C语言实现随机抢红包功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07

最新评论