Java 附加调试器时,程序从不引发异常

Java 附加调试器时,程序从不引发异常,java,ssl,Java,Ssl,我有一个基于Java的服务,它抛出了一个意外的SSL异常“套接字已关闭”。。。有时,当我运行数据时,“在非数据状态下接收数据”。 当我通过添加jvmArgs配置远程调试器时:-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5050,然后运行它,它永远不会引发此异常。这个选项是否会改变服务的行为 例外情况: javax.net.ssl.SSLProtocolException: Data received in non

我有一个基于Java的服务,它抛出了一个意外的SSL异常“套接字已关闭”。。。有时,当我运行数据时,“在非数据状态下接收数据”。 当我通过添加jvmArgs配置远程调试器时:-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5050,然后运行它,它永远不会引发此异常。这个选项是否会改变服务的行为

例外情况:

javax.net.ssl.SSLProtocolException: Data received in non-data state: 6
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1061)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:149)
    at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:110)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:191)
    at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:164)
    at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138)
    at java.security.DigestInputStream.read(DigestInputStream.java:161)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at com.amazonaws.services.s3.internal.ChecksumValidatingInputStream.read(ChecksumValidatingInputStream.java:97)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:103)
    at javax.crypto.CipherInputStream.read(CipherInputStream.java:224)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at <mypackagenameremovedforanonymity>.GetObjectActivity.enact(GetObjectActivity.java:118)
javax.net.ssl.SSLProtocolException:以非数据状态接收的数据:6
位于sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1061)
位于sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
位于sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
位于org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:149)
位于org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:110)
位于org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:191)
位于org.apache.http.impl.io.ContentLengthinInputStream.read(contentLengthinInputStream.java:164)
位于org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138)
位于java.security.DigestInputStream.read(DigestInputStream.java:161)
在java.io.FilterInputStream.read(FilterInputStream.java:133)中
位于com.amazonaws.services.s3.internal.ChecksumValidatingInputStream.read(ChecksumValidatingInputStream.java:97)
在java.io.FilterInputStream.read(FilterInputStream.java:133)中
在java.io.FilterInputStream.read(FilterInputStream.java:107)中
位于javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:103)
在javax.crypto.cipheriputstream.read(cipheriputstream.java:224)
在java.io.FilterInputStream.read(FilterInputStream.java:133)中
在java.io.FilterInputStream.read(FilterInputStream.java:107)中
at.GetObjectActivity.execate(GetObjectActivity.java:118)

上下文:我正在从一个封装SSL套接字的InputStream读取数据。如果您在linux中运行应用程序,请尝试以下操作:

  • 运行应用程序,然后使用“ps-aux | grep java”检查程序调用
  • 在调试模式下运行,然后使用“ps-aux | grep java”检查程序调用
  • 这将确保您了解jvm路径
另一件非常重要的事情是通过向应用程序添加以下代码来检查系统属性:

System.getProperties().list(System.out);
  • 之后,比较正常运行应用程序和调试模式下运行应用程序的输出

这可能是其他人在AWS SDK和垃圾收集中看到的问题。我也有同样的问题。从S3输入流读取数据会失败,并出现各种套接字/SSL错误,当我尝试隔离或调试它时,问题就会消失。结果表明,S3客户端连接被垃圾回收,因为输入流没有保留它。我找到了以下链接,它解决了我的问题

瑞克


另外,要明确的是,上面的链接是用于在Android上运行的,但问题和解决方案在所有平台上都是通用的(我在Windows上运行的JDK 7上遇到过它)。

当抛出错误时,以非数据状态接收的数据,检查socket的outputstream是否已关闭,但输入流未关闭,继续发送/接收数据,socket也未关闭。在最后关闭socket流和socket可能有助于解决问题。

我已经看到在调试器行为下,这种方法可以解决时间问题。这是一个多线程程序吗?是的。我甚至没有附加调试器。也许options会在每个检查断点的语句后插入一些内容?我真的需要复制错误和调试它,并将感谢您的建议