我正在启动一个Java程序,如下所示
java -agentlib:jdwp=transport=dt_socket,address=8000, server=y,suspend=n MyClass
然后我手动附加调试器,如下所示
jdb -attach 8000
我想知道是否有反正我设置jdb,使其自动附加到正在运行的进程(仅)在未捕获的异常情况下?
原因是我希望在出现未捕获的异常之前避免调试器的开销。但我现在面临的问题是,如果没有连接调试器,那么一旦出现未捕获的异常,JVM就会中止。
编辑:
从Oracle文档来看,下面的命令似乎满足了我的需要,但适用于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)
与其使用调试器并远程附加调试器,不如使用Thread创建一个未捕获的异常处理程序。UncaughtExceptionHandler
?
public class ThreadCatch
{
public static void main(String... args)
{
new ThreadCatch().go();
}
public void go()
{
try {
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("Uncaught exception");
e.printStackTrace();
}
});
final Thread thread = new Thread(new A());
thread.start();
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
class A implements Runnable
{
int x = 10;
@Override
public void run()
{
x++;
ObjectTrackingException obj = new ObjectTrackingException();
obj.setThrownFrom(this);
throw obj;
}
}
}
class ObjectTrackingException extends RuntimeException
{
private Object thrownFrom;
public Object getThrownFrom() {
return thrownFrom;
}
public void setThrownFrom(Object thrownFrom) {
this.thrownFrom = thrownFrom;
}
}
要及时附加调试器,确实需要使用您建议的选项(启动和
启动)。但在linux上,启动选项需要更多:
请注意,启动的进程不会在其自己的窗口中启动。在大多数情况下,启动的进程应该是一个小应用程序,然后在自己的窗口中启动调试器应用程序。
在您的情况下,由于启动的上下文,jdb无法打开它所需要的终端TTY。根据运行环境的不同,您需要构造一个脚本,在新窗口中启动jdb或将其附加到psedou 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,并为屏幕命名会话。您可以使用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传递给记录会话的屏幕。这将记录会话,但也可以让您看到由于某种原因连接失败时发生的任何错误。
问题内容: 为什么Java中的某些异常未被捕获?这是代码由于没有处理的异常而完全失败。(Java版本1.4)。 我得到一个 但这有效 我懂了 我以为捕获异常会捕获所有异常?如何捕获Java中的所有异常? 问题答案: 因为某些异常不是源自-例如和。 基本上,类型层次结构是: 只能抛出派生类,因此,如果您抓住,那实际上就可以抓住一切。 ,以及任何异常,从获得 其他 比那些源自数作为 检查的异常 -他们
我对Java线程、Runnable等相当陌生。因此,我想知道为什么下面的代码没有捕获异常? 阅读有没有一种方法可以使Runnable的run()引发异常,我收集到: "...如果您的run()方法确实是Thread的目标,则抛出异常是没有意义的,因为它是不可观察的;抛出异常与不抛出异常(无)具有相同的效果。"(@erickson) 我应该检查Runnable.run()方法中的异常。 为什么会这样
为什么Java中的一些异常不被捕获?这是完全失败的代码,有一个未处理的异常。(Java版本1.4)。 我在线程“main”java中得到了一个 但这行得通 我在java中没有发现任何方法错误。lang.NoSuchMethodError: 我以为捕获异常会捕获所有异常?如何捕获java中的所有异常?
我的用它的作用域启动coroutine 我的只处理一些逻辑,在本例中是某种验证器 然后我的只处理网络层/本地层 以下是我得到的错误日志: 错误直接指向显式的语句。
Twilio新手使用测试帐户。我按照这里列出的安装Twilio PHP的说明进行了安装:https://www.Twilio.com/docs/quickstart/php/sms 因为我得到了一个证书错误,所以我的主机提供程序建议我更改CURLOPT_SSL_VERIFYPEER=>false(从true改为true)。但现在我得到了这个错误。如何修复?:致命错误:未捕获异常“services_
@ControllerAdvice类是RestResponseEntityExceptionHandler.java。 我被告知,默认情况下spring boot应该返回如下所示的内容 我给它的不存在的路径是 我的控制器类是Breweries_Controller