Deepin Linux 下用 vscode 调试 C/C++ 程序

Deepin Linux 下用 vscode 调试 C/C++ 程序

现在网上的大部分类似博客都是错的、有问题的、麻烦的;

而你如果有幸读到我的这篇文章,那么恭喜你,我的是正确的,没问题的,简单的。

Deepin Linux 的问题

我的系统是:Deepin Linux 15.5 桌面版 ,但是和 Ubuntu,debian 系的 linux 系统都是类似的。

Linux xxx 4.14.0-deepin2-amd64 #1 SMP PREEMPT Deepin 4.14.12-2 (2018-01-06) x86_64 GNU/Linux

  1. vscode 在deepin上的应用商店里有下载,不过不一定最新,如果更新,去官网。
  2. 系统没有GDB,需要安装:sudo apt install gdb
  3. 没有 Xterm 终端,需要安装:sudo apt install XTerm
    (最新版的vscode,现在是2019年吧...,已经不用装这个了,自带的就可以。)

参考文献: Deepin Linux安装使用Visual Studio Code(VSCode)调试C++


Visual Studio Code 的问题

我的版本:(此时有更新了,我没有更新到1.21.1)

版本 1.21.0
提交 9a199d77c82fcb82f39c68bb33c614af01c111ba
日期 2018-03-07T11:01:43.521Z
Shell 1.7.9
渲染器 58.0.3029.110
Node 7.9.0
架构 x64
  1. 安装编译和调试的插件(点击插件 - 安装扩展) ,输入:ext install cpptools

  2. 从 vscode 的菜单栏上点击【打开文件夹】,选择你的 C/C++ 项目文件夹,进入程序,设置断点,F5调试,报错,没有配置,我们选择 C++(GDB) 调试,添加配置,然后,会在你的项目目录下,生成一个.vscode 文件夹, 里头有一个 launch.json , 先不管它, 在 vscode 的资源管理器中,右键 .vscode ,【新建文件】,名字为 tasks.json 。

    launch.json

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "(gdb) Launch",
                "type": "cppdbg",
                "request": "launch",
                "program": "${workspaceRoot}/${fileBasenameNoExtension}.o",
                "args": [],
                "stopAtEntry": false,
                "cwd": "${workspaceRoot}",
                "environment": [],
                "externalConsole": true,
                "preLaunchTask": "build",  
                "MIMode": "gdb",
                "setupCommands": [
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    }
                ]
            }
        ]
    }
    
    

    先看"cwd" : 这里是 "${workspaceRoot}" ,你如果搜索过相关专题,也许会注意到有两个 $变量, 一个是:“${workspaceFolder}” , 另一个就是 "${workspaceRoot}" ,那么这两个有什么区别?我不清楚,如果你想了解,请去 issues page 上查, 这里我想说的是,当你用 【文件】——> 【打开文件夹】这种方式打开的时候,你当前的项目目录就是 "${workspaceRoot}" ;而你右键 vscode 资源管理器的项目文件夹,点击【复制路径】时,就是:"${workspaceFolder}" , 当然,也许你会发现没啥区别,但我希望你知道,啧啧啧,你知道吗?

    再看"program": 这里是 "${workspaceRoot}/${fileBasenameNoExtension}.o" ,我们来谈谈 ${fileBasenameNoExtension} ,有些博客里是{file} ,但你很快就会发现,如果用 ${file} 变量,那么你生成的程序就是 name.cpp.o , 没错,NoExtension 就是去掉扩展名的意思,就这么简单。

    最后看一下"preLaunchTask": 为什么我们要加这句话?因为我们调试,就需要生成供我们调试的文件,也就是说,调试前,我们要先执行 “build” 任务,(build 这个名字是我随便起的) ,而 build 任务就是 tasks.json 中的内容。

    参考资料:

    linux下VSCODE编译调试C++流程

    ${workspaceRoot} in launch.json is not the Folder path


    tasks.json

    {  
        "version": "0.1.0",  
        "showOutput": "always",  
        "tasks": [  
            {  
                "taskName": "build",  
                "command": "g++",  // C 语言就 gcc  
                "isShellCommand": true,  
                "showOutput": "always",  
                "args": ["-g","${file}", "-o", "${workspaceRoot}/${fileBasenameNoExtension}.o"]  // g++ 后面的命令参数  
            }  
        ]  
    }  
    
    

    其实已经没什么好说的了,主要就是 "command" 和 "args" ,如果你知道调试命令,那么就自己配置适合自己的调试方式,我这里的例子是:

    # 生成 debug 文件程序   
    g++ -g server.cpp -o server.o   
    # 抽象出来就是下面的这条命令:  
    g++ -g ${file} -o ${workspaceRoot}/${fileBasenameNoExtension}.o   
    

    最后,注意到 “taskName” 中的 ”build“ , 要和 launch.json 中的 “preLaunchTask'' 中的名字对应上,这样vscode才能找到。

    参考资料:

    用GDB调试程序


用 Code Runner 编译运行 C/C++ 代码

  1. 配置好你的编译器路径,确保可以

    如何验证,在命令行输入,若有相关信息输出则说明已配置成功

    g++ -v
    
  2. 安装VSCode的插件Code Runner

  3. 修改Code Runner的一些设置以方便能够在命令行中使用

     "code-runner.runInTerminal": true,
     "code-runner.ignoreSelection": true,
     "code-runner.saveAllFilesBeforeRun": true,
    
  4. 编写代码并使用Code Runner ,编写完代码,右键-Run Code 或者按Ctrl+Alt+N

参考资料:

VSCode下便捷编译运行C++代码——Code Runner配置及说明


结语

我知道你看到这里,也许会有些许收获,但更多的是”好气“!没错,我写这篇文章的时候,就是带着”好气“的心情写的。为什么?因为我用 Google 搜索了半天的教程,大部分都是错误的,要不然就是很麻烦,不能通用,知其然不知其所以然,所以我写下这篇文章,希望这篇文章能成为中文版 vscode 相关问题教程的一股清流(泥石流) 。

我写这篇文章的时候,我的爱人就在旁边看着,对我说:”你这样气人,迟早是要被别人打的~“ ,哈哈,如果你真的感到好气,或者对我文章中的语气很不爽,那么我真诚地希望你能完善我这篇文章,这篇文章里还有很多缺陷
比如 :

  1. 两个 json 文件中的许多配置没有说明、加注释;
  2. 没有 Windows 和 MacOS 下的配置;
  3. workspaceRoot 和 workspaceFolder 两个变量有什么区别 ;
  4. 还有很多... ... 我就不打自己脸了;

希望你能多看官方文档,多去看外国佬的解决方法,我不是说外国的就怎么怎么好,毕竟,相比国内开发者,外国佬人更多,他们遇到的问题和解决问题的人更加庞大,高质量的博客也就更多,而国内的技术博客......???

Vscode官方参考资料:
C/C++ for VS Code (Preview)


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容