解决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++程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ COM编程之什么是组件?

    C++ COM编程之什么是组件?

    这篇文章主要介绍了COM编程之什么是组件?COM组件是以Win32动态链接库(DLLs)或可执行文件(EXEs)的形式发布的可执行代码,需要的朋友可以参考下
    2014-10-10
  • C/C++格式化日志库实现代码

    C/C++格式化日志库实现代码

    这篇文章主要介绍了C/C++格式化日志库实现代码,需要的朋友可以参考下
    2019-04-04
  • C++实现二维图形的傅里叶变换

    C++实现二维图形的傅里叶变换

    这篇文章主要介绍了C++实现二维图形的傅里叶变换的方法,是C++程序设计里一个重要的应用,需要的朋友可以参考下
    2014-08-08
  • c调用python调试方法

    c调用python调试方法

    在本文里我们给大家分享了C中调用python调试的方法和相关知识点,需要的朋友们参考下。
    2019-02-02
  • C++11标准库bind函数应用教程

    C++11标准库bind函数应用教程

    bind函数定义在头文件functional中,可以将bind函数看做成一个通用的函数适配器,他接收一个可调用对象,生成一个新的可调用对象来"适应"原对象的参数列表。本文将带大家详细了解一下bind函数的应用详解
    2021-12-12
  • Qt使用windeployqt工具实现程序打包发布方法

    Qt使用windeployqt工具实现程序打包发布方法

    本文主要介绍了Qt使用windeployqt工具实现程序打包发布方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C++快速幂与大数取模算法示例

    C++快速幂与大数取模算法示例

    这篇文章主要介绍了C++快速幂算法和大数取模算法的示例,对C++程序员来说有一定的帮助,有需要的朋友可以参考借鉴,下面来一起看看。
    2016-08-08
  • C++中#pragma once与#ifndef对比分析

    C++中#pragma once与#ifndef对比分析

    当我们编写C++代码时,经常需要使用头文件来引入一些常用的函数、类或者变量,如果一个头文件被重复包含,就会导致编译错误或者运行时错,为了避免发生,我们需要使用预处理指令来防止头文件被重复包含,常用的预处理指令有#pragma once和#ifndef,需要的朋友可以参考下
    2023-05-05
  • c++调用动态库LNK2019和LNK1120无法解析的外部命令

    c++调用动态库LNK2019和LNK1120无法解析的外部命令

    本文主要介绍了c++调用动态库LNK2019和LNK1120无法解析的外部命令, 出现这个错误一般都是函数只找到声明但没有实现,或者是少了什么链接库,下面就来解决一下
    2024-06-06
  • 基于Qt开发获取CTP量化交易接口测试数据工具

    基于Qt开发获取CTP量化交易接口测试数据工具

    这篇文章主要为大家详细介绍了如何使用Qt软件开发K线股P相关软件,先开发一个通过CTP量化交易的sdk获取相关推送数据的工具,需要的可以参考下
    2024-04-04

最新评论