你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

教你在vscode上用gcc征服debug过程中遇到的各种疑难杂症!

[复制链接]
gaosmile 发布时间:2020-11-15 20:19
1. PC上的IDE
都2020年了,听说你还在用vc++ 6.0,不,可能还到处搜索下载安装巨无霸一样的visual studio 2019来调试你“鸡碎咁多”的代码?都out了,这些不是过于庞大就是编译器老掉牙了。
为啥不用gcc呢?
gcc不是Linux里面的吗,能用在Windows?还能debug吗?
什么?你不知道Windows也可以用gcc?
好吧,我今天手把手教你用gcc,并且教你在vscode上用gcc征服debug过程中遇到的各种疑难杂症!
2. 安装MinGW
MinGW是什么东西,怎么安装?这里就不详述了,随便百度出来一堆。
不用管那么多,你知道它里面有个gcc就够了。至于安装,简单地说,可以从MinGW官方网站https://osdn.net/projects/mingw/releases/下载一个installer,直接默认安装,然后在类似以下界面选择要安装的包,例如GCC、GDB等。
微信图片_20201115201533.png
更多的问题,其实是,国内的网络访问很慢。
如果不嫌弃,可以点击以下链接下载,直接解压到你喜欢的位置(免安装),然后配置环境变量即可。
提取码:gmp
然后呢,你就可以像在Linux里面那样愉快地玩耍了,当然,如果你是高手,你可以用命令行gdb来debug。
3. 在VSCode上debug

VSCode用过吧,也许是当下最流行的看代码神器之一了,关键是里面的插件用起来爽。那么,VSCode可以调试C代码吗?答案是必须的。
首先,你需要安装两个插件:C/C++、Code Runner

微信图片_20201115201537.png
微信图片_20201115201541.png
然后,我这里用一个这个公众号(嵌入式软件实战派)之前发的一个X-MACRO的例子代码(单个C文件)来做实验。
在下面的代码上面戳一个断点(行号左边那个红点),像这样:
微信图片_20201115201544.png
接着,在菜单Run上面选择点击Start Debugging……
微信图片_20201115201547.png
继续,点击C++(GDB/LLDB)
微信图片_20201115201551.png
还有,点下图这个gcc.exe
微信图片_20201115201555.png
呃呃
微信图片_20201115201558.png
Wait,莫慌!这是我的电脑的问题,你的不一定有,我的电脑没装好.Net Framework。如果你的也是,戳这个错误提示框的“是”,跟着提示安装.Net即可。
其实,到这里,如果你能仿真,那就是成功了。
如果不行,看看这个,经过上面的操作,会生成以下配置文件:
微信图片_20201115201603.png
"tasks": [
        {
             "type": "shell",
             "label": "C/C++: gcc.exe build active file",
             "command": "D:\\MinGW\\bin\\gcc.exe",
             "args": [
                 "-g",
                 "${file}",
                 "-o",
                 "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],

以上这个“command”要配置成你的gcc路径。还有下面配置的这个“miDebuggerPath”是gdb的路径:
  "version": "0.2.0",
     "configurations": [
        {
             "name": "gcc.exe - 生成和调试活动文件",
             "type": "cppdbg",
             "request": "launch",
             "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
             "args": [],
             "stopAtEntry": false,
             "cwd": "${workspaceFolder}",
             "environment": [],
             "externalConsole": false,
             "MIMode": "gdb",
             "miDebuggerPath": "D:\\MinGW\\bin\\gdb.exe",
最后,如果成功了,就会像下面截图这样,左边的断点变成了一个黄色小图标:
微信图片_20201115201606.png
这时,你就可以点击这些小箭头玩耍了,这是不是曾经熟悉的感觉?
微信图片_20201115201610.png
同时,你还可以通过下面这个窗口看debug信息:
微信图片_20201115201612.png
还有output信息:
微信图片_20201115201615.png
4. VSCode多文件debug
单个文件可以按上面的方法,但是,如果有多个C文件呢?这里折腾了我两个钟,现在我用两分钟教你少走弯路,我也把我遇到的“坑”标在这,你不要踩哦。
按以上提到的套路,直接点击debug,然后……
微信图片_20201115201620.png
呃(⊙o⊙)…看看错误信息:
> Executing task: & 'D:\Program Files\MinGW\bin\gcc.exe' -g'd:\vsdebug\main.c' -o 'd:\vsdebug\main.exe' <

C:\Users\xxx\AppData\Local\Temp\ccWm0Di0.o: In function `main':
d:/vsdebug/main.c:7: undefined reference to `func_a'
d:/vsdebug/main.c:8: undefined reference to `func_b'
collect2.exe: error: ld returned 1 exit status
(Note:这个例子是在另一个计算机上测试的,所以MinGW路径跟上面的不一样,请忽略这个细小差别。)
这错误信息它说没找到func_a和func_b,实际上,因为它类似地执行了:
gcc -e main.c -o main.exe
没有func_a.c和func_b.c两文件,当然,它也不知道有这两文件。我们来看看配置文件task.json
  "tasks": [
        {
             "type": "shell",
             "label": "C/C++: gcc.exe build active file",
             "command": "D:\\Program Files\\MinGW\\bin\\gcc.exe",
             "args": [
                 "-g",
                 "${file}",
                 "-o",
                 "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
这里的args里面的东西是不是像gcc里面的命令参数?Bingo!
这个"${file}就是当前文件名,即你在vscode界面上看到的这个文件,然后你在其基础上点击了debug操作,它就识别到你想对它进行debug。但是它不知道你需要另外两个文件。于是,我们干脆手动添加所有需要编译的文件:
  "tasks": [
        {
             "type": "shell",
             "label": "C/C++: gcc.exe build active file",
             "command": "D:\\Program Files\\MinGW\\bin\\gcc.exe",
             "args": [
                 "-g",
                 "${file}",
                 "${fileDirname}\\main.c",
                 "${fileDirname}\\func_a.c",
                 "${fileDirname}\\func_b.c",
                 "-o",
                 "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
再来一发:
微信图片_20201115201623.png
> Executing task: & 'D:\Program Files\MinGW\bin\gcc.exe' -g'd:\vsdebug\main.c' 'd:\vsdebug\main.c' 'd:\Projects\Documents\About Emb doc\vsdebug\func_a.c' 'd:\vsdebug\func_b.c' -o'd:\vsdebug\main.exe' <

C:\Users\xxx\AppData\Local\Temp\cc7Xdo6N.o: In function `main':
d:/vsdebug/main.c:6: multiple definition of `main'
这两个函数对应的文件有了,但还是错了……你main的,重复了。想来想去,应该是这里重复了:
"${file}",
"${fileDirname}\\main.c",
那就删掉一个,再来
微信图片_20201115201627.png
呃呃……没完没了了。看错误信息:
gcc.exe: error: d:\vsdebug\.vscode\main.c: No such file or directory
gcc.exe: error: d:\vsdebug\.vscode\func_a.c: No such file or directory
gcc.exe: error: d:\vsdebug\.vscode\func_b.c: No such file or directory
gcc.exe: fatal error: no input files
怎么多了一个“.vscode”?路径不对……噢,原来我是在task.json页面上点击的debug。
换一个页面再来:
微信图片_20201115201631.png
丫丫的,终于可以玩耍了。
好了,如果你想系统地了解这些配置参数是啥子意思,那就戳这里:https://code.visualstudio.com/do ... unch-configurations
另外,左边的这几个视图分别可以查看当前局部变量、全局变量,函数调用关系等(跟其他IDE类似):
微信图片_20201115201635.png
总结一下,遇到错误,别慌,看错误信息,很重要。
对于轻量级的仿真调试,以上VSCode的方法是非常好的,没必要安装庞大的Visual Studio 2019,gcc搞定所有。
看完,是不是觉得我很有锲而不舍(一定要搞定它的强迫症)的精神呢?

收藏 评论0 发布时间:2020-11-15 20:19

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版