【问题标题】:JDWP syntax error when using Powershell使用 Powershell 时出现 JDWP 语法错误
【发布时间】:2013-08-21 16:47:11
【问题描述】:

Windows 7 x64 和最新的 java 版本(但在 u21 上效果不佳)

java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

当尝试启动 java 应用程序进行远程调试时,我收到以下错误:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n <application>
ERROR: JDWP option syntax error: -agentlib:jdwp=server=y transport=dt_socket address=4000 suspend=n

但只有在使用 PowerShell 时,使用 cmd.exe 运行完全相同的命令才能按预期工作。

【问题讨论】:

  • 你的应用程序是 jar 格式的吗?
  • @Andrew Nope 现在只是在尝试一个简单的 Hello World java 程序。按预期使用java Test 执行它时工作正常,所以不是这样。
  • @Andrew 好的,现在这很奇怪.. 不是在 powershell 中运行整个东西,而是“好”的旧 cmd.exe 按预期工作。所以现在我假设 powershell 正在做某事?相应地编辑问题。

标签: java windows debugging powershell remote-debugging


【解决方案1】:

你可以试试:

PS> $a = "java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n <application>"
PS> Invoke-Expression $a

我想 PowerShell 会尝试在您的命令行中解释某些内容。这样 PowerShell 只需要执行。请注意,如果您的应用程序名称中有双引号,请在前面使用 `。

你也可以试试这个来参数化你的调用。

$scriptBlock = {java -Xdebug                                                         <# This is comment param 1 #>`
                     -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n   <# This is comment param 1 #>`
                     `"$($args[0])`"}                                                <# Application Path #>

$ApplicationName = "c:\un chemin applicatif\toto"
Invoke-Command -ScriptBlock $scriptBlock  -ArgumentList $ApplicationName

我找到了,试试看:

PS> $a = "java -Xdebug '-Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n' <application>"

我只是将 -Xrunjdwp 参数包含在 '' 中。

【讨论】:

  • 嗯,不,这仍然会导致完全相同的错误,但如果我打印 $a 看起来 PS see log 没有扩展任何内容。
  • 嗯,遗憾的是,在 32 位版本中,所有变体也出现同样的错误。这真的很奇怪。
  • @Voo,我找到了,只是将 -Xrunjdwp 参数包含在 '' 中
  • 很有效,非常好。你知道 PS 到底在做什么吗?我假设它可能使用“,”作为参数的分隔符。很好记住未来的类似问题
【解决方案2】:

代替:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n <application>

尝试使用:

java -agentlib:jdwp=server=y,transport=dt_socket,address=4000,suspend=n <application>

后者用于目标 VM 为 5.0 或更高版本时,而前者用于目标 VM 早于 5.0 的机器

Source: Oracle Docs

【讨论】:

  • 恐怕这是我知识的延伸。对不起。
  • 是的,这很奇怪。让我们看看是否有一些 Windows 专家可以解释到底发生了什么。现在使用 cmd 有效,但上帝太糟糕了..
【解决方案3】:

根据上述答案,我无法弄清楚为什么它不起作用。 我使用了以下,它工作了

-agentlib:jdwp=transport=dt_socket,address=localhost:9009,server=y,suspend=y

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多