将多个调试器连接到一个被调试器(Java、JPDA)

将多个调试器连接到一个被调试器(Java、JPDA),java,eclipse,debugging,Java,Eclipse,Debugging,我一直试图将两个客户端调试器连接到 JPDA上下文中的调试对象程序。这是可能的还是可能的 有没有解决办法让它发生 我正在使用eclipse作为IDE(编辑输入错误)。 将服务器程序视为Hello World 打印出: System.out.println("I have the String"); //1 System.out.println("You will have to pass through the breakpoints before you shall see"); System

我一直试图将两个客户端调试器连接到 JPDA上下文中的调试对象程序。这是可能的还是可能的 有没有解决办法让它发生

我正在使用eclipse作为IDE(编辑输入错误)。 将服务器程序视为Hello World 打印出:

System.out.println("I have the String"); //1
System.out.println("You will have to pass through the breakpoints before you shall see");
System.out.println("breakpoints");
System.out.println("before you shall see"); //4
我们可以在第1行和第4行设置断点

步骤1: 在运行配置中传递给程序的参数:

-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y
server=y
告诉vm要像服务器一样运行,
suspend=y
意味着程序执行将被暂停,直到调试器锁定为止) 然后运行程序

步骤2:转到调试组件、调试配置、远程Java应用程序和 创建新实例:

Project: Same as before
Connection type: Socket Attach(Socket Attach)
Host:LocalHost
Port:8000
现在,当我调试Prog时,执行会在指定的断点处停止。 我不能做的是创建这个远程调试器的另一个实例 如果我可以锁定到服务器(prog 1),那么当我这样做时,连接被拒绝。如果有人遇到过这个问题,请告诉我 如果存在解决方法。 谢谢


感谢

AFAIK,在任何给定时间,都只能有一个调试器实例连接到java程序。在调试中启动程序后,Eclipse将连接到已调试程序,阻止所有其他连接尝试。如果要远程连接,可以不在调试模式下运行程序并添加参数: -Xdebug-Xrunjdwp:transport=dt_套接字,地址=8000,服务器=y,挂起=y
手动创建java参数,然后您应该能够连接到另一个调试器。

我不知道2010年的情况如何,但在2014年这是可行的。我正在同时调试一个小程序和一个servlet,尽管它们使用不同的JVM,但要做到这一点,只需在eclipse中启动远程调试过程,就像socket Listen一样,启动第一个java应用程序操作:

-Xdebug-Xrunjdwp:transport=dt_套接字,地址=127.0.0.1:8787,挂起=y

然后启动相同的eclipse远程调试进程,并使用相同的选项启动另一个java进程,您应该会看到这些进程如下所示:


您可以看到两个不同的JVM在同一个端口中侦听(不管“applet”进程的名称)

如果它是可行的(我真的认为不是),那么它就没有多大意义,除非一个调试器充当主调试器,而其他调试器只是跟随它查看进程在断点处是如何停止的,捕获异常等(至少我想不出一个好的用法,但我有兴趣了解更多)fwiw,拥有独立的视图,如您所描述的,对我来说似乎很有用。在使用jdb进行调试时,打开几个单独的jdb窗口会非常好,一个用于控制,一个用于观察一些变量,一个用于观察堆栈跟踪,这将允许命令行调试与Eclipse在多个窗口中所做的更为相似。核心思想是允许调试同一服务器进程中的互斥线程,手动尝试以获得拒绝的连接。是否有一个现有的协议,允许在一个为另一个请求提供服务的现有端口收到请求时侦听新端口?(编辑标点符号)谢谢你们的评论,Yuval和Fredrick。我还看到了:它讨论了开发一个TransportService来支持到单个侦听器地址的多个并发连接。现在另一个问题是有人这样做或试图这样做吗?@javaresearch在接受连接后继续监听端口不是问题。这里的问题是,这会使整个调试过程变得非常不直观。有点像驾驶一辆有三名乘客的汽车,每个座位前面都有一套方向盘和踏板。在任何给定的时间里,只有一个人能够控制局面,否则事情就会变得非常糟糕。我想如果你能解释一下你为什么要这么做,那就更有意义了。也许有更好的方法来做你想做的事。(编辑:现在在你的顶部评论中看到“核心想法”,但为什么有两个调试器?@Fredrik,想想云。独立的线程,相互排斥,属于服务器进程中划分的独立实体,但是每个实体都想调试自己的线程,尽管本质上它不知道调试的是什么,但调试只是一个子集,希望这能提供更多信息。我很想知道是否有更好的方法存在。@javaresearch我每周几乎每天都在考虑云,但您想要使用的调试器甚至不在这张图片中。在这样的环境中,在断点上停止VM不是一个选项。我不确定是否正确理解您的意思,但您似乎将调试器(Eclipse)连接到了多个JVM。问题是如何将多个调试器连接到同一个JVM。