相关疑难解决方法(0)

Java相当于未捕获异常的coredump

什么是Linux coredump或Windows minidump的Java等价物?我已经阅读了堆转储,它看起来像我想要的,但是如何在未捕获的异常上(自动)触发它们?

我知道未捕获的异常处理程序,我已经用它来打印异常+堆栈跟踪并终止整个应用程序(否则线程死了,应用程序继续运行?呵呵?)另外我发现这篇文章关于如何记录堆从代码转储,但如果我从未处理的异常处理程序执行此操作,Java已经捕获了异常并且堆栈跟踪(和参数)消失了.

我遇到了-XX:+HeapDumpOnOutOfMemoryError似乎做我需要的旗帜,不幸的是只是因为内存异常,而不是其他未被捕获的异常.

到目前为止,这是我唯一能够摆脱谷歌的事情.目前我正在使用带有异常断点的附加调试器,但这是不切实际的,因为它还会中断处理的异常,因此无法在无人监督的情况下使用它.

[动机更新]

我希望能够检查堆栈跟踪的参数和局部变量,以找出导致异常的原因.它通常是空引用异常或断言失败,我不能总是从行号中猜出究竟出了什么问题.在C/C++中,我习惯于使用coredump/minidump崩溃,然后进一步检查实际导致崩溃的原因.

java error-handling crash-dumps

5
推荐指数
1
解决办法
1497
查看次数

在未捕获的异常上附加jdb

所以,我正在开始一个Java程序,如下所示

java -agentlib:jdwp=transport=dt_socket,address=8000, server=y,suspend=n  MyClass
Run Code Online (Sandbox Code Playgroud)

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

jdb -attach 8000
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

从Oracle 文档来看,似乎下面的命令可以满足我的需求,但对于Windows机器而言.

java -agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe MyClass
Run Code Online (Sandbox Code Playgroud)

谁知道linux等价?我试过下面的命令.

java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,onuncaught=y,suspend=n,launch=jdb MyClass
Run Code Online (Sandbox Code Playgroud)

调试器似乎连接但它会立即抛出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)
Run Code Online (Sandbox Code Playgroud)

java debugging jdb

5
推荐指数
1
解决办法
586
查看次数

标签 统计

java ×2

crash-dumps ×1

debugging ×1

error-handling ×1

jdb ×1