0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Q4MP_gh_c472c21 来源:嵌入式ARM 作者:嵌入式ARM 2020-11-18 16:18 次阅读

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等。

更多的问题,其实是,国内的网络访问很慢。

如果不嫌弃,可以点击以下链接下载,直接解压到你喜欢的位置(免安装),然后配置环境变量即可。

链接:https://pan.baidu.com/s/11MIcqo5933NQlyKVeLon_w
提取码:gmp

然后呢,你就可以像在Linux里面那样愉快地玩耍了,当然,如果你是高手,你可以用命令行gdb来debug。

3. 在VSCode上debug

VSCode用过吧,也许是当下最流行的看代码神器之一了,关键是里面的插件用起来爽。那么,VSCode可以调试C代码吗?答案是必须的。

首先,你需要安装两个插件:C/C++、Code Runner

然后,我这里用一个这个公众号(嵌入式软件实战派)之前发的一个X-MACRO的例子代码(单个C文件)来做实验。

在下面的代码上面戳一个断点(行号左边那个红点),像这样:

接着,在菜单Run上面选择点击Start Debugging……

继续,点击C++(GDB/LLDB)

还有,点下图这个gcc.exe

呃呃

Wait,莫慌!这是我的电脑的问题,你的不一定有,我的电脑没装好.Net Framework。如果你的也是,戳这个错误提示框的“是”,跟着提示安装.Net即可。

其实,到这里,如果你能仿真,那就是成功了。

如果不行,看看这个,经过上面的操作,会生成以下配置文件:

"tasks": [ { "type": "shell", "label": "C/C++: gcc.exe build active file", "command": "D:MinGWingcc.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:MinGWingdb.exe",

最后,如果成功了,就会像下面截图这样,左边的断点变成了一个黄色小图标:

这时,你就可以点击这些小箭头玩耍了,这是不是曾经熟悉的感觉?

同时,你还可以通过下面这个窗口看debug信息

还有output信息:

4. VSCode多文件debug

单个文件可以按上面的方法,但是,如果有多个C文件呢?这里折腾了我两个钟,现在我用两分钟教你少走弯路,我也把我遇到的“坑”标在这,你不要踩哦。

按以上提到的套路,直接点击debug,然后……

呃(⊙o⊙)…看看错误信息:

> Executing task: & 'D:Program FilesMinGWingcc.exe' -g 'd:vsdebugmain.c' -o 'd:vsdebugmain.exe' <    C:UsersxxxAppDataLocalTempccWm0Di0.o: In function `main':  d:/vsdebug/main.c undefined reference to `func_a'  d:/vsdebug/main.c 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 FilesMinGWingcc.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 FilesMinGWingcc.exe", "args": [ "-g", "${file}", "${fileDirname}main.c", "${fileDirname}func_a.c", "${fileDirname}func_b.c", "-o", "${fileDirname}${fileBasenameNoExtension}.exe" ],

再来一发:

> Executing task: & 'D:Program FilesMinGWingcc.exe' -g 'd:vsdebugmain.c' 'd:vsdebugmain.c' 'd:ProjectsDocumentsAbout Emb docvsdebugfunc_a.c' 'd:vsdebugfunc_b.c' -o 'd:vsdebugmain.exe' <    C:UsersxxxAppDataLocalTempcc7Xdo6N.o: In function `main':  d:/vsdebug/main.c multiple definition of `main'

这两个函数对应的文件有了,但还是错了……你main的,重复了。想来想去,应该是这里重复了:

"${file}", "${fileDirname}main.c",

那就删掉一个,再来

呃呃……没完没了了。看错误信息:

gcc.exe: error: d:vsdebug.vscodemain.c: No such file or directory gcc.exe: error: d:vsdebug.vscodefunc_a.c: No such file or directory gcc.exe: error: d:vsdebug.vscodefunc_b.c: No such file or directory gcc.exe: fatal error: no input files

怎么多了一个“.vscode”?路径不对……噢,原来我是在task.json页面上点击的debug。

换一个页面再来:

丫丫的,终于可以玩耍了。

好了,如果你想系统地了解这些配置参数是啥子意思,那就戳这里:https://code.visualstudio.com/docs/editor/debugging#_launch-configurations

另外,左边的这几个视图分别可以查看当前局部变量、全局变量,函数调用关系等(跟其他IDE类似):

总结一下,遇到错误,别慌,看错误信息,很重要。

对于轻量级的仿真调试,以上VSCode的方法是非常好的,没必要安装庞大的Visual Studio 2019,gcc搞定所有。

责任编辑:xj

原文标题:手把手教你用VSCode调试仿真

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真
    +关注

    关注

    50

    文章

    4073

    浏览量

    133557
  • vscode
    +关注

    关注

    1

    文章

    155

    浏览量

    7698

原文标题:手把手教你用VSCode调试仿真

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PLC数据采集实施过程中存在的问题及解决方案

    PLC数据采集工业自动化领域的实施过程中遇到了一系列显著的挑战与痛点,这些痛点直接影响了数据采集的效率、准确性和成本效益。
    的头像 发表于 11-30 14:38 200次阅读

    AFE031AIRGZT使用过程中遇到的疑问求解

    使用到贵司AFE031AIRGZT芯片,使用过程中遇到如下问题: 1.使用afe031.pdf 和sboa130a.pdf文档中提到的电路连接,将芯片连接后,参考电压REF1为2.7v左右,而
    发表于 09-24 07:19

    测试工作的哎呀,当时怎么没有想到

    呢?但实际情况是,逃逸到线上的缺陷,疑难杂症式的极端异常的问题很少,大部分都不复杂且可以设计和开发规避,或者测试过程中被识别出来。针对
    的头像 发表于 09-06 09:45 257次阅读
    测试工作<b class='flag-5'>中</b>的哎呀,当时怎么没有想到

    使用VCA810过程中遇到的一些问题求解

    使用VCA810过程中遇到一些问题,请各位大神指点,具体如下: 1、控制电压最小只能加到-1.7V,再减小的话输出信号消失或者放大倍数骤然减小。 2、输入端出现一个叠加在信号
    发表于 08-30 07:11

    RIGOL产品材料应力测试过程中的应用

    、强度、刚度、稳定性等,可以精确地控制产品质量。本篇解决方案将介绍RIGOL产品材料应力测试过程中的应用。
    的头像 发表于 07-12 17:01 310次阅读
    RIGOL产品<b class='flag-5'>在</b>材料应力测试<b class='flag-5'>过程中</b>的应用

    使用PSoC5LP的过程中,遇到PSoC5LPEFT干扰时复位的问题怎么解决?

    我使用 PSoC5LP 的过程中(>8 年),我曾多次验证测试遇到 PSoC5LP
    发表于 07-05 07:26

    VSCODE打开了OPENOCD ,可以进行DEBUG调试,如何查看寄存器的值?

    VSCODE 打开了 OPENOCD ,可以进行DEBUG 调试,但是如何查看 某个寄存器 的值呢。
    发表于 06-21 08:07

    VSCode编译过程cmake错误的原因?

    M2版macbook正确安装了ESP-IDF v5.1.2,并安装了VSCode插件,编译get-started的项目hello_world,利用idf.py build可以正确完成,但是
    发表于 06-06 06:48

    高低温交变湿热试验箱的疑难杂症怎么解决

    高低温交变湿热试验箱的是一种复合类试验箱,功能越多,越容易出现问题。比如在转换为高温试验时,温度的变化无法达到预期数值,一般情况下可以通过风循环系统进行排查。例如,温度达到目标数值所用时间较长,需要查看一下挡板是否正常运行;如果温度飙升,那么就是控制器有问题,及时处理,如更换控制仪表等。
    的头像 发表于 05-29 08:33 389次阅读
    高低温交变湿热试验箱的<b class='flag-5'>疑难杂症</b>怎么解决

    利用XMC1400启动套件的XMC_Debug消息功能总是遇到报错,为什么?

    我正在尝试利用 XMC1400 启动套件的 XMC_Debug 消息功能。 尽管用尽了关于这个问题的各种讨论主题中提供的所有解决方案,但似乎都无法解决这个问题。 以下是我的尝试
    发表于 05-24 06:18

    静电计有峰怎么处理?

    静电计是一种用于测量静电现象的电量、电压和电荷分布等参数的精密仪器。然而,实际使用过程中,静电计可能会遇到峰问题,即测量信号中出现不应
    的头像 发表于 05-20 17:05 575次阅读

    EXTI9_5仿真过程中PR是什么时候挂起和解挂的?

    EXTI9_5仿真过程中,EXTI->PR什么时候是挂起的,什么时候是解挂的? 今天晚上我练习了下5.6.7号中断线的使用。首先产生中断EXTI9_5,进入中断函数后,通过判断
    发表于 04-19 06:23

    STM32的疑难杂症之一:Printf的使用

    一、Printf简介Printf是一个标准的C库API,用来打印信息显示的。Printf的底层输出调用,windows环境下是fputc函数,GNUC环境下是__io_putchar函数
    的头像 发表于 04-02 08:09 3622次阅读
    STM32的<b class='flag-5'>疑难杂症</b>之一:Printf的使用

    STM32编程疑难杂症

    疑难杂症
    的头像 发表于 03-28 23:29 446次阅读
    STM32编程<b class='flag-5'>疑难杂症</b>

    光学设计散光

    领域的发展进步。 散光指的是非设计需要的光线通过光学系统后到达像面,是对光学系统中非正常传输光的概括,最终像面形成不同类型的伪像。 设计光学系统的过程中为保证系统的正常运行,要尽
    的头像 发表于 02-22 06:34 434次阅读
    光学设计<b class='flag-5'>中</b>的<b class='flag-5'>杂</b>散光