Java 遠端偵錯

來源:互聯網
上載者:User

標籤:

寫服務端程式,在開發環境下開啟遠端偵錯還是非常有用的,還原現場非常容易,讓請求方再發個請求即可。如果下來本地調試的話很多環境與管理服務的地址配置什麼的都可能不一樣,增加了可變因素。

在需要啟動服務調試的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

-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.
Operation

Format: -Xdebug

Include this option at startup.

For Example:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n myApp

 

-Xrunjdwp

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.

Operation

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.

Table 2-8 -Xrunjdwp Sub-options
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:

java -Xrunjdwp:transport=dt_socket,server=y,address=8000 myApp

This command:

    •  Listens for a socket connection on port 8000.
    •  Suspends this VM before main class loads (suspend=y by default).
    •  Once the debugger application connects, it can send a JDWP command to resume the VM.
-Xrunjdwp:transport=dt_shmem,server=y,suspend=n 

This command:

    •  Chooses an available shared memory transport address and print it to stdout.
    •  Listens for a shared memory connection at that address.
    •  Allows the VM to begin executing before the debugger application attaches.
-Xrunjdwp:transport=dt_socket,address=myhost:8000 

This command:

    •  Attaches to a running debugger application via socket on host myhost at port 8000.
    •  Suspends this VM before main class loads.
-Xrunjdwp:transport=dt_shmem,address=mysharedmemory 

This command:

    •  Attaches to a running debugger application via shared memory at transport address mysharedmemory.
    •  Suspends this VM before main class loads.
-Xrunjdwp:transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub 

This command:

    •  Waits for an instance of java.io.IOException to be thrown in this VM.
    •  Suspends the VM (suspend=y by default).
    •  Listens for a socket connection on port 8000.
    •  Executes the following:
/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:

    •  Waits for an uncaught exception to be thrown in this VM.
    •  Suspends the VM.
    •  Selects a shared memory transport address and listen for a connection at that address.
    •  Executes the following:

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  ):

 

Sun VM Invocation Options

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:

-agentlib:jdwp=<sub-options>
Loads the JPDA reference implementation of JDWP. This library resides in the target VM and uses JVM TI and JNI to interact with it. It uses a transport and the JDWP protocol to communicate with a separate debugger application. Specific sub-options are described below.

For releases prior to 5.0 the -Xdebug and -Xrunjdwp options are used:

-Xdebug
Enables debugging
-Xrunjdwp:<sub-options>
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. Specific sub-options are described below.
-agentlib:jdwp and -Xrunjdwp sub-options

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: 
 

-Xrunjdwp Sub-options
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.

  • 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.
suspend no "y" If "y", VMStartEvent has a suspendPolicy of SUSPEND_ALL. If "n", VMStartEvent has a suspendPolicy of SUSPEND_NONE.
Examples
-agentlib:jdwp=transport=dt_socket,server=y,address=8000
Listen for a socket connection on port 8000. Suspend this VM before main class loads (suspend=y by default). Once the debugger application connects, it can send a JDWP command to resume the VM.
-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000
Listen for a socket connection on port 8000 on the loopback address only. Terminate if the debugger does not attach within 5 seconds. Suspend this VM before main class loads (suspend=y by default). Once the debugger application connects, it can send a JDWP command to resume the VM.
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
Choose an available shared memory transport address and print it to stdout. Listen for a shared memory connection at that address. Allow the VM to begin executing before the debugger application attaches.
-agentlib:jdwp=transport=dt_socket,address=myhost:8000
Attach to a running debugger application via socket on host myhost at port 8000. Suspend this VM before the main class loads.
-agentlib:jdwp=transport=dt_shmem,address=mysharedmemory
Attach to a running debugger application via shared memory at transport address "mysharedmemory". Suspend this VM before the main class loads.
-agentlib:jdwp=transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
Wait for an instance of java.io.IOException to be thrown in this VM. Suspend the VM (suspend=y by default). Listen for a socket connection on port 8000. Execute the following: "/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.
-agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe
Wait for an uncaught exception to be thrown in this VM. Suspend the VM. Select a shared memory transport address and listen for a connection at that address. Execute the following: "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.

Java 遠端偵錯

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.