标签: jpda

为什么Java的调试热插拔仅限于方法内更改?

我已经通过热部署教程,它的工作原理.但我对这些限制有疑问(第3点)即

热部署仅支持方法实现中的代码更改.如果添加新类或新方法,仍需要重新启动.

基本上,如果我在现有方法中进行更改,但在添加方法或类的情况下需要,我们不需要重新启动服务器.

我理解它是如何工作的: -当我在现有方法中进行更改或引入新方法时,Eclipse会将文件放在webserver下的正确位置.如果类已经由perm gen空间中的类加载器加载,它将从permgen空间卸载它并在内部加载新的,而不重新启动服务器,以便反映新的更改(字节代码).那是对的吗 ?

如果是,为什么热部署不适用于新方法和新类文件?

java debugging hotdeploy jpda

22
推荐指数
1
解决办法
2860
查看次数

在Docker容器中调试Tomcat

我有一个在Vagrant中运行的CoreOS.Vagrant专用网IP为192.168.111.1.CoreOS内部是一个Tomcat 8.0.32的docker容器.几乎一切正常(应用程序部署等)只是调试没有.Tomcat映射到8080端口,JPDA端口应为8000.

事实

Tomcat JPDA配置有:

JDPA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
Run Code Online (Sandbox Code Playgroud)

它从catalina.sh jpda start命令开始.运行它时控制台中的输出docker-compose是:

tomcat | Listening for transport dt_socket at address: 8000
Run Code Online (Sandbox Code Playgroud)

从容器信息我假设端口按它们应该映射:

CONTAINER ID        IMAGE       COMMAND      CREATED             STATUS              PORTS                                            NAMES
dcae1e0148f8        tomcat      "/run.sh"    8 minutes ago       Up 8 minutes        0.0.0.0:8000->8000/tcp, 0.0.0.0:8080->8080/tcp   tomcat
Run Code Online (Sandbox Code Playgroud)

我的docker镜像基于这个Dockerfile.

问题

尝试运行远程调试配置时(下面的屏幕截图)我收到错误Error running Debug: Unable to open debugger port (192.168.111.1:8000): java.net.ConnectException "Connection refused".我已经尝试过改变各种配置但没有运气的一切.我错过了什么吗?

在此输入图像描述

debugging tomcat intellij-idea jpda

20
推荐指数
3
解决办法
2万
查看次数

如何为mvn tomcat插件(jpda)设置agentlib属性

eclipse调试远程web应用程序相关 => 如何在我的eclipse中调试远程应用程序

如何在mvn tomcat插件中设置/存档? http://tomcat.apache.org/maven-plugin-2.0-SNAPSHOT/tomcat7-maven-plugin/

唯一可能有用的是设置systemProperty,但这对我不起作用; /

目标:让tomcat通过maven在控制台上运行,但为不同的IDE启用远程调试

(是的,我们可以在Eclipse WTP中运行tomcat!这不是问题;)

remote-debugging jpda maven-tomcat-plugin

13
推荐指数
2
解决办法
1万
查看次数

如何使用Play调试测试!2.0

我正在使用Play 2设置一个项目,我已经能够使用eclipse远程调试来调试webapp.虽然,我也想在我的测试中使用断点.有谁知道设置单元如何测试远程调试?

eclipse junit jpda playframework playframework-2.0

9
推荐指数
1
解决办法
4907
查看次数

Tomcat启动忽略调试的jpda选项

我试图在调试模式下运行Tomcat 7.如果我输入./catalina.sh jpda starttomcat,就好像jpda选项不在那里并且输出:

Michaels-MacBook-Pro:bin clairewilgar$ ./catalina.sh jpda start
Using CATALINA_BASE:   /Users/clairewilgar/Downloads/apache-tomcat-7.0.42-MIS
Using CATALINA_HOME:   /Users/clairewilgar/Downloads/apache-tomcat-7.0.42-MIS
Using CATALINA_TMPDIR: /Users/clairewilgar/Downloads/apache-tomcat-7.0.42-MIS/temp
Using JRE_HOME:        /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Using CLASSPATH:       /Users/clairewilgar/Downloads/apache-tomcat-7.0.42-MIS/bin/bootstrap.jar:/Users/clairewilgar/Downloads/apache-tomcat-7.0.42-MIS/bin/tomcat-juli.jar
Run Code Online (Sandbox Code Playgroud)

并且不会更改我的CATALINA_OPTS或任何其他内容.如果我尝试通过Eclipse连接,我会收到错误

"启动工作流程"遇到了问题.无法连接到远程VM.拒绝连接.

我已经尝试将端口更改为jpda端口到8001没有成功,我已经尝试在调用catalina.sh之前在终端中声明JPDA选项,但这没有任何区别.我的catalina.sh JPDA行如下:

if [ "$1" = "jpda" ] ; then
  if [ -z "$JPDA_TRANSPORT" ]; then
    JPDA_TRANSPORT="dt_socket"
  fi
  if [ -z "$JPDA_ADDRESS" ]; then
    JPDA_ADDRESS="8000"
  fi
  if [ -z "$JPDA_SUSPEND" ]; then
    JPDA_SUSPEND="n"
  fi
  if [ -z "$JPDA_OPTS" ]; then
    JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
  fi
  CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
  shift
fi
Run Code Online (Sandbox Code Playgroud)

还有其他原因导致JPDA无法运行吗?我正在使用OSX(Mountain Lion),如果有任何与我可能错过的相关的内容.提前致谢.

编辑:我的catalina.out文件运行./catalina.sh jpda …

java macos tomcat jpda

9
推荐指数
1
解决办法
2万
查看次数

您使用哪个Java调试器

我花了很多时间使用JPDA在Eclipse中调试应用程序.Eclipse调试器有一些问题让我非常恼火.任何人都可以推荐插件,更好的调试器或者我不知道的技巧吗?

  • 在"变量"(Variables)选项卡中,您可以键入并执行Java代码位.但是,您首先需要点击某些内容(我通常会点击"this")给它一些上下文.然后,在输入冗长的Java表达式来调试某些内容并"执行"它之后,您的表达式将被替换为结果,因此您需要重新键入它.有没有更好的方法,比如控制台或我缺少的东西?
  • 当你在浏览数据结构时,调试器中的表示还有很多不足之处.你会看到Lists,Maps,StringBuilders等的内部表示.我想看到的是这些对象在概念上包含的内容.有没有办法做到这一点,可能使用其他调试器,或扩展或什么?
  • 抛出异常时,是否有某种方法可以检查抛出异常的应用程序的状态?目前我需要在Exception发生之前设置断点,然后尝试重现它.
  • 当我踩到一条带有许多语句的行时,我实际上无法看到哪些语句正在被执行,除非"踩到"每个语句以查看它在哪里.
  • 如果没有找到源代码,Eclipse只会茫然地盯着你看.你得到一个有用的屏幕,说"找不到类文件编辑器/源代码"这是完全没用的.我更喜欢能够逐步执行字节码,所以我至少可以看到发生了什么.有没有人知道Java调试器比Eclipse更好?

java eclipse debugging jpda

7
推荐指数
1
解决办法
1541
查看次数

如何在调试模式下运行Apache Tomcat 8?

我正在尝试在调试模式下运行Apache Tomcat 8.0.21。

当我发出命令时

sh catalina.sh jpda start
Run Code Online (Sandbox Code Playgroud)

它给出了这个错误。

错误信息

错误:无法两次加载此JVM TI代理,请检查Java命令行中是否有重复的jdwp选项。VM代理库初始化期间发生错误,无法初始化:jdwp

有人可以帮忙吗?

jvm remote-debugging jpda jdwp tomcat8

7
推荐指数
3
解决办法
1万
查看次数

java debugging - 观察超出范围的变量

在调试C/C++应用程序时,我可以创建一个转换为指针类型的地址的监视,然后查看结构的内容,即使它超出范围.是否有可能在Java中实现类似的东西?
假设我在一个方法中,我添加了一个像"&this"这样的东西然后当我离开类方法时,我仍然可以看到它的内容,即使它超出了范围?

我很确定我的问题的答案是"不",所以我最感兴趣的是"为什么不呢?" 说明.这是JVM的限制吗?JPDA限制?有没有更好的地方提出这样一个专门的问题?

java debugging jvm jpda

6
推荐指数
1
解决办法
712
查看次数

Java中Heisenbugs的可能和不太可能的原因?

我有一个经典的Heisenbug例子是由我以前从未见过的情况引发的.我的遗留应用程序(大约100K旧代码)无法在特定实例中正常工作,仅仅启用JPDA进行远程调试就足以改变行为,导致应用程序正常工作:除了添加"-Xdebug -Xnoagent -Xrunjdwp之外什么都不做: transport = dt_socket,server = y,suspend = n,address = 6666"到vm的命令行隐藏了bug(有或没有实际连接).鉴于我有一个完全可重复的测试用例,我讨厌在代码更改的情况下对其进行干扰,以防它重新隐藏.当然,这只发生在生产中.

通常,我会立即假设一个线程问题,但是a)行为是100%失败与100%工作,b)在相关代码路径中没有明确使用线程.然后我们的团队试图找出这种行为的其他原因列表,所以我想也许Stack Overflow的团队思想可能会增加更多.

Java中的Heisenbugs:

  • 线程:错误的同步,竞争条件,隐式排序假设.
  • 显式调试/日志记录代码:代码路径中的更改导致/防止出现问题.不太常见的是,日志级别的更改可能导致时序更改(再次线程化)和I/O资源使用的差异.
  • 本机代码库可以拖入非Java Heisenbug问题.
  • 期待终结者以可预测的方式运行.
  • 关于弱引用的不恰当假设.
  • 假设固定大小的缓存永远不会填充.
  • 期待哈希码的唯一性.
  • 假设==适用于字符串(或者不适用于可能在某些情况下被中断的字符串).
  • VM bug(不,那从未发生过;).
  • 测试方法错误.特别是当存在依赖于测试成功的隐藏变量时.(这看起来是我们的实际问题.一次测试的成功导致客户运行下一次测试,由于策略问题而失败.失败导致根据策略在调试模式下运行,这导致成功.叹气)

还有其他值得探索的案例吗

编辑:

  • 是的,JPDA启用代码使用旧语法.我没有测试过使用现代语法是否也会改变行为.
  • 这台特定的机器使用1.8.0_45-b14作为JRE,HotSpot 64位服务器VM(版本25.45-b02)
  • 虽然问题是一般的,但鼓动的​​问题是真实的和最新的.由于这个问题在已部署的系统中出现,我想要让它与-Xdebug一起运行作为一种解决方法,以便它保持运行并希望跟踪底层错误并将其杀死.
  • 有问题的故障程序是多步骤数据处理管道的一部分 - 细节无关紧要,但可以最好地理解为从数据库获取一些信息然后用它来修改某些文件的独立应用程序.系统中破坏的部分似乎是来自数据库的信息没有被正确解释 - 来自破坏的对象ORM或缓存的任何东西.当它"被破坏"时,确定它是否有工作要做的应用程序逻辑(基于db的内容)对所有迭代(数千次迭代,包括程序的多次调用)做出错误的选择.当它"工作"时(唯一的区别是vm与-Xdebug一起运行),应用程序为所有迭代做出正确的选择.它在此配置中完全一致.针对不同数据库运行的相同代码不会失败.有一些证据(在我参与此代码之前)已经看到类似的行为,在看似微小的代码变化之后神秘地开始工作......参见"Heisenbug"

java debugging jpda

5
推荐指数
1
解决办法
510
查看次数

JPDA MethodEntryEvent导致应用运行非常慢

我正在尝试捕获在任何android应用程序中进行的所有方法调用。为此,我正在使用JDI为该应用程序的每个运行线程注册MethodEntryRequest。我可以成功完成此操作,但是我遇到的问题是该应用程序变得非常非常慢。所以我想知道我在实现中是否做错了什么。我将代码添加到我首先注册ClassPreparedRequest的地方,以捕获应用程序进程对每个类的加载,并在其中将MethodEntryRequest与threadfilter注册到导致该类加载的线程。

 if(!traceMap.keySet().contains(event.thread()))
    {
        EventRequestManager mgr = vm.eventRequestManager();
        MethodEntryRequest menr = mgr.createMethodEntryRequest();
        menr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
        menr.addThreadFilter(event.thread());
        menr.enable();
    }
Run Code Online (Sandbox Code Playgroud)

用于注册ClassPreparedRequest的代码为

    ClassPrepareRequest cpr = mgr.createClassPrepareRequest();        
    cpr.addClassFilter("com.example.*");
    cpr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
    cpr.enable();  
Run Code Online (Sandbox Code Playgroud)

java debugging android jdi jpda

5
推荐指数
0
解决办法
131
查看次数