Ubuntu下VS Code调试C代码:自动匹配当前文件对应可执行程序
直接在launch.json中动态生成可执行文件路径的方案
核心思路
利用VS Code内置变量+Shell命令,直接在launch.json的program字段中动态生成对应可执行文件的路径,无需额外脚本或中间文件。
路径转换规则拆解
根据你的构建规则,路径转换逻辑为:
- 将源文件路径的
source/前缀替换为build/ - 从源文件路径中提取模块名(如
source/modules/module1/test/...中的module1) - 可执行文件命名规则:
模块名_源文件名(去掉.c后缀)
完整launch.json配置
{ "version": "0.2.0", "configurations": [ { "name": "Debug C Program", "type": "cppdbg", "request": "launch", // 动态生成可执行文件路径 "program": "${workspaceFolder}/build/${fileDirname#${workspaceFolder}/source/}/$(echo \"${fileDirname}\" | awk -F '/source/modules/' '{print $2}' | awk -F '/' '{print $1}')_${fileBasenameNoExtension}", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "/usr/bin/gdb", "setupCommands": [ { "description": "开启gdb美观打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] }
配置细节解释
${fileDirname#${workspaceFolder}/source/}:通过Shell字符串截取,去掉当前文件目录的${workspaceFolder}/source/前缀,得到build目录下的相对路径(如modules/module1/test)$(echo "${fileDirname}" | awk -F '/source/modules/' '{print $2}' | awk -F '/' '{print $1}'):通过awk命令精准提取模块名,无论模块下有多少层级子目录,都能拿到source/modules/后的第一个目录名(即模块名)${fileBasenameNoExtension}:VS Code内置变量,直接获取当前打开文件去掉.c后缀的文件名(如aspect_test)
为什么之前的方案有问题
- preLaunchTask导出的环境变量:VS Code的调试进程与preLaunchTask进程是隔离的,环境变量无法直接传递到调试配置中
- inputs调用脚本:部分VS Code版本或配置下,
inputs中无法动态获取${fileDirname}这类当前文件相关的变量,导致脚本无法正确接收参数
注意事项
- 确保Ubuntu系统已安装awk(默认已预装)
- 如果你的路径结构或模块名规则有调整,只需修改awk命令中的字段匹配逻辑即可
内容的提问来源于stack exchange,提问作者michael199316
相关产品推荐
相关产品推荐

