jdb无法识别--add-reads选项,如何正确向jdb传递Java运行参数?
问题根因
jdb的参数分为两类:一类是jdb自身的调试控制参数,另一类是需要传递给被调试Java虚拟机的运行参数。你直接填写的--add-reads等JPMS模块参数属于JVM运行参数,jdb本身不会识别这类参数,直接传递的话会被jdb当成自身参数解析,因此抛出非法选项报错。
解决方法
有两种可选方案可以正确传递参数:
方案1:使用--分隔符
在jdb自身参数的末尾加上--分隔符,分隔符之后的所有内容会被直接传递给下层被调试JVM和主程序,不需要修改原有参数,修改后的命令如下:
/auto/tools/java/jdk-14.0.1/bin/jdb -- --add-reads stringtemplate=foostring -p ./tools/foo:./tools/bar -m foo/com.bar.foo.FOO -tp ./bar/ -p -o bin/foo -i foo.in
如果需要指定jdb自身的参数(比如源代码查找路径-sourcepath),将jdb参数放在--分隔符之前即可,示例:
/auto/tools/java/jdk-14.0.1/bin/jdb -sourcepath ./src -- --add-reads stringtemplate=foostring -p ./tools/foo:./tools/bar -m foo/com.bar.foo.FOO -tp ./bar/ -p -o bin/foo -i foo.in
方案2:为JVM参数添加-J前缀
给每个需要传递给被调试JVM的参数添加-J前缀,jdb会自动剥离该前缀后将剩余内容传递给下层JVM,修改后的命令如下:
/auto/tools/java/jdk-14.0.1/bin/jdb -J--add-reads -Jstringtemplate=foostring -J-p -J./tools/foo:./tools/bar -J-m -Jfoo/com.bar.foo.FOO -J-tp -J./bar/ -J-p -J-o -Jbin/foo -J-i -Jfoo.in
内容的提问来源于stack exchange,提问作者HardcoreHenry
相关产品推荐
相关产品推荐

