运行调试器 Visual Studio 时 argv 中的 PATH

Posted

技术标签:

【中文标题】运行调试器 Visual Studio 时 argv 中的 PATH【英文标题】:PATH in argv when running debugger Visual Studio 【发布时间】:2019-02-28 17:03:28 【问题描述】:

我正在运行一个带有 argc 和 argv 的 C++ 程序,当我从命令行运行时,它会传入 12 个 args、exe 的名称和 11 个其他参数。我在 Visual Studio 中传递了相同的参数列表,例如:./euchre.exe pack.in shuffle 10 Alice Simple Bob Simple Cathy Simple Drew Simple

但是,当在 Visual Studio 调试器的参数列表中传递相同的内容时,它还包括文件路径作为 [0] 处的 argv,使总数为 13。我的程序不假定 13 个参数,所以是否有如何防止 VS 使用 PATH 作为参数?

编辑:argv 是可执行文件名称,文件 PATH 附加到可执行文件名称:path/to/file/euchre.exe 需要确保 PATH 未附加到 exe,而不是:./euchre.exe,不确定是否有办法这样做

【问题讨论】:

应该没有区别。 argv[0] 在这两种情况下都应该是可执行文件名(有或没有路径)。 也许您错误地将./euchre.exe ... 添加为调试器设置中的命令行参数。可执行文件名称不属于该设置中的命令行参数。在这种情况下 argv[1] 将是 ./euchre.exe argv[0]argv[1] 是什么? (@drescherjm 可能是对的) argv[0] 是 users/name/path/to/file/euchre.exe argv[1] 是 ./euchre.exe argv[0] is users/name/path/to/file argv[1] is ./euchre.exe 然后修复你的命令通过删除 ./euchre.exe 部分在 Visual Studio 中的行参数。可执行文件名称是一个单独的设置。 【参考方案1】:

根据 C++ 标准,(如果 arc > 0argv[0] 要么是空字符串,要么代表用于调用程序的名称。确切的表示是未指定的。

根据 POSIX 标准,argv[0] 中的值应该指向与正在由其中一个 exec 函数启动的进程相关联的文件名字符串。

请注意,这两种标准都不能保证路径是相对路径,就像您希望的那样。

鉴于argv[0] 是程序名称的某种表示的命令,如果您只是将11 个参数传递给程序,那么将有argv[0]...argv[11]main 中的总共12 个参数。如果您将 12 个参数传递给程序,那么将有 argv[0]...argv[12]main 中的总共 13 个参数

Microsoft 文档说argv[0] 按照惯例是调用程序的命令。假设这种约定,您可以通过使用相对路径来执行程序来实现相对路径。我不知道是否可以配置 Visual Studio 调试器以使用工作目录的相对路径执行程序。

但是,最好不要让您的程序依赖于程序是使用相对路径(例如 ./filename.exe)还是使用绝对路径运行。依赖一个或另一个是一个糟糕的设计。例如,如果您需要可执行文件的名称而不需要包含它的目录,则可以在argv[0] 上使用std::filesystem::path::filename。无论路径是绝对路径还是相对路径,这都有效。

argv[0] 根本不是文件名的非常规情况下,上述方法不起作用。 C++ 中没有标准的方法来获取正在运行的进程的文件名。您需要依靠特定于操作系统的方式来获取它。

【讨论】:

它已经作为参数传入PATH,在命令行中有12个args,在VS中有13个,argv[0]是PATH。需要明确的是,我不想包含路径 对不起,但这不是一个答案,你冒着成为 DV 的风险,考虑到你的声誉,即使这可能不是一个真正的问题 ^^(你只是 DV,这不是我-;) ) @DanielJomaa 不,错误是用户错误。您在调试器命令行参数设置中输入了错误的内容。在该设置中,不应将可执行文件的名称作为第一个参数传递。您正在设置 argv[1] 这样做。 从 Visual Studio 命令行参数调试器设置中删除错误的 ./euchre.exe 后,您应该拥有正确数量的命令行参数。 @JesperJuhl 我已经修改了答案以包括标准给出的保证。【参考方案2】:

严格来说argv[0] 的值是实现定义的,请参阅this answer 以获得很好的解释。

因此,您需要前往Microsoft docs 了解这是如何为 Visual Studio 实现的。引用相关部分:

注意

按照惯例,argv[0] 是程序使用的命令 调用。但是,可以使用 CreateProcess,如果您同时使用第一个和第二个参数 (lpApplicationName 和 lpCommandLine),argv[0] 可能不是 可执行文件名;使用 GetModuleFileName 检索可执行文件 名称及其完全限定的路径。

基本上,argv[0] 的值取决于程序的调用方式,您无法真正控制调试器将如何调用您的程序。

【讨论】:

以上是关于运行调试器 Visual Studio 时 argv 中的 PATH的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio Code 调试项目时传参

visual studio 2010在运行调试时,运行窗口自动退出

如何在运行时确定您的 C++ 应用程序何时附加了 Visual Studio 调试器?

在本地运行/调试时如何使用 Visual Studio 2010 配置转换?

如何在调试构建期间使 Visual Studio (2019/2022) 链接到正常的运行时库?

visual studio 2012如何调试和运行程序?