VS2010 使用命令行参数调试

Posted

技术标签:

【中文标题】VS2010 使用命令行参数调试【英文标题】:VS2010 debugging with command-line arguments 【发布时间】:2013-03-22 03:03:55 【问题描述】:

我在project properties -> debugging -> command arguments 部分中为我的应用设置了命令行参数。

如果我直接从命令行运行程序,我会这样做:

progname arg1 arg2

所以我将 VS 中的命令行参数设置为

arg1 arg2,

如here.所述

但是,该程序的运行方式似乎与从命令行运行它的方式不同。参数是文本文件,在命令行中它可以正确加载这些文本文件,在 VS2010 中它不会以某种方式加载。任何想法为什么?


编辑:更新/澄清帖子:

我没有遇到任何异常。

我的解释可能过于简单化了这个问题。我实际上不是在加载文本文件,而是在加载物理引擎,这应该在运行时确定,所以我需要命令行参数。

用于加载物理引擎的代码是:

if ( argc > 2 )

    #ifndef PAL_STATIC
        PF->LoadPALfromDLL(); 
    #endif
        //DebugBreak(); // for debugging ;)
        PF->SelectEngine(argv[1]);

        if (!pp) 
    #ifdef _WIN32
            MessageBox(NULL,L"Could not start physics!",L"Error",MB_OK);  

         /* ^ This is the error I am getting, i.e. pp is NULL, 
         so "PF->SelectEngine(argv[1]);" is not loading engine correctly */

    #else
            printf("Could not start physics engine %s!\n",argv[1]);
    #endif

    return -1;

我正在使用 Bullet,它的运行方式如下:

progname.exe arg1 arg2, 

arg1 是物理引擎名称,arg2 是要加载的物理文件,但它挂在arg1 上。

我在命令行调用这个的具体方式是:

progname.exe Bullet filename. 

如果我在命令行上执行此操作,它可以工作,但如果我将这些参数传递给调试器,我会收到一个问题,提示 could not load physics engine

这可能是物理引擎加载器内部的结果,它来自另一个来源,但我的猜测是,无论我在命令行中还是在 VS 的调试器设置中传递这些参数,这应该以相同的方式工作.

我会查看 UAC 设置,看看他们说了什么。

【问题讨论】:

您是使用绝对路径还是相对路径(“C:\temp\blah.txt”与“blah.txt”)加载文本文件?我的猜测是通过 VS 运行的应用程序正在使用不同的程序集位置路径。 绝对的,例如 E:/path/file.txt,也许会尝试 windows 反斜杠? 反斜杠也不起作用 奇怪,你能不能单步调试一下代码,看看它在做什么?只要您将参数放入与未通过调试器运行时完全相同的参数中,我认为它应该可以工作... 为了调试这个问题,我会在变量中硬编码正确的路径,而不是从命令行参数中读取它。查看项目符号是否从命令行开始,而不是从使用硬编码路径进行调试开始。我希望问题出在 VS 设置的环境(工作文件夹、管理员权限、环境变量……)而不是传递的字符串。 【参考方案1】:

正如https://msdn.microsoft.com/en-us/library/17w5ykft.aspx 中所说,您可以尝试在每个“\”字符上添加一个反斜杠,以在路径中转义它们。例如:

之前:“C:\somewhere\someplace\physics_engine”

之后:“C:\\somewhere\\someplace\\physics_engine”

【讨论】:

以上是关于VS2010 使用命令行参数调试的主要内容,如果未能解决你的问题,请参考以下文章

Qt Creator调试命令行参数

在 Visual Studio 中使用命令行参数进行调试

在 Visual Studio 2010 中传递命令行参数?

VS2008中命令行参数如何设置读入多个文件

第一次个人作业(代码编写调试debug相关)

vs2010使用main函数