【问题标题】:Program never throws exception when debugger is attached附加调试器时程序从不抛出异常
【发布时间】:2013-07-31 19:43:38
【问题描述】:

我有一个基于 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)

上下文:我正在从包装 SSL 套接字的 InputStream 中读取数据

【问题讨论】:

  • 我在调试器行为下看到了这种工作,但有时间问题。这是一个多线程程序吗?
  • 是的。我什至没有附加调试器。也许该选项会在每个检查断点或其他内容的语句之后插入一些东西?我真的需要重现错误并对其进行调试,并希望得到建议

标签: java ssl


【解决方案1】:

这可能是其他人在使用 AWS 开发工具包和垃圾收集时遇到的问题。我有同样的问题。从 S3 输入流读取会因各种套接字/SSL 错误而失败,当我尝试隔离或调试它时,问题就会消失。原来 S3 客户端连接正在被垃圾收集,因为输入流没有保留它。我找到了以下链接,它解决了我的问题。

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

瑞克

附:为了清楚起见,上面的链接是针对在 Android 上运行的,但问题和解决方案在所有平台上都是通用的(我在 Windows 上运行的 JDK 7 上遇到过)。

【讨论】:

    【解决方案2】:

    如果你在 linux 中运行你的应用程序,试试这个:

    • 运行您的应用程序并在检查程序调用后使用 'ps -aux | grep java'
    • 在调试模式下运行并在使用 'ps -aux | 检查程序调用后运行grep java'
    • 这将使您确定 jvm 路径

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

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

    【讨论】:

      【解决方案3】:

      当报错Data received in non-data state时,检查socket的输出流是否关闭,但输入流没有关闭,继续收发数据,socket也关闭没有关闭。关闭套接字的流以及最后的套接字可能有助于解决问题。

      【讨论】:

        猜你喜欢
        • 2013-05-23
        • 2010-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-22
        相关资源
        最近更新 更多