- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
大家好,
我今天在远程调试新服务器时遇到了问题,最初看起来好像 Eclipse 需要很长时间才能连接到远程 JVM。然而,经过一番调查后,我意识到 jdb
也有类似的问题。一些挖掘发现了这个......
连接到远程 JVM 不是问题。两个调试器都在几秒钟内正确建立了套接字连接。 jdb
甚至处理命令。但是,在远程调试器成功连接到它之后,Sun Java 1.7.0_60-b19 JVM
在发送其线程调试信息 (JVMTI/JDWP) 时似乎挂起(或传输速度极慢)通过 TCPIP 的网络。
列出远程 JVM 的线程似乎是问题所在。 JDB 的 threads
命令要么挂起,要么执行得极其缓慢。远程 JVM 上的负载是合理的,并且没有设置任何断点。这个 JVM 上有很多线程并发执行(~2005 个线程),可能会有一些 WAN 延迟,但仍然需要一种方法来成功地使用远程调试器!
观察。我猜这与 JVM 的 Java 调试线协议(protocol) (JDWP) 实现通过 TCPIP 的线程信息传输效率低下有关,因为机器是在 WAN 上地球的另一端。但是——Windows 远程桌面连接到同一台机器的速度和性能都可以接受。鉴于此,似乎必须等待 45 分钟让 Eclipse 或 JDB
列出 JVM 上的线程信息是 Not Acceptable ,并且可能是一个错误(或实现得非常糟糕的功能)。
可能与什么有关?
问题。有没有人有任何想法如何使线程数据传输更高效以便JVM可以有效地远程调试?这是 JVM 的 Java 调试有线协议(protocol) (JDWP) 中的错误吗?
Java 版本:
C:\Users\Administrator>"C:\Program Files\Java\jdk1.7.0_60\bin\java" -version
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
应用程序服务器。出现在 Weblogic 10g 中。 IBM WebSphere 8.5 也会发生这种情况
Eclipse。尝试使用线程信息填充调试 View 时,Eclipse 远程调试无限期挂起。
JDB - 远程。当使用 thread
命令列出线程时,Java 的 jdb
远程调试器挂起超过 10 分钟。然后它会非常缓慢地列出它们(每秒 1 个线程,需要 33 分钟才能全部列出)。
"C:\Program Files\Java\jdk1.7.0_60\bin\jdb.exe -connect com.sun.jdi.SocketAttach:hostname=xxx.yyy.com,port=7777
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
> threads
Group system: <<jdb hangs here trying to get thread information>>
JDB - 本地。Java 的jdb
远程调试器在JVM 的本地计算机上运行时,可在3 秒内执行threads
命令。
"C:\Program Files\Java\jdk1.7.0_60\bin\jdb.exe -connect com.sun.jdi.SocketAttach:hostname=xxx.yyy.com,port=7777
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
> threads
Group system:
> threads
Group system:
(java.lang.ref.Reference$ReferenceHandler)0x7484 Reference Handler
(java.lang.ref.Finalizer$FinalizerThread)0x7485 Finalizer
(java.lang.Thread)0x7486 ...
GC Daemon
(java.lang.Thread)0x748b RMI RenewClean-
...
>
最佳答案
经过一些调查和数据包嗅探,似乎远程进程中有大量线程会导致调试数据包拥塞以及远程进程调试代理和远程调试器之间的处理延迟反馈循环。基本上,JVM 调试代理不是为高延迟连接或远程调试大量线程而设计的。它也不会尝试压缩线程/堆栈/变量更新信息以缩短到调试器的传输时间。
我们的解决方案最终是在我们的产品中添加线程 Debug模式,以减少各种服务器线程池的大小,然后跨海外网络的调试突然又变得可以接受了。
future 对 Java 社区的建议是向 Eclipse 和 Java 调试代理添加线程过滤器功能,以便在每个代码步骤发出信号后,只有感兴趣的线程信息才会传输到调试器。
关于Java 的 JDB(和 Eclipse)在连接到具有许多线程的远程 JVM 时挂起(即通过 TCPIP 传输线程调试信息),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31278716/
发生错误时,我的 java 代码中抛出了异常。然后我使用 jdb 运行代码,以便在发生异常时,我可以看到代码所在的状态并进行调试。对于我抛出的所有异常,我输入了一个有用的字符串消息。但是,当 jdb
我在测试中被问到这个问题,我不确定答案是什么,而且我在此处和其他在线地方都找不到答案。所以我希望这里有人能给我一个快速的答案和快速的解释: You debug a Java program using
我正在调试一些使用 Map 的代码,但我很难找到与各种 Integer 相关的值!这是一个最小的工作示例: java代码(保存到.\src): import java.util.Map; import
我已将应用程序附加到 jdb 调试器。我试图通过 jdb 调试器了解全局/类变量的状态。 Class MyClass() { private static String myString;
作为一个倾向于 CLI 的程序员,我想问一下 Java 命令行调试器 JDB 是否能够从当前位置运行并在给定行停止? 例如, 200 public Trade create(TradeCreate
我正在尝试使用 jdb 调试我的应用程序。到目前为止我已经获得了很多东西,但我想打磨它们。 当我在 jdb 中并且想要插入断点或检查变量时,jdb 需要全名 package.class.(method
我正在学习 JDB 并遇到了一些悖论。启动 JDB(使用“jdb ClassName”)后,大多数教程会告诉我输入 > methods ClassName 查看可用方法列表,以便我可以设置断点。如果我
所以,我正在启动一个 Java 程序,如下所示 java -agentlib:jdwp=transport=dt_socket,address=8000, server=y,suspend=n My
我想使用 jdb,我已经尝试运行它几个小时了,我已经搜索了所有示例。我认为这是一个语法问题。我正在尝试像这样运行它: >jdb Main Initializing jdb ... >run Set u
我使用 jdb 进行 Java 开发。对于我的应用程序,我有两个类:WordUniverseTest 和 WordUniverse,主要方法包含在 WordUniverseTest 中。当我在 jdb
我有以下代码: void func() { try { f1() } finally() { if (resource != null) resou
我正在使用 jdb 调试器,它的问题是在每次捕获到异常时都会停止,尽管我没有执行任何 catch .... 语句。在类加载期间有数百个: Exception occurred: java.io.Fil
我需要将 jdb 调试 session 附加到正在远程主机上执行的 java 应用程序,但我无法执行此操作。我在 Linux 上工作,使用 openjdk 1.8.0_65、64 位服务器虚拟机。 我
我用来执行 Java 代码的命令是: java -cp /usr/local/share/java/dbus.jar:/usr/local/share/java/unix.jar:/usr/local
官方文档说明了如何在源代码行或类方法上设置单独的断点: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/solaris/jdb.html 但我很感兴
package com.android.internal.telephony.dataconnection; public abstract class DcTrackerBase extends H
我正在运行 crawler4j输出到目录/frontier/。该目录下的文件是 00000000.jdb je.info.0 je.info.lck je.lck .jdb 文件是唯一包含数据的文件,
使用 jsadebugd 或 jdb 可以调试已经运行的 JVM,无需任何参数即可启动。我不明白怎么可能,因为我认为,JVM 通过 JIT 将字节码编译为 native 代码,并且无法调试。 谁能解释
你好。 我正在使用 lwjgl 和 vim 编写游戏,我正在尝试使用 jdb 进行调试,但我遇到了一些问题。 首先,我向您展示了我的项目树。 (主要类是Engine.java)。 . ├── buil
当我在 bash 中运行 jdb 时,箭头键会产生奇怪的垃圾: up: ^[[A down: ^[[B left: ^[[D right: ^[[C 所以我不能使用命令历史记录,也不能更正拼写错误,因
我是一名优秀的程序员,十分优秀!