当调试器附加时,程序永远不会抛出异常。

3
我有一个基于Java的服务,在运行时抛出了意外的SSL异常:“Socket is closed”...或者有时是“Data is received in a non-data state”。 当我添加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)

背景:我正在读取一个包装了SSL套接字的InputStream


我曾经在调试器行为中看到过这种工作方式,存在时间问题。这是一个多线程程序吗? - EGHM
是的,我甚至没有附加调试器。也许该选项在每个语句后面插入了一些检查断点的内容?我真的需要重现错误并进行调试,希望能得到建议。 - Bug Killer
3个回答

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

https://forums.aws.amazon.com/thread.jspa?messageID=438171

瑞克

附言:为了明确起见,上面的链接是用于在安卓平台上运行,但问题和解决方案在所有平台上都是通用的(我在运行在Windows上的JDK 7中遇到了这个问题)。


0
如果您正在Linux上运行应用程序,请尝试以下操作:
  • 运行您的应用程序,然后使用“ps -aux | grep java”检查程序调用
  • 以调试模式运行,并在检查程序调用后使用“ps -aux | grep java”
  • 这将确保JVM路径正确

另一个非常重要的事情是通过将以下代码添加到您的应用程序来检查系统属性:

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

0
当抛出错误消息 "接收了非数据状态的数据" 时,请检查套接字的输出流是否关闭,但输入流没有关闭并继续发送/接收数据,同时套接字也没有关闭。在最后关闭套接字时,同时关闭套接字的流可能有助于解决此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接