调试时如何使用参数启动程序?

Posted

技术标签:

【中文标题】调试时如何使用参数启动程序?【英文标题】:How do I start a program with arguments when debugging? 【发布时间】:2011-06-15 00:53:42 【问题描述】:

我想在 Visual Studio 2008 中调试一个程序。问题是如果它没有得到参数就会退出。这是来自 main 方法:

if (args == null || args.Length != 2 || args[0].ToUpper().Trim() != "RM") 

    Console.WriteLine("RM must be executed by the RSM.");
    Console.WriteLine("Press any key to exit program...");
    Console.Read();
    Environment.Exit(-1);

我不想将其注释掉,然后在编译时重新输入。它被设置为启动项目。

【问题讨论】:

Passing command line parameters with Visual Studio C# 的可能重复项 Debugging with command-line parameters in Visual Studio的可能重复 【参考方案1】:

转到Project-><Projectname> Properties。然后点击Debug 选项卡,并在名为Command line arguments 的文本框中填写您的参数。

【讨论】:

参数可以(必须?)填充到Command line arguments 空格分隔(就像你会做的那样,使用命令行)。我不确定是否还有其他方法,但也许您可以将其添加到您的答案中。 我一直在寻找这个答案一个星期!谢谢! 不要忘记包含空格的命令参数周围的语音标记,这让我很困惑。 在使用命令行解析器等库时是否可以使用命名参数?例如我怎样才能传递-url https://google.com -p pass -u user之类的东西?【参考方案2】:

我建议使用directives,如下所示:

        static void Main(string[] args)
        
#if DEBUG
            args = new[]  "A" ;
#endif

            Console.WriteLine(args[0]);
        

祝你好运!

【讨论】:

两个很好的答案,我更喜欢这个只是因为它更容易更改或引用(虽然它不一定是通过属性的麻烦:p,可能是额外的鼠标点击左右) 我会调查的。谢谢。 我同意 Homam 的解决方案。虽然对于小程序来说,设置项目属性 -> 调试选项卡的命令行参数是一种更直接、更简单的调试方法,但对于使用指令的大型应用程序来说更有用和优雅。 两种解决方案都很完美。但是,我更喜欢 Homam 的解决方案。它的优雅不需要修补人们可能忘记照顾的项目设置。在一个 seconf 中,人们可能也会忘记所做的代码更改,但它们至少是“可见的”。 Omho 这个答案就是答案。每次您想使用一组新的命令行参数进行调试时,编辑项目设置是一项繁琐的工作。当它像这样编写时,您可以简单地写下您想要检查的所有测试用例,然后切换每个上的 cmets 以激活它。如果您突然出现在使用另一种语言(不是您习惯使用的语言)的 Visual Studio 面前,速度会快得多并且证明特别有用,这正是我的情况,虽然我知道这种语言,但翻译很糟糕,而且即使是母语人士也无法妥善处理。 :D【参考方案3】:

我的建议是使用单元测试。

在您的应用程序中,在Program.cs 中执行以下开关:

#if DEBUG
    public class Program
#else
    class Program
#endif

static Main(string[] args) 也是如此。

或者通过添加使用Friend Assemblies

[assembly: InternalsVisibleTo("TestAssembly")]

致您的AssemblyInfo.cs

然后创建一个单元测试项目和一个看起来有点像这样的测试:

[TestClass]
public class TestApplication

    [TestMethod]
    public void TestMyArgument()
    
        using (var sw = new StringWriter())
        
            Console.SetOut(sw); // this makes any Console.Writes etc go to sw

            Program.Main(new[]  "argument" );

            var result = sw.ToString();

            Assert.AreEqual("expected", result);
        
    

通过这种方式,您可以自动测试多个参数输入,而无需在每次要检查不同内容时编辑代码或更改菜单设置。

【讨论】:

哇,问题是关于为调试会话提供参数,你提到单元测试?这与问题有什么关系?【参考方案4】:

我来到这个页面是因为我的命令行参数中有敏感信息,并且不希望它们存储在代码存储库中。我使用系统环境变量来保存值,可以根据需要在每个构建或开发机器上设置这些值。环境变量扩展在 Shell 批处理过程中效果很好,但不适用于 Visual Studio。

Visual Studio 启动选项:

但是,Visual Studio 不会返回变量值,而是变量的名称。

问题示例:

我在 S.O. 上尝试了几次之后的最终解决方案。是在我的参数处理器中快速查找环境变量。我在传入的变量值中添加了对 % 的检查,如果找到,则查找环境变量并替换该值。这适用于 Visual Studio 和我的构建环境。

foreach (string thisParameter in args)
            
                if (thisParameter.Contains("="))
                
                    string parameter = thisParameter.Substring(0, thisParameter.IndexOf("="));
                    string value = thisParameter.Substring(thisParameter.IndexOf("=") + 1);

                    if (value.Contains("%"))
                       //Workaround for VS not expanding variables in debug
                        value = Environment.GetEnvironmentVariable(value.Replace("%", ""));
                    

这允许我在示例批处理文件中使用相同的语法,并使用 Visual Studio 进行调试。没有帐户信息或 URL 保存在 GIT 中。

批量使用示例

【讨论】:

【参考方案5】:

对于 Visual Studio 代码

打开launch.json文件 将参数添加到您的配置中:

"args": ["一些参数", "另一个"],

【讨论】:

【参考方案6】:

对于 .NET Core 控制台应用,您可以通过两种方式执行此操作 - 从 launchsettings.json 或属性菜单。

Launchsettings.json

或右键单击项目>属性>左侧的调试选项卡

请参阅“应用程序参数:”

这是“”(空格)分隔的,不需要任何逗号。刚开始打字。每个空格“”代表一个新的输入参数。 (您在此处所做的任何更改都会反映在 launchsettings.json 文件中...)

【讨论】:

以上是关于调试时如何使用参数启动程序?的主要内容,如果未能解决你的问题,请参考以下文章

使用gdb调试

调试时如何仅重新启动Apple Watch应用程序?

GDB调试指南-启动调试

如何在 ios 设备上未启动本机应用程序时进行调试

调试tomcat应用程序时如何在windows中启动tomcat调试端口

如何调试无法启动的erlang应用程序