VSCode使用GDB调试C语言时断点失效的解决方法
VSCode中GDB调试C代码断点失效的解决方法
问题描述
在Windows 10系统的VSCode 1.73.1版本中,使用GDB 12.1调试C语言代码时,断点每次运行都会被跳过(断点从红色变为灰色)。尝试过相关问题的所有方案但未解决,寻求断点正常工作的解决办法。
环境信息
- VSCode版本:1.73.1(Windows 10)
- GDB版本:12.1
当前配置文件
launch.json
{ "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "C:\\msys64\\mingw64\\bin\\gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "Set Disassembly Flavor to Intel", "text": "-gdb-set disassembly-flavor intel", "ignoreFailures": true } ], "preLaunchTask": "C/C++: gcc.exe build active file", } ] }
tasks.json
{ "tasks": [ { "type": "cppbuild", "label": "C/C++: gcc.exe build active file", "command": "make", "args": [ "all" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ], "version": "2.0.0" }
makefile
dynamic_array: dynamic_array.c dynamic_array.h gcc -c dynamic_array.c test: test.c dynamic_array.h gcc -c test.c all: dynamic_array.o test.o gcc -o test.exe dynamic_array.o test.o clean: del -f *.o & del -f *.exe & del -f *.out
解决方案
断点失效的核心原因有两个:编译时未生成调试信息,以及调试指向的可执行文件不匹配。按以下步骤修复:
修改Makefile,添加调试信息参数
在所有gcc编译命令中加入-g参数,该参数会让编译器生成GDB可识别的调试符号。修改后的Makefile如下:dynamic_array: dynamic_array.c dynamic_array.h gcc -g -c dynamic_array.c test: test.c dynamic_array.h gcc -g -c test.c all: dynamic_array.o test.o gcc -g -o test.exe dynamic_array.o test.o clean: del -f *.o & del -f *.exe & del -f *.out修正launch.json中的可执行文件路径
当前program字段使用${fileBasenameNoExtension}.exe,如果当前打开的是dynamic_array.c,调试器会尝试启动dynamic_array.exe,但你的Makefile生成的是test.exe。将program字段改为固定指向test.exe:"program": "${workspaceFolder}/test.exe",清理旧编译产物并重新编译
执行make clean清理旧的.o和.exe文件,然后执行make all重新编译,确保生成带调试信息的可执行文件。
完成以上步骤后,重新启动调试,断点应该就能正常触发了。
内容的提问来源于stack exchange,提问作者Icen
相关产品推荐
相关产品推荐

