gpt4 book ai didi

c - 当源路径中有空格时,VS Code 调试失败

转载 作者:行者123 更新时间:2023-12-04 11:41:49 27 4
gpt4 key购买 nike

我正在尝试在 VS Code(Windows)中为我的 c 文件创建一个 GDB 调试管道。你可以在下面找到我的 tasks.json 和 launch.json。

现在,如果我的源文件的路径不包含任何空格,这可以正常工作。但是,如果它确实包含空格,则每当调试器尝试中断时,我都会收到这样的消息:
Unable to open 'Semester': File not found

这是因为它要查找的源文件实际上位于

E:\Libraries\Dropbox\UNI\Semester 5\test.c

而且我猜要么 GDB 向 VS Code 发送了一个指向该文件的错误链接,要么 VS Code 不理解其文件路径中的空格(我对此表示怀疑)。抱歉,我不太了解调试 session 期间 GDB 和 VS Code 之间的联系。

有谁知道如何解决这一问题?

任务.json:

{
"version": "2.0.0",
"tasks": [
{
"label": "Build C Program",
"type": "shell",
"command": "gcc",
"options": {"cwd": "${fileDirname}"},
"args": [
"-g", "-o", "${fileBasenameNoExtension}.exe", "${fileBasename}"
],
"group": {"kind": "build","isDefault": true}
}
]
}

启动.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "C:\\cygwin64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "Build C Program"
}
]
}

最佳答案

我认为最新版本的 VS Code 可能已经解决了这个问题。但是,有关命令行参数如何工作的一些知识可能会帮助您了解此问题的原因。
基本上,shell 拆分由空格分隔的单词,并将这些单词视为独立的参数。对于路径中没有嵌入空格的文件,一切正常。对于路径中带有嵌入空格的文件,需要一些额外的输入才能绕过陷阱。

假设我们要编译一个名为 pathWithNoEmbeddedSpaces.c 的文件,我们只需输入:

gcc -g -o target1.exe pathWithNoEmbeddedSpaces.c
由空格分隔的命令行参数,来自 gcc , -gpathWithNoEmbeddedSpaces.c在上述情况下,被视为独立参数。然后它们被 shell 传递给 GCC,我们的编译器,它知道我们要编译 1 个源文件。

假设我们要编译另一个名为 path With Embedded Spaces.c 的文件,我们输入:
gcc -g -o target2.exe path With Embedded Spaces.c
这次我们有多少独立的论点? 8!现在, shell 处理 gcc ... path With Embeded Spaces.c所有这些都是独立的论点。 GCC 很困惑,因为它看到的是需要编译 4 个源文件,而这些文件甚至可能不存在于当前目录中!

至于解决办法, 引号来救援,也被称为 引用 .大多数 shell 都适用于单引号( ' )和双引号( " )。但您可能想查看 shell 的详细信息。只要文件路径中有嵌入的空格,请使用引号。如:
gcc -g -o target2.exe "path With Embedded Spaces.c"
shell 现在知道 path With Embedded Spaces.c是一个参数,应该被视为一个整体,然后传递给 GCC 进行编译。

现在,VS Code 与这个问题有什么关系?
在VS Code的《远古时代》中,只是简单的替换了 ${fileDirname}等预定义的变量在您的 JSON 文件中,然后加入由空格分隔的参数,并将命令传递给底层 shell。即使 VS Code 在涉及包含空格或其他特殊字符的命令和参数时执行特殊处理,它也不会检查预定义变量的替换。所以 ${fileBasename}被替换而不引用。
假设我们当前的工作目录是 E:\Libraries\Dropbox\UNI\Semester 5 ,那么 VS Code 将替换 ${fileBasename}来自 test.c${fileDirname}来自 E:\Libraries\Dropbox\UNI\Semester 5 :
gcc -g -o test.exe test.c
编译应该没有任何问题地执行,因为 test.c位于当前工作目录中。但是,请考虑 launch.json 中的目标路径:
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe"
GDB 将搜索名为 E:\Libraries\Dropbox\UNI\Semester 的程序由于没有使用引号,然后因为没有这样的程序而异常退出。

要处理带有嵌入空格的文件路径,请考虑使用引号。例如,您可以用单引号将预定义的变量括起来: '${fileDirname}' , '${fileBasename}'等。 JSON 文件中的几行应类似于以下示例:
"-g", "-o", "'${fileBasenameNoExtension}.exe'", "'${fileBasename}'"
"-g", "-o", "\"${fileBasenameNoExtension}.exe\"", "\"${fileBasename}\""
"program": "'${fileDirname}\\${fileBasenameNoExtension}.exe'"
但是,作为一般规则,尽可能避免在源文件的路径中使用空格。

关于c - 当源路径中有空格时,VS Code 调试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52025194/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com