gpt4 book ai didi

java - 在未捕获的异常上附加 jdb

转载 作者:搜寻专家 更新时间:2023-10-31 20:19:24 33 4
gpt4 key购买 nike

所以,我正在启动一个 Java 程序,如下所示

java -agentlib:jdwp=transport=dt_socket,address=8000, server=y,suspend=n  MyClass

然后我手动附加一个调试器,如下所示

jdb -attach 8000

我想知道我是否可以设置 jdb,以便它在未捕获异常的情况下(仅)自动附加到正在运行的进程?

原因是我想避免调试器的开销,直到出现未捕获的异常。但我现在面临的问题是,如果没有附加调试器,那么一旦出现未捕获的异常,JVM 就会中止。

编辑:

来自 Oracle docs ,似乎下面的命令可以满足我的需要,但适用于 Windows 机器。

java -agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe MyClass

有人知道 linux 的等价物吗?我试过下面的命令。

java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,onuncaught=y,suspend=n,launch=jdb MyClass

调试器似乎已连接,但它立即抛出 IOError。

Initializing jdb ...

java.io.IOException: Input/output error
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:272)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at com.sun.tools.example.debug.tty.TTY.<init>(TTY.java:751)
at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1067)

最佳答案

及时附加调试器确实使用了您建议的选项(launchonuncaught)。但是 launch选项在 Linux 上需要更多:

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.

在你的例子中,jdb 无法打开它需要的终端 TTY 因为它正在启动的上下文。根据它运行的环境,你需要构建一个脚本在新窗口中启动 jdb 或将其附加到 pseduo-tty 以便它可以正常运行。

我通过创建一个使用 screen 的脚本对此进行了测试启动终端

#!/bin/bash
# according to launch option doc, the first argument is the transport and
# the second argument will be the address
#
screen -dm -L -S autojdb jdb -attach $2

此脚本将在分离屏幕中启动 jdb 并将屏幕 session 命名为 autojdb。您可以使用 screen -ls 查看屏幕列表。当您想要访问已启动的调试器时,请使用 screen -r autojdb。确保将脚本放在您的路径中或在您的启动选项中提供完整路径(/home/me/screenjdb):

java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,onuncaught=y,suspend=n,launch=/home/me/screenjdb MyClass

在我的脚本中,我还将 -L 传递给记录 session 的屏幕。这将记录 session ,但如果由于某种原因附加失败,您还可以看到发生的任何错误。

关于java - 在未捕获的异常上附加 jdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28528325/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com