1

我正在尝试使用 VS Code调试器插件进行调试。我的程序在 main 方法中采用了一些命令行参数。调试器插件说它支持参数,但我不知道如何将这些提供给调试器。

我创建了task.json它建议的内容,但是如果我将 args 放在 json 的“args”字段中,则会出现错误。

这是我的tasks.json

{
"version": "0.1.0",
"command": "javac",
"isShellCommand": true,
"showOutput": "always",
"isWatching": true,
"suppressTaskName": true,
  "tasks": [
      {
          "taskName": "build",
          "args": ["-g", "${file}"]
      }
  ]
}

这是我的launch.json

{
"version": "0.2.0",
"configurations": [
    {
        "name": "Java",
        "type": "java",
        "request": "launch",
        "stopOnEntry": true,
        "cwd": "${fileDirname}",
        "startupClass": "${fileBasename}",
        "options": [
            "-classpath",
            "${workspaceRoot}:."
        ],
        "jdkPath": "/usr/lib/jvm/java-8-openjdk/bin"
    },
    {
        "name": "Java Console App",
        "type": "java",
        "request": "launch",
        "stopOnEntry": true,
        "cwd": "${fileDirname}",
        "startupClass": "${fileBasename}",
        "options": [
            "-classpath",
            "\"${fileDirname};.\""
        ],
        "externalConsole": true,
        "jdkPath": "/usr/lib/jvm/java-8-openjdk/bin"
    }
]
}
4

2 回答 2

0

我无法让调试器为我工作......你能打断点吗?

至于传递参数,您可以尝试将您的选项更改为:

"options": [ "-classpath", "${workspaceRoot}:." "${fileBasename}", // Or the name of your main class "arg1", "arg2" ],

有点像在黑暗中拍摄,祝你好运!

于 2017-05-17T07:08:04.137 回答
0

我一直在对这个主题进行一些试验和错误,似乎如果您重复startupClassinoptions后跟要传递的参数,那么调试器确实会参与并输入main()您的,startupClass除了它使用额外的参数(名称你的startupClass)。

在我的情况下,main()程序实际上在检查参数数量后出错(它只需要 1 个),所以我不能做太多事情(不要控制​​我正在调试的源代码),但也许你可以?

以下是我的相关摘录launch.json

"startupClass":"org.my.startupClass" ... ... "options"[ "-classpath", "full/path/where/the/jar/containing/org.my.startupClass/resides;.", "org.my.startupClass", "arg1", "arg2" ... ... ]

有了这个launch.json,我转到我试图运行的文件(这是argsto main()oforg.my.startupClass和 hit 之一F5,它成功地让我进入了一个暂停的调试器main()。但是在检查 args 数组时,我看到了两个条目。

如果我没有startupClass在 的options部分中提及launch.json,我会在调试器控制台中收到错误消息:

Error: Could not find or load main class arg1

仅供参考,我使用的是 VSCode 1.13.0 和 Java 调试器扩展 0.1.0。

仔细查看源代码,如果您main()在 launch.json 的 args 键下传递参数,您只需更改一行代码即可使其工作:

在方法private startProgramInDebugJavaMode()中有一个地方可以构建参数以传递给调试子进程:

var javaPath = (!this.args.jdkPath || this.args.jdkPath.length === 0) ? "java" : path.join(this.args.jdkPath, "java"); var options = this.args.options; var args = [-agentlib:jdwp=transport=dt_socket,server=y,address=${port}].concat(options).concat(this.className); 如果您将另一个附加.concat(this.args.args)var arg,那应该这样做吗?

于 2017-06-12T05:48:52.220 回答