转自:https://www.cnblogs.com/lailailai/p/4560399.html
参考:https://blog.csdn.net/tterminator/article/details/52252966
写服务端程序,在开发环境下打开远程调试还是非常有用的,还原现场非常容易,让请求方再发个请求即可。如果下来本地调试的话很多环境与管理服务的地址配置什么的都可能不一样,增加了可变因素。
在需要启动服务调试的jvm启动参数中加入(注意:参数要排在启动类名的前面)
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address= 1234
|
dt_socket:使用的通信方式
server:是主动连接调试器还是作为服务器等待调试器连接
suspend:是否在启动JVM时就暂停,并等待调试器连接
address:地址和端口,地址可以省略,两者用冒号分隔
根据文档和stackoverflow上的讨论,JVM 1.5以后的版本应该使用类似下面的命令(老的还是可以使用的):
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address= 1234
|
就是一个agentlib就行了,后面的参数都没有变,如果用intellij的远程调试配置的话,它会默认给出这两种参数,让你放到服务器的JVM参数里。
下面摘抄一下官方文档:
-Xdebug
enables debugging capabilities in the JVM which are used by the Java Virtual Machine Tools Interface (JVMTI). JVMTI is a low-level debugging interface used by debuggers and profiling tools. With it, you can inspect the state and control the execution of applications running in the JVM.
The subset of JVMTI that is most typically used by profilers is always available. However, the functionality used by debuggers to be able to step through the code and set breakpoints has some overhead associated with it and is not always available. To enable this functionality you must use the -Xdebug
option.
WARNING: | When running with -Xdebug the JVM is not running at its full speed. Thus, the option should not be used for applications when running in production environments. |
Format: -Xdebug
Include this option at startup.
For Example:
java
-Xdebug
-Xrunjdwp:transport=dt_socket,server=y,suspend=n
myApp
This option loads the JPDA reference implementation of JDWP. This library resides in the target VM and uses JVMDI and JNI to interact with it. It uses a transport and the JDWP protocol to communicate with a separate debugger application.
Format: -Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...
The -Xrunjdwp
option can be further qualified by specifying one of the sub-options listed in Table 2-8.
Name | Required? | Default Value | Description |
help | no | N/A | Prints a brief help message and exits the VM. |
transport | yes | none | Name of the transport to use in connecting to debugger application. |
server | no | “n” | If “y”, listen for a debugger application to attach; otherwise, attach to the debugger application at the specified address. If “y” and no address is specified, choose a transport address at which to listen for a debugger application, and print the address to the standard output stream. |
address |
yes, ifserver=n no, otherwise
|
““ | Transport address for the connection. If server=n, attempt to attach to debugger application at this address. If server=y, listen for a connection at this address. |
launch | no | none |
At completion of JDWP initialization, launch the process given in this string. This option is used in combination with onthrow and/or onuncaught to provide “Just-In-Time debugging” in which a debugger process is launched when a particular event occurs in this VM.
Note that the launched process is not started in its own window. In most cases the launched process should be a small application which in turns launches the debugger application in its own window.
The following strings are appended to the string given in this argument (space-delimited). They can aid the launched debugger in establishing a connection with this VM. The resulting string is executed.
The value of the transport sub-option.
The value of the address sub-option (or the generated address if one is not given)
|
onthrow | no | none | Delay initialization of the JDWP library until an exception of the given class is thrown in this VM. The exception class name must be package-qualified.Connection establishment is included in JDWP initialization, so it will not begin until the exception is thrown. |
onuncaught | no | “n” | If “y”, delay initialization of the JDWP library until an uncaught exception is thrown in this VM. Connection establishment is included in JDWP initialization, so it will not begin until the exception is thrown. See the JDI specification for com.sun.jdi.ExceptionEvent for a definition of uncaught exceptions. |
stdalloc | no | “n” | By default, the JDWP reference implementation uses an alternate allocator for its memory allocation. If “y”, the standard C runtime library allocator will be used. This option is mainly for testing; use it with care. Deadlocks can occur in this VM if the alternative allocator is disabled. |
strict | no | “n” | If “y”, assume strict JVMDI conformance. This will disable all workarounds to known bugs in JVMDI implementations. This option is mainly for testing and should be used with care. |
suspend | no | “y” | If “y”, VMStartEvent has a suspend Policy of SUSPEND_ALL. If “n”, VMStartEvent has a suspend policy of SUSPEND_NONE. |
For example:
-Xrunjdwp:transport=dt_socket,server=y,address=8000 myApp
This command:
suspend=y
by default).-Xrunjdwp:transport=dt_shmem,server=y,suspend=n
This command:
stdout
.-Xrunjdwp:transport=dt_socket,address=myhost:8000
This command:
-Xrunjdwp:transport=dt_shmem,address=mysharedmemory
This command:
mysharedmemory
.-Xrunjdwp:transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
This command:
java.io.IOException
to be thrown in this VM.suspend=y
by default)./usr/local/bin/debugstub dt_socket myhost:8000
This program can launch a debugger process in a separate window which will attach to this VM and begin debugging it.
-Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe
This command:
d:\bin\debugstub.exe dt_shmem <address>
where <address>
is the selected shared memory address.
This program can launch a debugger process in a separate window which will attach to this VM and begin debugging it.
另外一篇文档(JPDA Connection and Invocation Details ):
This section describes the options necessary to invoke Sun VMs for debugging.
Sun's VM implementations require command line options to load the JDWP agent for debugging. From 5.0 onwards the -agentlib:jdwp option is used to load and specify options to the JDWP agent. For releases prior to 5.0, the -Xdebug and -Xrunjdwp options are used (the 5.0 implementation also supports the -Xdebugand -Xrunjdwp options but the newer -agentlib:jdwp option is preferable as the JDWP agent in 5.0 uses the JVM TI interface to the VM rather than the older JVMDI interface).
If your debugger application uses the JDI Sun Command Line Launching Connector, the connector will use the -Xdebug and -Xrunjdwp options as the Connector may be used to connect to a pre-5.0 target VM.
If the target VM is 5.0 or newer the -agentlib:jdwp option is specified as follows:
For releases prior to 5.0 the -Xdebug and -Xrunjdwp options are used:
The -agentlib:jdwp and -Xrunjdwp option can be further qualified with sub-options. The sub-options are specified as follows:
-agentlib:jdwp=<name1>[=<value1>],<name2>[=<value2>]...
or
-Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...
The table below describes the options that can be used:
name | required? | default value | description |
---|---|---|---|
help | no | N/A | Prints a brief help message and exits the VM. |
transport | yes | none | Name of the transport to use in connecting to debugger application. |
server | no | "n" | If "y", listen for a debugger application to attach; otherwise, attach to the debugger application at the specified address.
If "y" and no address is specified, choose a transport address at which to listen for a debugger application, and print the address to the standard output stream. |
address | yes, if server=n no, otherwise |
"" | Transport address for the connection. If server=n, attempt to attach to debugger application at this address. If server=y, listen for a connection at this address. |
timeout | no | "" | If server=y specifies the timeout, in milliseconds, to wait for the debugger to attach. If server=n specifies the timeout, in milliseconds, to use when attaching to the debugger. Note that the timeout option may be ignored by some transport implementations. |
launch | no | none | At completion of JDWP initialization, launch the process given in this string. This option is used in combination with onthrow and/or onuncaughtto provide "Just-In-Time debugging" in which a debugger process is launched when a particular event occurs in this VM.
Note that the launched process is not started in its own window. In most cases the launched process should be a small application which in turns launches the debugger application in its own window. The following strings are appended to the string given in this argument (space-delimited). They can aid the launched debugger in establishing a connection with this VM. The resulting string is executed.
|
onthrow | no | none | Delay initialization of the JDWP library until an exception of the given class is thrown in this VM. The exception class name must be package-qualified.Connection establishment is included in JDWP initialization, so it will not begin until the exception is thrown. |
onuncaught | no | "n" | If "y", delay initialization of the JDWP library until an uncaught exception is thrown in this VM. Connection establishment is included in JDWP initialization, so it will not begin until the exception is thrown. See the JDI specification for com.sun.jdi.ExceptionEvent for a definition of uncaught exceptions. |
suspend | no | "y" | If "y", VMStartEvent has a suspendPolicy of SUSPEND_ALL. If "n", VMStartEvent has a suspendPolicy of SUSPEND_NONE. |