美文网首页C++计算机杂谈工具集
Deepin Linux 下用 vscode 调试 C/C++

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

作者: 仰望星空的先生 | 来源:发表于2018-04-02 17:59 被阅读606次

    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

    参考文献: 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)


    相关文章

      网友评论

      • 7700475cd846:E: 无法定位软件包 XTerm
        仰望星空的先生:@告别小李 install失败的话,换源吧
      • 8d7bc22e1438:deepin下一定要安装终端吗?能不能设置为自带的深度终端?
        8d7bc22e1438:@仰望星空的先生 github上说这个是写在代码里的,不同终端处理方式不一样,所以没法随意切换。除了自己编译vscode,另一种方法是创建软链。这样倒是不用再装终端了,但效果是一样的,在调试的时候会弹出来一个终端窗口
        仰望星空的先生:@8d7bc22e1438 这个我没有考虑过,您可以试试,我是发现它报错提示后,就按照提示来操作了。如果您成功了,希望能分享一下。
      • qianzhiher:你结语里的引用号用错了~

      本文标题:Deepin Linux 下用 vscode 调试 C/C++

      本文链接:https://www.haomeiwen.com/subject/yvmxhftx.html